Skip to content

Commit 02b9e83

Browse files
authored
Add recovery rules for SynField. (#15475)
1 parent ae5e5fd commit 02b9e83

File tree

7 files changed

+133
-3
lines changed

7 files changed

+133
-3
lines changed

src/Compiler/SyntaxTree/ParseHelpers.fs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,3 +1145,7 @@ let mkValField mVal mRhs mut access ident (typ: SynType) xmlDoc rangeStart attri
11451145
SynField(attribs, isStatic, Some ident, typ, mut, xmlDoc, access, mRhs, { LeadingKeyword = Some leadingKeyword })
11461146

11471147
SynMemberDefn.ValField(fld, mValDecl)
1148+
1149+
let mkSynField parseState idOpt t isMutable vis attributes isStatic mWhole leadingKeyword =
1150+
let xmlDoc = grabXmlDocAtRangeStart (parseState, attributes, mWhole)
1151+
SynField(attributes, isStatic, idOpt, t, isMutable, xmlDoc, vis, mWhole, { LeadingKeyword = leadingKeyword })

src/Compiler/SyntaxTree/ParseHelpers.fsi

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,15 @@ val mkValField:
274274
SynAttributes ->
275275
range option ->
276276
SynMemberDefn
277+
278+
val mkSynField:
279+
parseState: IParseState ->
280+
idOpt: Ident option ->
281+
t: SynType ->
282+
isMutable: bool ->
283+
vis: SynAccess option ->
284+
attributes: SynAttributeList list ->
285+
isStatic: bool ->
286+
mWhole: range ->
287+
leadingKeyword: SynLeadingKeyword option ->
288+
SynField

src/Compiler/pars.fsy

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,9 +2791,14 @@ recdFieldDecl:
27912791
/* Part of a field or val declaration in a record type or object type */
27922792
fieldDecl:
27932793
| opt_mutable opt_access ident COLON typ
2794-
{ fun attrs stat mWhole leadingKeyword ->
2795-
let xmlDoc = grabXmlDocAtRangeStart(parseState, attrs, mWhole)
2796-
SynField(attrs, stat, Some $3, $5, $1, xmlDoc, $2, mWhole, { LeadingKeyword = leadingKeyword }) }
2794+
{ mkSynField parseState (Some $3) $5 $1 $2 }
2795+
| opt_mutable opt_access ident COLON recover
2796+
{ let mColon = rhs parseState 4
2797+
let t = SynType.FromParseError(mColon.EndRange)
2798+
mkSynField parseState (Some $3) t $1 $2 }
2799+
| opt_mutable opt_access ident recover
2800+
{ let t = SynType.FromParseError($3.idRange.EndRange)
2801+
mkSynField parseState (Some $3) t $1 $2 }
27972802

27982803
/* An exception definition */
27992804
exconDefn:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Foo
2+
3+
type AU =
4+
{
5+
Invest: int
6+
T
7+
}
8+
9+
let meh = ()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Record 01.fs", false, QualifiedNameOfFile Foo, [], [],
4+
[SynModuleOrNamespace
5+
([Foo], false, NamedModule,
6+
[Types
7+
([SynTypeDefn
8+
(SynComponentInfo
9+
([], None, [], [AU],
10+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
11+
false, None, (3,5--3,7)),
12+
Simple
13+
(Record
14+
(None,
15+
[SynField
16+
([], false, Some Invest,
17+
LongIdent (SynLongIdent ([int], [], [None])), false,
18+
PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector),
19+
None, (5,8--5,19), { LeadingKeyword = None });
20+
SynField
21+
([], false, Some T, FromParseError (6,9--6,9), false,
22+
PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, (6,8--7,5), { LeadingKeyword = None })],
24+
(4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5),
25+
{ LeadingKeyword = Type (3,0--3,4)
26+
EqualsRange = Some (3,8--3,9)
27+
WithKeyword = None })], (3,0--7,5));
28+
Let
29+
(false,
30+
[SynBinding
31+
(None, Normal, false, false, [],
32+
PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector),
33+
SynValData
34+
(None, SynValInfo ([], SynArgInfo ([], false, None)), None),
35+
Named (SynIdent (meh, None), false, None, (9,4--9,7)), None,
36+
Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12),
37+
{ LeadingKeyword = Let (9,0--9,3)
38+
InlineKeyword = None
39+
EqualsRange = Some (9,8--9,9) })], (9,0--9,12))],
40+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
41+
(1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
42+
{ ConditionalDirectives = []
43+
CodeComments = [] }, set []))
44+
45+
(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration. Expected ':' or other token.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Foo
2+
3+
type AU =
4+
{
5+
Invest: int
6+
T :
7+
}
8+
9+
let meh = ()
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Record 02.fs", false, QualifiedNameOfFile Foo, [], [],
4+
[SynModuleOrNamespace
5+
([Foo], false, NamedModule,
6+
[Types
7+
([SynTypeDefn
8+
(SynComponentInfo
9+
([], None, [], [AU],
10+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
11+
false, None, (3,5--3,7)),
12+
Simple
13+
(Record
14+
(None,
15+
[SynField
16+
([], false, Some Invest,
17+
LongIdent (SynLongIdent ([int], [], [None])), false,
18+
PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector),
19+
None, (5,8--5,19), { LeadingKeyword = None });
20+
SynField
21+
([], false, Some T, FromParseError (6,11--6,11),
22+
false,
23+
PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector),
24+
None, (6,8--7,5), { LeadingKeyword = None })],
25+
(4,4--7,5)), (4,4--7,5)), [], None, (3,5--7,5),
26+
{ LeadingKeyword = Type (3,0--3,4)
27+
EqualsRange = Some (3,8--3,9)
28+
WithKeyword = None })], (3,0--7,5));
29+
Let
30+
(false,
31+
[SynBinding
32+
(None, Normal, false, false, [],
33+
PreXmlDoc ((9,0), FSharp.Compiler.Xml.XmlDocCollector),
34+
SynValData
35+
(None, SynValInfo ([], SynArgInfo ([], false, None)), None),
36+
Named (SynIdent (meh, None), false, None, (9,4--9,7)), None,
37+
Const (Unit, (9,10--9,12)), (9,4--9,7), Yes (9,0--9,12),
38+
{ LeadingKeyword = Let (9,0--9,3)
39+
InlineKeyword = None
40+
EqualsRange = Some (9,8--9,9) })], (9,0--9,12))],
41+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
42+
(1,0--9,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
43+
{ ConditionalDirectives = []
44+
CodeComments = [] }, set []))
45+
46+
(7,4)-(7,5) parse error Unexpected symbol '}' in field declaration

0 commit comments

Comments
 (0)