Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Compiler/SyntaxTree/ParseHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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 })
12 changes: 12 additions & 0 deletions src/Compiler/SyntaxTree/ParseHelpers.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -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
11 changes: 8 additions & 3 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
9 changes: 9 additions & 0 deletions tests/service/data/SyntaxTree/Type/Record 01.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Foo

type AU =
{
Invest: int
T
}

let meh = ()
45 changes: 45 additions & 0 deletions tests/service/data/SyntaxTree/Type/Record 01.fs.bsl
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 9 additions & 0 deletions tests/service/data/SyntaxTree/Type/Record 02.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Foo

type AU =
{
Invest: int
T :
}

let meh = ()
46 changes: 46 additions & 0 deletions tests/service/data/SyntaxTree/Type/Record 02.fs.bsl
Original file line number Diff line number Diff line change
@@ -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