Skip to content

Commit 1d96bdf

Browse files
authored
Parser: recover on unfinished accessors clause (#15952)
1 parent d2de949 commit 1d96bdf

23 files changed

+635
-0
lines changed

src/Compiler/pars.fsy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,19 @@ classMemberSpfnGetSetElements:
10581058
else
10591059
SynMemberKind.PropertyGetSet, Some(GetSetKeywords.GetSet(id2.idRange, id.idRange)) }
10601060

1061+
| nameop COMMA recover
1062+
{ (let (SynIdent(id:Ident, _)) = $1
1063+
if id.idText = "get" then
1064+
SynMemberKind.PropertyGet, Some(GetSetKeywords.Get id.idRange)
1065+
else if id.idText = "set" then
1066+
SynMemberKind.PropertySet, Some(GetSetKeywords.Set id.idRange)
1067+
else
1068+
raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsGetOrSetRequired())) }
1069+
1070+
| OBLOCKBEGIN oblockend ODECLEND
1071+
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsIdentifierExpected())
1072+
SynMemberKind.Member, None }
1073+
10611074
memberSpecFlags:
10621075
| memberFlags { $1 }
10631076
| abstractMemberFlags { $1 }
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module Module
2+
3+
type T =
4+
abstract P: int
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Member/Abstract - Property 01.fs", false,
4+
QualifiedNameOfFile Module, [], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [T],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
ObjectModel
14+
(Unspecified,
15+
[AbstractSlot
16+
(SynValSig
17+
([], SynIdent (P, None),
18+
SynValTyparDecls (None, true),
19+
LongIdent (SynLongIdent ([int], [], [None])),
20+
SynValInfo ([], SynArgInfo ([], false, None)), false,
21+
false,
22+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, None, (4,4--4,19),
24+
{ LeadingKeyword = Abstract (4,4--4,12)
25+
InlineKeyword = None
26+
WithKeyword = None
27+
EqualsRange = None }),
28+
{ IsInstance = true
29+
IsDispatchSlot = true
30+
IsOverrideOrExplicitImpl = false
31+
IsFinal = false
32+
GetterOrSetterIsCompilerGenerated = false
33+
MemberKind = PropertyGet }, (4,4--4,19),
34+
{ GetSetKeywords = None })], (4,4--4,19)), [], None,
35+
(3,5--4,19), { LeadingKeyword = Type (3,0--3,4)
36+
EqualsRange = Some (3,7--3,8)
37+
WithKeyword = None })], (3,0--4,19))],
38+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
39+
(1,0--4,19), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
40+
{ ConditionalDirectives = []
41+
CodeComments = [] }, set []))
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module Module
2+
3+
type T =
4+
abstract P: int with get, set
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Member/Abstract - Property 02.fs", false,
4+
QualifiedNameOfFile Module, [], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [T],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
ObjectModel
14+
(Unspecified,
15+
[AbstractSlot
16+
(SynValSig
17+
([], SynIdent (P, None),
18+
SynValTyparDecls (None, true),
19+
LongIdent (SynLongIdent ([int], [], [None])),
20+
SynValInfo ([], SynArgInfo ([], false, None)), false,
21+
false,
22+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, None, (4,4--4,33),
24+
{ LeadingKeyword = Abstract (4,4--4,12)
25+
InlineKeyword = None
26+
WithKeyword = Some (4,20--4,24)
27+
EqualsRange = None }),
28+
{ IsInstance = true
29+
IsDispatchSlot = true
30+
IsOverrideOrExplicitImpl = false
31+
IsFinal = false
32+
GetterOrSetterIsCompilerGenerated = false
33+
MemberKind = PropertyGetSet }, (4,4--4,33),
34+
{ GetSetKeywords =
35+
Some (GetSet ((4,25--4,28), (4,30--4,33))) })],
36+
(4,4--4,33)), [], None, (3,5--4,33),
37+
{ LeadingKeyword = Type (3,0--3,4)
38+
EqualsRange = Some (3,7--3,8)
39+
WithKeyword = None })], (3,0--4,33))],
40+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
41+
(1,0--4,33), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
42+
{ ConditionalDirectives = []
43+
CodeComments = [] }, set []))
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
type T =
4+
abstract P: int with get,
5+
6+
()
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Member/Abstract - Property 03.fs", false,
4+
QualifiedNameOfFile Module, [], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [T],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
ObjectModel
14+
(Unspecified,
15+
[AbstractSlot
16+
(SynValSig
17+
([], SynIdent (P, None),
18+
SynValTyparDecls (None, true),
19+
LongIdent (SynLongIdent ([int], [], [None])),
20+
SynValInfo ([], SynArgInfo ([], false, None)), false,
21+
false,
22+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, None, (4,4--4,28),
24+
{ LeadingKeyword = Abstract (4,4--4,12)
25+
InlineKeyword = None
26+
WithKeyword = Some (4,20--4,24)
27+
EqualsRange = None }),
28+
{ IsInstance = true
29+
IsDispatchSlot = true
30+
IsOverrideOrExplicitImpl = false
31+
IsFinal = false
32+
GetterOrSetterIsCompilerGenerated = false
33+
MemberKind = PropertyGet }, (4,4--4,28),
34+
{ GetSetKeywords = Some (Get (4,25--4,28)) })],
35+
(4,4--4,28)), [], None, (3,5--4,28),
36+
{ LeadingKeyword = Type (3,0--3,4)
37+
EqualsRange = Some (3,7--3,8)
38+
WithKeyword = None })], (3,0--4,28));
39+
Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))],
40+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
41+
(1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
42+
{ ConditionalDirectives = []
43+
CodeComments = [] }, set []))
44+
45+
(6,0)-(6,1) parse error Possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this token further or using standard formatting conventions.
46+
(6,0)-(6,1) parse error Incomplete structured construct at or before this point in member definition. Expected identifier, '(', '(*)' or other token.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
type T =
4+
abstract P: int with
5+
6+
()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Member/Abstract - Property 04.fs", false,
4+
QualifiedNameOfFile Module, [], [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [T],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
ObjectModel
14+
(Unspecified,
15+
[AbstractSlot
16+
(SynValSig
17+
([], SynIdent (P, None),
18+
SynValTyparDecls (None, true),
19+
LongIdent (SynLongIdent ([int], [], [None])),
20+
SynValInfo ([], SynArgInfo ([], false, None)), false,
21+
false,
22+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, None, (4,4--4,19),
24+
{ LeadingKeyword = Abstract (4,4--4,12)
25+
InlineKeyword = None
26+
WithKeyword = Some (4,20--4,24)
27+
EqualsRange = None }),
28+
{ IsInstance = true
29+
IsDispatchSlot = true
30+
IsOverrideOrExplicitImpl = false
31+
IsFinal = false
32+
GetterOrSetterIsCompilerGenerated = false
33+
MemberKind = PropertyGet }, (4,4--4,19),
34+
{ GetSetKeywords = None })], (4,4--4,19)), [], None,
35+
(3,5--4,19), { LeadingKeyword = Type (3,0--3,4)
36+
EqualsRange = Some (3,7--3,8)
37+
WithKeyword = None })], (3,0--4,19));
38+
Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))],
39+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
40+
(1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
41+
{ ConditionalDirectives = []
42+
CodeComments = [] }, set []))
43+
44+
(6,0)-(6,1) parse error Possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this token further or using standard formatting conventions.
45+
(4,20)-(4,24) parse error Identifier expected
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Module
2+
3+
type T =
4+
abstract P1: int with
5+
abstract P2: int
6+
7+
()

0 commit comments

Comments
 (0)