Skip to content

Commit 50836c1

Browse files
jensjohacommit-bot@chromium.org
authored andcommitted
[parser] Fix parsing of empty index in cascade
Fixes #42267 Change-Id: Ia09fd9e564bc0b04cdd99d3aac5093a12ab10d96 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150926 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent a3eacf7 commit 50836c1

File tree

6 files changed

+718
-8
lines changed

6 files changed

+718
-8
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3041,11 +3041,13 @@ class Parser {
30413041
Token replacement;
30423042
if (next.isSynthetic) {
30433043
replacement = link(
3044-
new SyntheticBeginToken(TokenType.OPEN_SQUARE_BRACKET, next.offset),
3044+
new SyntheticBeginToken(TokenType.OPEN_SQUARE_BRACKET, next.offset,
3045+
next.precedingComments),
30453046
new SyntheticToken(TokenType.CLOSE_SQUARE_BRACKET, next.offset));
30463047
} else {
30473048
replacement = link(
3048-
new BeginToken(TokenType.OPEN_SQUARE_BRACKET, next.offset),
3049+
new BeginToken(TokenType.OPEN_SQUARE_BRACKET, next.offset,
3050+
next.precedingComments),
30493051
new Token(TokenType.CLOSE_SQUARE_BRACKET, next.offset + 1));
30503052
}
30513053
rewriter.replaceTokenFollowing(token, replacement);
@@ -4543,12 +4545,7 @@ class Parser {
45434545
token = parseArgumentOrIndexStar(
45444546
token, typeArg, /* checkedNullAware = */ true);
45454547
} else if (identical(type, TokenType.INDEX)) {
4546-
BeginToken replacement = link(
4547-
new BeginToken(TokenType.OPEN_SQUARE_BRACKET, next.charOffset,
4548-
next.precedingComments),
4549-
new Token(TokenType.CLOSE_SQUARE_BRACKET, next.charOffset + 1));
4550-
rewriter.replaceTokenFollowing(token, replacement);
4551-
replacement.endToken = replacement.next;
4548+
rewriteSquareBrackets(token);
45524549
token = parseArgumentOrIndexStar(
45534550
token, noTypeParamOrArg, /* checkedNullAware = */ false);
45544551
} else if (identical(type, TokenType.BANG)) {
@@ -4652,6 +4649,14 @@ class Parser {
46524649
next = token.next;
46534650
assert(optional('(', next));
46544651
}
4652+
TokenType nextType = next.type;
4653+
if (identical(nextType, TokenType.INDEX)) {
4654+
// If we don't split the '[]' here we will stop parsing it as a cascade
4655+
// and either split it later (parsing it wrong) or inserting ; before it
4656+
// (also wrong).
4657+
// See also https://github.com/dart-lang/sdk/issues/42267.
4658+
rewriteSquareBrackets(token);
4659+
}
46554660
token = parseArgumentOrIndexStar(
46564661
token, typeArg, /* checkedNullAware = */ false);
46574662
next = token.next;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
void main() {
2+
builder..foo[bar];
3+
FilterSet((builder) => builder..foo[bar]);
4+
builder..foo[];
5+
FilterSet((builder) => builder..foo[]);
6+
builder..foo[ ];
7+
FilterSet((builder) => builder..foo[ ]);
8+
}
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
Problems reported:
2+
3+
parser/error_recovery/issue_42267:4:16: Expected an identifier, but got ']'.
4+
builder..foo[];
5+
^
6+
7+
parser/error_recovery/issue_42267:5:39: Expected an identifier, but got ']'.
8+
FilterSet((builder) => builder..foo[]);
9+
^
10+
11+
parser/error_recovery/issue_42267:6:17: Expected an identifier, but got ']'.
12+
builder..foo[ ];
13+
^
14+
15+
parser/error_recovery/issue_42267:7:40: Expected an identifier, but got ']'.
16+
FilterSet((builder) => builder..foo[ ]);
17+
^
18+
19+
beginCompilationUnit(void)
20+
beginMetadataStar(void)
21+
endMetadataStar(0)
22+
beginTopLevelMember(void)
23+
beginTopLevelMethod(, null)
24+
handleVoidKeyword(void)
25+
handleIdentifier(main, topLevelFunctionDeclaration)
26+
handleNoTypeVariables(()
27+
beginFormalParameters((, MemberKind.TopLevelMethod)
28+
endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
29+
handleAsyncModifier(null, null)
30+
beginBlockFunctionBody({)
31+
handleIdentifier(builder, expression)
32+
handleNoTypeArguments(..)
33+
handleNoArguments(..)
34+
handleSend(builder, ..)
35+
beginCascade(..)
36+
handleIdentifier(foo, expressionContinuation)
37+
handleNoTypeArguments([)
38+
handleNoArguments([)
39+
handleSend(foo, [)
40+
endBinaryExpression(..)
41+
handleIdentifier(bar, expression)
42+
handleNoTypeArguments(])
43+
handleNoArguments(])
44+
handleSend(bar, ])
45+
handleIndexedExpression(null, [, ])
46+
endCascade()
47+
handleExpressionStatement(;)
48+
handleIdentifier(FilterSet, expression)
49+
handleNoTypeArguments(()
50+
beginArguments(()
51+
handleNoTypeVariables(()
52+
beginFunctionExpression(()
53+
beginFormalParameters((, MemberKind.Local)
54+
beginMetadataStar(builder)
55+
endMetadataStar(0)
56+
beginFormalParameter(builder, MemberKind.Local, null, null, null)
57+
handleNoType(()
58+
handleIdentifier(builder, formalParameterDeclaration)
59+
handleFormalParameterWithoutValue())
60+
endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
61+
endFormalParameters(1, (, ), MemberKind.Local)
62+
handleAsyncModifier(null, null)
63+
handleIdentifier(builder, expression)
64+
handleNoTypeArguments(..)
65+
handleNoArguments(..)
66+
handleSend(builder, ..)
67+
beginCascade(..)
68+
handleIdentifier(foo, expressionContinuation)
69+
handleNoTypeArguments([)
70+
handleNoArguments([)
71+
handleSend(foo, [)
72+
endBinaryExpression(..)
73+
handleIdentifier(bar, expression)
74+
handleNoTypeArguments(])
75+
handleNoArguments(])
76+
handleSend(bar, ])
77+
handleIndexedExpression(null, [, ])
78+
endCascade()
79+
handleExpressionFunctionBody(=>, null)
80+
endFunctionExpression((, ))
81+
endArguments(1, (, ))
82+
handleSend(FilterSet, ;)
83+
handleExpressionStatement(;)
84+
handleIdentifier(builder, expression)
85+
handleNoTypeArguments(..)
86+
handleNoArguments(..)
87+
handleSend(builder, ..)
88+
beginCascade(..)
89+
handleIdentifier(foo, expressionContinuation)
90+
handleNoTypeArguments([])
91+
handleNoArguments([])
92+
handleSend(foo, [])
93+
endBinaryExpression(..)
94+
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., null, {token: ]}], ], ])
95+
handleIdentifier(, expression)
96+
handleNoTypeArguments(])
97+
handleNoArguments(])
98+
handleSend(, ])
99+
handleIndexedExpression(null, [, ])
100+
endCascade()
101+
handleExpressionStatement(;)
102+
handleIdentifier(FilterSet, expression)
103+
handleNoTypeArguments(()
104+
beginArguments(()
105+
handleNoTypeVariables(()
106+
beginFunctionExpression(()
107+
beginFormalParameters((, MemberKind.Local)
108+
beginMetadataStar(builder)
109+
endMetadataStar(0)
110+
beginFormalParameter(builder, MemberKind.Local, null, null, null)
111+
handleNoType(()
112+
handleIdentifier(builder, formalParameterDeclaration)
113+
handleFormalParameterWithoutValue())
114+
endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
115+
endFormalParameters(1, (, ), MemberKind.Local)
116+
handleAsyncModifier(null, null)
117+
handleIdentifier(builder, expression)
118+
handleNoTypeArguments(..)
119+
handleNoArguments(..)
120+
handleSend(builder, ..)
121+
beginCascade(..)
122+
handleIdentifier(foo, expressionContinuation)
123+
handleNoTypeArguments([])
124+
handleNoArguments([])
125+
handleSend(foo, [])
126+
endBinaryExpression(..)
127+
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., null, {token: ]}], ], ])
128+
handleIdentifier(, expression)
129+
handleNoTypeArguments(])
130+
handleNoArguments(])
131+
handleSend(, ])
132+
handleIndexedExpression(null, [, ])
133+
endCascade()
134+
handleExpressionFunctionBody(=>, null)
135+
endFunctionExpression((, ))
136+
endArguments(1, (, ))
137+
handleSend(FilterSet, ;)
138+
handleExpressionStatement(;)
139+
handleIdentifier(builder, expression)
140+
handleNoTypeArguments(..)
141+
handleNoArguments(..)
142+
handleSend(builder, ..)
143+
beginCascade(..)
144+
handleIdentifier(foo, expressionContinuation)
145+
handleNoTypeArguments([)
146+
handleNoArguments([)
147+
handleSend(foo, [)
148+
endBinaryExpression(..)
149+
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., null, {token: ]}], ], ])
150+
handleIdentifier(, expression)
151+
handleNoTypeArguments(])
152+
handleNoArguments(])
153+
handleSend(, ])
154+
handleIndexedExpression(null, [, ])
155+
endCascade()
156+
handleExpressionStatement(;)
157+
handleIdentifier(FilterSet, expression)
158+
handleNoTypeArguments(()
159+
beginArguments(()
160+
handleNoTypeVariables(()
161+
beginFunctionExpression(()
162+
beginFormalParameters((, MemberKind.Local)
163+
beginMetadataStar(builder)
164+
endMetadataStar(0)
165+
beginFormalParameter(builder, MemberKind.Local, null, null, null)
166+
handleNoType(()
167+
handleIdentifier(builder, formalParameterDeclaration)
168+
handleFormalParameterWithoutValue())
169+
endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
170+
endFormalParameters(1, (, ), MemberKind.Local)
171+
handleAsyncModifier(null, null)
172+
handleIdentifier(builder, expression)
173+
handleNoTypeArguments(..)
174+
handleNoArguments(..)
175+
handleSend(builder, ..)
176+
beginCascade(..)
177+
handleIdentifier(foo, expressionContinuation)
178+
handleNoTypeArguments([)
179+
handleNoArguments([)
180+
handleSend(foo, [)
181+
endBinaryExpression(..)
182+
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., null, {token: ]}], ], ])
183+
handleIdentifier(, expression)
184+
handleNoTypeArguments(])
185+
handleNoArguments(])
186+
handleSend(, ])
187+
handleIndexedExpression(null, [, ])
188+
endCascade()
189+
handleExpressionFunctionBody(=>, null)
190+
endFunctionExpression((, ))
191+
endArguments(1, (, ))
192+
handleSend(FilterSet, ;)
193+
handleExpressionStatement(;)
194+
endBlockFunctionBody(6, {, })
195+
endTopLevelMethod(void, null, })
196+
endTopLevelDeclaration()
197+
endCompilationUnit(1, )

0 commit comments

Comments
 (0)