diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 5ba4d87f79..0af284534a 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -1145,3 +1145,7 @@ let mkValField mVal mRhs mut access ident (typ: SynType) xmlDoc rangeStart attri SynField(attribs, isStatic, Some ident, typ, mut, xmlDoc, access, mRhs, { LeadingKeyword = Some leadingKeyword }) SynMemberDefn.ValField(fld, mValDecl) + +let mkSynField parseState idOpt t isMutable vis attributes isStatic mWhole leadingKeyword = + let xmlDoc = grabXmlDocAtRangeStart (parseState, attributes, mWhole) + SynField(attributes, isStatic, idOpt, t, isMutable, xmlDoc, vis, mWhole, { LeadingKeyword = leadingKeyword }) diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fsi b/src/Compiler/SyntaxTree/ParseHelpers.fsi index 5bcff5f26f..1ec98ddabb 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fsi +++ b/src/Compiler/SyntaxTree/ParseHelpers.fsi @@ -274,3 +274,15 @@ val mkValField: SynAttributes -> range option -> SynMemberDefn + +val mkSynField: + parseState: IParseState -> + idOpt: Ident option -> + t: SynType -> + isMutable: bool -> + vis: SynAccess option -> + attributes: SynAttributeList list -> + isStatic: bool -> + mWhole: range -> + leadingKeyword: SynLeadingKeyword option -> + SynField diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index ce2727e7a8..46436e5c71 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -2791,9 +2791,14 @@ recdFieldDecl: /* Part of a field or val declaration in a record type or object type */ fieldDecl: | opt_mutable opt_access ident COLON typ - { fun attrs stat mWhole leadingKeyword -> - let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, mWhole) - SynField(attrs, stat, Some $3, $5, $1, xmlDoc, $2, mWhole, { LeadingKeyword = leadingKeyword }) } + { mkSynField parseState (Some $3) $5 $1 $2 } + | opt_mutable opt_access ident COLON recover + { let mColon = rhs parseState 4 + let t = SynType.FromParseError(mColon.EndRange) + mkSynField parseState (Some $3) t $1 $2 } + | opt_mutable opt_access ident recover + { let t = SynType.FromParseError($3.idRange.EndRange) + mkSynField parseState (Some $3) t $1 $2 } /* An exception definition */ exconDefn: diff --git a/tests/service/data/SyntaxTree/Type/Record 01.fs b/tests/service/data/SyntaxTree/Type/Record 01.fs new file mode 100644 index 0000000000..417a279046 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 01.fs @@ -0,0 +1,9 @@ +module Foo + +type AU = + { + Invest: int + T + } + +let meh = () diff --git a/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl new file mode 100644 index 0000000000..91d5f58ca5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 01.fs.bsl @@ -0,0 +1,45 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Record 01.fs", false, QualifiedNameOfFile Foo, [], [], + [SynModuleOrNamespace + ([Foo], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [AU], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,7)), + Simple + (Record + (None, + [SynField + ([], false, Some Invest, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,19), { LeadingKeyword = None }); + SynField + ([], false, Some T, FromParseError (6,9--6,9), false, + PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,8--7,5), { LeadingKeyword = None })], + (4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--7,5)); + Let + (false, + [SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (None, SynValInfo ([], SynArgInfo ([], false, None)), None), + Named (SynIdent (meh, None), false, None, (9,4--9,7)), None, + Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12), + { LeadingKeyword = Let (9,0--9,3) + InlineKeyword = None + EqualsRange = Some (9,8--9,9) })], (9,0--9,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration. Expected ':' or other token. diff --git a/tests/service/data/SyntaxTree/Type/Record 02.fs b/tests/service/data/SyntaxTree/Type/Record 02.fs new file mode 100644 index 0000000000..d42ab66e1f --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 02.fs @@ -0,0 +1,9 @@ +module Foo + +type AU = + { + Invest: int + T : + } + +let meh = () diff --git a/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl new file mode 100644 index 0000000000..3ebdfe18ae --- /dev/null +++ b/tests/service/data/SyntaxTree/Type/Record 02.fs.bsl @@ -0,0 +1,46 @@ +ImplFile + (ParsedImplFileInput + ("/root/Type/Record 02.fs", false, QualifiedNameOfFile Foo, [], [], + [SynModuleOrNamespace + ([Foo], false, NamedModule, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [AU], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,7)), + Simple + (Record + (None, + [SynField + ([], false, Some Invest, + LongIdent (SynLongIdent ([int], [], [None])), false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (5,8--5,19), { LeadingKeyword = None }); + SynField + ([], false, Some T, FromParseError (6,11--6,11), + false, + PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector), + None, (6,8--7,5), { LeadingKeyword = None })], + (4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,8--3,9) + WithKeyword = None })], (3,0--7,5)); + Let + (false, + [SynBinding + (None, Normal, false, false, [], + PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector), + SynValData + (None, SynValInfo ([], SynArgInfo ([], false, None)), None), + Named (SynIdent (meh, None), false, None, (9,4--9,7)), None, + Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12), + { LeadingKeyword = Let (9,0--9,3) + InlineKeyword = None + EqualsRange = Some (9,8--9,9) })], (9,0--9,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration