Skip to content

Commit 7f791ed

Browse files
authored
Parser: recover on unfinished head pat in members (#15948)
* Parser: recover on unfinished self pat in members * More tests
1 parent 1d96bdf commit 7f791ed

37 files changed

+847
-135
lines changed

src/Compiler/pars.fsy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6583,8 +6583,9 @@ pathOp:
65836583
| ident DOT pathOp
65846584
{ prependIdentInLongIdentWithTrivia (SynIdent($1, None)) (rhs parseState 2) $3 }
65856585

6586-
| ident DOT error
6587-
{ (* silent recovery *) SynLongIdent([$1], [rhs parseState 2], [None]) }
6586+
| ident DOT ends_coming_soon_or_recover
6587+
{ if not $3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsIdentifierExpected())
6588+
SynLongIdent([$1], [rhs parseState 2], [None]) }
65886589

65896590

65906591
/* nameop is identOrOp not used as part of a path */
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module Module
2+
3+
{ new T() with
4+
override _.P1 = 1 }
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Expression/Object - Class 01.fs", false, QualifiedNameOfFile Module,
4+
[], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Expr
8+
(ObjExpr
9+
(LongIdent (SynLongIdent ([T], [], [None])),
10+
Some (Const (Unit, (3,7--3,9)), None), Some (3,10--3,14), [],
11+
[Member
12+
(SynBinding
13+
(None, Normal, false, false, [],
14+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
15+
SynValData
16+
(Some { IsInstance = true
17+
IsDispatchSlot = false
18+
IsOverrideOrExplicitImpl = true
19+
IsFinal = false
20+
GetterOrSetterIsCompilerGenerated = false
21+
MemberKind = Member },
22+
SynValInfo
23+
([[SynArgInfo ([], false, None)]; []],
24+
SynArgInfo ([], false, None)), None, None),
25+
LongIdent
26+
(SynLongIdent ([_; P1], [(4,14--4,15)], [None; None]),
27+
None, None, Pats [], None, (4,13--4,17)), None,
28+
Const (Int32 1, (4,20--4,21)), (4,13--4,17),
29+
NoneAtInvisible, { LeadingKeyword = Override (4,4--4,12)
30+
InlineKeyword = None
31+
EqualsRange = Some (4,18--4,19) }),
32+
(4,4--4,21))], [], (3,2--3,9), (3,0--4,23)), (3,0--4,23))],
33+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
34+
(1,0--4,23), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
35+
{ ConditionalDirectives = []
36+
CodeComments = [] }, set []))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Module
2+
3+
{ new T() with
4+
override _.P1 = 1
5+
6+
interface I with
7+
member _.P2 = 2 }
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Expression/Object - Class 02.fs", false, QualifiedNameOfFile Module,
4+
[], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Expr
8+
(ObjExpr
9+
(LongIdent (SynLongIdent ([T], [], [None])),
10+
Some (Const (Unit, (3,7--3,9)), None), Some (3,10--3,14), [],
11+
[Member
12+
(SynBinding
13+
(None, Normal, false, false, [],
14+
PreXmlDoc ((4,6), FSharp.Compiler.Xml.XmlDocCollector),
15+
SynValData
16+
(Some { IsInstance = true
17+
IsDispatchSlot = false
18+
IsOverrideOrExplicitImpl = true
19+
IsFinal = false
20+
GetterOrSetterIsCompilerGenerated = false
21+
MemberKind = Member },
22+
SynValInfo
23+
([[SynArgInfo ([], false, None)]; []],
24+
SynArgInfo ([], false, None)), None, None),
25+
LongIdent
26+
(SynLongIdent ([_; P1], [(4,16--4,17)], [None; None]),
27+
None, None, Pats [], None, (4,15--4,19)), None,
28+
Const (Int32 1, (4,22--4,23)), (4,15--4,19),
29+
NoneAtInvisible, { LeadingKeyword = Override (4,6--4,14)
30+
InlineKeyword = None
31+
EqualsRange = Some (4,20--4,21) }),
32+
(4,6--4,23))],
33+
[SynInterfaceImpl
34+
(LongIdent (SynLongIdent ([I], [], [None])),
35+
Some (6,14--6,18), [],
36+
[Member
37+
(SynBinding
38+
(None, Normal, false, false, [],
39+
PreXmlDoc ((7,6), FSharp.Compiler.Xml.XmlDocCollector),
40+
SynValData
41+
(Some { IsInstance = true
42+
IsDispatchSlot = false
43+
IsOverrideOrExplicitImpl = true
44+
IsFinal = false
45+
GetterOrSetterIsCompilerGenerated = false
46+
MemberKind = Member },
47+
SynValInfo
48+
([[SynArgInfo ([], false, None)]; []],
49+
SynArgInfo ([], false, None)), None, None),
50+
LongIdent
51+
(SynLongIdent
52+
([_; P2], [(7,14--7,15)], [None; None]), None,
53+
None, Pats [], None, (7,13--7,17)), None,
54+
Const (Int32 2, (7,20--7,21)), (7,13--7,17),
55+
NoneAtInvisible,
56+
{ LeadingKeyword = Member (7,6--7,12)
57+
InlineKeyword = None
58+
EqualsRange = Some (7,18--7,19) }), (7,6--7,21))],
59+
(6,2--7,21))], (3,2--3,9), (3,0--7,23)), (3,0--7,23))],
60+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
61+
(1,0--7,23), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
62+
{ ConditionalDirectives = []
63+
CodeComments = [] }, set []))
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module Module
2+
3+
{ new T() with
4+
override _.P1 = 1
5+
6+
interface I1 with
7+
member _.P2 = 2
8+
9+
interface I2 with
10+
member _.P3 = 3 }
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Expression/Object - Class 03.fs", false, QualifiedNameOfFile Module,
4+
[], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Expr
8+
(ObjExpr
9+
(LongIdent (SynLongIdent ([T], [], [None])),
10+
Some (Const (Unit, (3,7--3,9)), None), Some (3,10--3,14), [],
11+
[Member
12+
(SynBinding
13+
(None, Normal, false, false, [],
14+
PreXmlDoc ((4,6), FSharp.Compiler.Xml.XmlDocCollector),
15+
SynValData
16+
(Some { IsInstance = true
17+
IsDispatchSlot = false
18+
IsOverrideOrExplicitImpl = true
19+
IsFinal = false
20+
GetterOrSetterIsCompilerGenerated = false
21+
MemberKind = Member },
22+
SynValInfo
23+
([[SynArgInfo ([], false, None)]; []],
24+
SynArgInfo ([], false, None)), None, None),
25+
LongIdent
26+
(SynLongIdent ([_; P1], [(4,16--4,17)], [None; None]),
27+
None, None, Pats [], None, (4,15--4,19)), None,
28+
Const (Int32 1, (4,22--4,23)), (4,15--4,19),
29+
NoneAtInvisible, { LeadingKeyword = Override (4,6--4,14)
30+
InlineKeyword = None
31+
EqualsRange = Some (4,20--4,21) }),
32+
(4,6--4,23))],
33+
[SynInterfaceImpl
34+
(LongIdent (SynLongIdent ([I1], [], [None])),
35+
Some (6,15--6,19), [],
36+
[Member
37+
(SynBinding
38+
(None, Normal, false, false, [],
39+
PreXmlDoc ((7,6), FSharp.Compiler.Xml.XmlDocCollector),
40+
SynValData
41+
(Some { IsInstance = true
42+
IsDispatchSlot = false
43+
IsOverrideOrExplicitImpl = true
44+
IsFinal = false
45+
GetterOrSetterIsCompilerGenerated = false
46+
MemberKind = Member },
47+
SynValInfo
48+
([[SynArgInfo ([], false, None)]; []],
49+
SynArgInfo ([], false, None)), None, None),
50+
LongIdent
51+
(SynLongIdent
52+
([_; P2], [(7,14--7,15)], [None; None]), None,
53+
None, Pats [], None, (7,13--7,17)), None,
54+
Const (Int32 2, (7,20--7,21)), (7,13--7,17),
55+
NoneAtInvisible,
56+
{ LeadingKeyword = Member (7,6--7,12)
57+
InlineKeyword = None
58+
EqualsRange = Some (7,18--7,19) }), (7,6--7,21))],
59+
(6,2--7,21));
60+
SynInterfaceImpl
61+
(LongIdent (SynLongIdent ([I2], [], [None])),
62+
Some (9,15--9,19), [],
63+
[Member
64+
(SynBinding
65+
(None, Normal, false, false, [],
66+
PreXmlDoc ((10,6), FSharp.Compiler.Xml.XmlDocCollector),
67+
SynValData
68+
(Some { IsInstance = true
69+
IsDispatchSlot = false
70+
IsOverrideOrExplicitImpl = true
71+
IsFinal = false
72+
GetterOrSetterIsCompilerGenerated = false
73+
MemberKind = Member },
74+
SynValInfo
75+
([[SynArgInfo ([], false, None)]; []],
76+
SynArgInfo ([], false, None)), None, None),
77+
LongIdent
78+
(SynLongIdent
79+
([_; P3], [(10,14--10,15)], [None; None]), None,
80+
None, Pats [], None, (10,13--10,17)), None,
81+
Const (Int32 3, (10,20--10,21)), (10,13--10,17),
82+
NoneAtInvisible,
83+
{ LeadingKeyword = Member (10,6--10,12)
84+
InlineKeyword = None
85+
EqualsRange = Some (10,18--10,19) }),
86+
(10,6--10,21))], (9,2--10,21))], (3,2--3,9),
87+
(3,0--10,23)), (3,0--10,23))],
88+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
89+
(1,0--10,23), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
90+
{ ConditionalDirectives = []
91+
CodeComments = [] }, set []))
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module Module
2+
3+
{ new T() with }
4+
5+
()
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Expression/Object - Class 04.fs", false, QualifiedNameOfFile Module,
4+
[], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Expr
8+
(ObjExpr
9+
(LongIdent (SynLongIdent ([T], [], [None])),
10+
Some (Const (Unit, (3,7--3,9)), None), Some (3,10--3,14), [],
11+
[], [], (3,2--3,9), (3,0--3,16)), (3,0--3,16));
12+
Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))],
13+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
14+
(1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
15+
{ ConditionalDirectives = []
16+
CodeComments = [] }, set []))
17+
18+
(3,15)-(3,16) parse error Incomplete structured construct at or before this point in binding
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
{ new T() with
4+
}
5+
6+
()

0 commit comments

Comments
 (0)