@@ -1499,16 +1499,24 @@ memberFlags:
14991499 | STATIC MEMBER
15001500 { let mStatic = rhs parseState 1
15011501 let mMember = rhs parseState 2
1502- StaticMemberFlags, (SynLeadingKeyword.StaticMember(mStatic, mMember)) }
1502+ StaticMemberFlags, SynLeadingKeyword.StaticMember(mStatic, mMember) }
1503+
1504+ | STATIC
1505+ { let mStatic = rhs parseState 1
1506+ // todo: it should be possible to make it work better for both `abstract` and `member` in the type checker
1507+ StaticMemberFlags, SynLeadingKeyword.Static(mStatic) }
1508+
15031509 | MEMBER
15041510 { let mMember = rhs parseState 1
1505- NonVirtualMemberFlags, (SynLeadingKeyword.Member mMember) }
1511+ NonVirtualMemberFlags, SynLeadingKeyword.Member mMember }
1512+
15061513 | OVERRIDE
15071514 { let mOverride = rhs parseState 1
1508- OverrideMemberFlags, (SynLeadingKeyword.Override mOverride) }
1515+ OverrideMemberFlags, SynLeadingKeyword.Override mOverride }
1516+
15091517 | DEFAULT
15101518 { let mDefault = rhs parseState 1
1511- OverrideMemberFlags, ( SynLeadingKeyword.Default mDefault) }
1519+ OverrideMemberFlags, SynLeadingKeyword.Default mDefault }
15121520
15131521/* The name of a type in a signature or implementation, possibly with type parameters and constraints */
15141522typeNameInfo:
@@ -1783,6 +1791,45 @@ memberCore:
17831791 let memberRange = unionRanges rangeStart mRhs |> unionRangeWithXmlDoc xmlDoc
17841792 [ SynMemberDefn.Member(binding, memberRange) ]) }
17851793
1794+ | opt_inline bindingPattern opt_topReturnTypeWithTypeConstraints OBLOCKSEP
1795+ { let optReturnType = $3
1796+ let bindingPat, mBindLhs = $2
1797+ let mEnd =
1798+ match optReturnType with
1799+ | Some(_, ty) -> ty.Range.EndRange
1800+ | _ -> bindingPat.Range.EndRange
1801+ let expr = arbExpr ("memberCore1", mEnd)
1802+ errorR (Error(FSComp.SR.parsMissingMemberBody(), rhs parseState 4))
1803+
1804+ fun vis flagsBuilderAndLeadingKeyword attrs rangeStart ->
1805+ let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, rangeStart)
1806+ let memFlagsBuilder, leadingKeyword = flagsBuilderAndLeadingKeyword
1807+ let memberFlags = memFlagsBuilder SynMemberKind.Member
1808+ let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
1809+ let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = None }
1810+ let binding = mkSynBinding (xmlDoc, bindingPat) (vis, (Option.isSome $1), false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, optReturnType, expr, mEnd, [], attrs, Some memberFlags, trivia)
1811+ let memberRange = unionRanges rangeStart mEnd |> unionRangeWithXmlDoc xmlDoc
1812+ [ SynMemberDefn.Member (binding, memberRange) ] }
1813+
1814+ | opt_inline bindingPattern opt_topReturnTypeWithTypeConstraints recover
1815+ { let optReturnType = $3
1816+ let bindingPat, mBindLhs = $2
1817+ let mEnd =
1818+ match optReturnType with
1819+ | Some(_, ty) -> ty.Range.EndRange
1820+ | _ -> bindingPat.Range.EndRange
1821+ let expr = arbExpr ("memberCore2", mEnd)
1822+
1823+ fun vis flagsBuilderAndLeadingKeyword attrs rangeStart ->
1824+ let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, rangeStart)
1825+ let memFlagsBuilder, leadingKeyword = flagsBuilderAndLeadingKeyword
1826+ let memberFlags = memFlagsBuilder SynMemberKind.Member
1827+ let mWholeBindLhs = (mBindLhs, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
1828+ let trivia: SynBindingTrivia = { LeadingKeyword = leadingKeyword; InlineKeyword = $1; EqualsRange = None }
1829+ let binding = mkSynBinding (xmlDoc, bindingPat) (vis, (Option.isSome $1), false, mWholeBindLhs, DebugPointAtBinding.NoneAtInvisible, optReturnType, expr, mEnd, [], attrs, Some memberFlags, trivia)
1830+ let memberRange = unionRanges rangeStart mEnd |> unionRangeWithXmlDoc xmlDoc
1831+ [ SynMemberDefn.Member (binding, memberRange) ] }
1832+
17861833 /* Properties with explicit get/set, also indexer properties */
17871834 | opt_inline bindingPattern opt_topReturnTypeWithTypeConstraints classDefnMemberGetSet
17881835 { let mWith, (classDefnMemberGetSetElements, mAnd) = $4
@@ -1846,6 +1893,26 @@ classDefnMember:
18461893 let flags = $3
18471894 $4 $2 flags $1 rangeStart }
18481895
1896+ | opt_attributes opt_access memberFlags recover
1897+ { let rangeStart = rhs parseState 1
1898+ if Option.isSome $2 then
1899+ errorR (Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier (), rhs parseState 2))
1900+ let memFlagsBuilder, leadingKeyword = $3
1901+ let flags = Some(memFlagsBuilder SynMemberKind.Member)
1902+ let xmlDoc = grabXmlDocAtRangeStart (parseState, $1, rangeStart)
1903+ let trivia = { LeadingKeyword = leadingKeyword; InlineKeyword = None; EqualsRange = None }
1904+ let mMember = rhs parseState 3
1905+ let mEnd = mMember.EndRange
1906+ let bindingPat = patFromParseError (SynPat.Wild(mEnd))
1907+ let expr = arbExpr ("classDefnMember1", mEnd)
1908+ let mWhole = rhs2 parseState 1 3
1909+ let binding =
1910+ mkSynBinding
1911+ (xmlDoc, bindingPat)
1912+ ($2, (Option.isSome $2), false, mWhole, DebugPointAtBinding.NoneAtInvisible, None, expr, mEnd, [], $1, flags, trivia)
1913+
1914+ [SynMemberDefn.Member(binding, mWhole)] }
1915+
18491916 | opt_attributes opt_access interfaceMember appType opt_interfaceImplDefn
18501917 { if not (isNil $1) then errorR(Error(FSComp.SR.parsAttributesAreNotPermittedOnInterfaceImplementations(), rhs parseState 1))
18511918 if Option.isSome $2 then errorR(Error(FSComp.SR.parsInterfacesHaveSameVisibilityAsEnclosingType(), rhs parseState 3))
0 commit comments