Add parser support for patterns in for-in statements and collection elements.

Bug: https://github.com/dart-lang/sdk/issues/50035
Change-Id: I9eda03c1501cf3164cfb09cf9084576a5d1141cc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273122
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
This commit is contained in:
Paul Berry 2022-12-02 15:22:38 +00:00 committed by Commit Queue
parent ff87b5ea8e
commit e9a1248fc2
71 changed files with 569 additions and 163 deletions

View file

@ -1488,9 +1488,9 @@ class ForwardingListener implements Listener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
listener?.handleForInLoopParts(
awaitToken, forToken, leftParenthesis, inKeyword);
awaitToken, forToken, leftParenthesis, patternKeyword, inKeyword);
}
@override

View file

@ -621,9 +621,13 @@ class Listener implements UnescapeErrorListener {
/// Marks the end of parsing the control structure of a for-in statement
/// or for control flow entry up to and including the closing parenthesis.
/// `for` `(` (type)? identifier `in` iterator `)`
/// If [patternKeyword] is `null`, this takes the form:
/// `for` `(` (type)? identifier `in` iterator `)`
/// If [patternKeyword] is not `null`, it is either a `var` or `final` token,
/// and this takes the form:
/// `for` `(` patternKeyword pattern `in` iterator `)`
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {}
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {}
// One of the two possible corresponding end events for [beginForStatement].
void endForIn(Token endToken) {

View file

@ -48,7 +48,10 @@ class ForCondition extends LiteralEntryInfo {
return parser.parseForLoopPartsRest(token, forToken, awaitToken);
} else {
// Process `for ( pattern in expression )`
throw new UnimplementedError('TODO(paulberry)');
assert(optional('in', token.next!));
_inStyle = true;
return parser.parseForInLoopPartsRest(
token, awaitToken, forToken, patternKeyword, null);
}
}
Token identifier = token.next!;
@ -58,7 +61,7 @@ class ForCondition extends LiteralEntryInfo {
// Process `for ( ... in ... )`
_inStyle = true;
token = parser.parseForInLoopPartsRest(
token, awaitToken, forToken, identifier);
token, awaitToken, forToken, null, identifier);
} else {
// Process `for ( ... ; ... ; ... )`
_inStyle = false;

View file

@ -7454,20 +7454,26 @@ class Parser {
lateToken == null &&
varFinalOrConst != null &&
(optional('var', varFinalOrConst) ||
optional('final', varFinalOrConst)) &&
looksLikeOuterPatternEquals(beforeType)) {
// If there was any metadata, then the caller was responsible for parsing
// it; if not, then we need to let the listener know there wasn't any.
if (!optional('@', start.next!)) {
listener.beginMetadataStar(start.next!);
listener.endMetadataStar(/* count = */ 0);
}
if (forPartsContext != null) {
forPartsContext.patternKeyword = varFinalOrConst;
return parsePattern(beforeType, isRefutableContext: false);
} else {
return parsePatternVariableDeclarationStatement(
beforeType, start, varFinalOrConst);
optional('final', varFinalOrConst))) {
Token? afterOuterPattern = skipOuterPattern(beforeType);
if (afterOuterPattern != null &&
(optional('=', afterOuterPattern.next!) ||
(forPartsContext != null &&
optional('in', afterOuterPattern.next!)))) {
// If there was any metadata, then the caller was responsible for
// parsing it; if not, then we need to let the listener know there
// wasn't any.
if (!optional('@', start.next!)) {
listener.beginMetadataStar(start.next!);
listener.endMetadataStar(/* count = */ 0);
}
if (forPartsContext != null) {
forPartsContext.patternKeyword = varFinalOrConst;
return parsePattern(beforeType, isRefutableContext: false);
} else {
return parsePatternVariableDeclarationStatement(
beforeType, start, varFinalOrConst);
}
}
}
@ -7683,6 +7689,7 @@ class Parser {
/// | expression? ';' expression? ';' expressionList?
/// | localVariableDeclaration 'in' expression
/// | identifier 'in' expression
/// | metadata ( 'final' | 'var' ) outerPattern 'in' expression
/// ;
///
/// forInitializerStatement:
@ -7709,14 +7716,16 @@ class Parser {
return parseForRest(awaitToken, token, forToken);
} else {
// Process `for ( pattern in expression )`
throw new UnimplementedError('TODO(paulberry)');
assert(optional('in', token.next!));
return parseForInRest(
token, awaitToken, forToken, patternKeyword, null);
}
}
Token identifier = token.next!;
token = parseForLoopPartsMid(token, awaitToken, forToken);
if (optional('in', token.next!) || optional(':', token.next!)) {
// Process `for ( ... in ... )`
return parseForInRest(token, awaitToken, forToken, identifier);
return parseForInRest(token, awaitToken, forToken, null, identifier);
} else {
// Process `for ( ... ; ... ; ... )`
return parseForRest(awaitToken, token, forToken);
@ -7870,11 +7879,13 @@ class Parser {
/// | expression? ';' expression? ';' expressionList?
/// | localVariableDeclaration 'in' expression
/// | identifier 'in' expression
/// | metadata ( 'final' | 'var' ) outerPattern 'in' expression
/// ;
/// ```
Token parseForInRest(
Token token, Token? awaitToken, Token forToken, Token identifier) {
token = parseForInLoopPartsRest(token, awaitToken, forToken, identifier);
Token parseForInRest(Token token, Token? awaitToken, Token forToken,
Token? patternKeyword, Token? identifier) {
token = parseForInLoopPartsRest(
token, awaitToken, forToken, patternKeyword, identifier);
listener.beginForInBody(token.next!);
LoopState savedLoopState = loopState;
loopState = LoopState.InsideLoop;
@ -7885,37 +7896,38 @@ class Parser {
return token;
}
Token parseForInLoopPartsRest(
Token token, Token? awaitToken, Token forToken, Token identifier) {
Token parseForInLoopPartsRest(Token token, Token? awaitToken, Token forToken,
Token? patternKeyword, Token? identifier) {
Token inKeyword = token.next!;
assert(optional('for', forToken));
assert(optional('(', forToken.next!));
assert(optional('in', inKeyword) || optional(':', inKeyword));
if (!identifier.isIdentifier) {
// TODO(jensj): This should probably (sometimes) be
// templateExpectedIdentifierButGotKeyword instead.
reportRecoverableErrorWithToken(
identifier, codes.templateExpectedIdentifier);
} else if (identifier != token) {
if (optional('=', identifier.next!)) {
reportRecoverableError(
identifier.next!, codes.messageInitializedVariableInForEach);
} else {
if (identifier != null) {
if (!identifier.isIdentifier) {
// TODO(jensj): This should probably (sometimes) be
// templateExpectedIdentifierButGotKeyword instead.
reportRecoverableErrorWithToken(
identifier.next!, codes.templateUnexpectedToken);
identifier, codes.templateExpectedIdentifier);
} else if (identifier != token) {
if (optional('=', identifier.next!)) {
reportRecoverableError(
identifier.next!, codes.messageInitializedVariableInForEach);
} else {
reportRecoverableErrorWithToken(
identifier.next!, codes.templateUnexpectedToken);
}
} else if (awaitToken != null && !inAsync) {
// TODO(danrubel): consider reporting the error on awaitToken
reportRecoverableError(inKeyword, codes.messageAwaitForNotAsync);
}
} else if (awaitToken != null && !inAsync) {
// TODO(danrubel): consider reporting the error on awaitToken
reportRecoverableError(inKeyword, codes.messageAwaitForNotAsync);
}
listener.beginForInExpression(inKeyword.next!);
token = parseExpression(inKeyword);
token = ensureCloseParen(token, forToken.next!);
listener.endForInExpression(token);
listener.handleForInLoopParts(
awaitToken, forToken, forToken.next!, inKeyword);
awaitToken, forToken, forToken.next!, patternKeyword, inKeyword);
return token;
}
@ -9974,7 +9986,7 @@ enum AwaitOrYieldContext { Statement, UnaryExpression }
/// `forLoopParts` grammar production.
class ForPartsContext {
/// If `forLoopParts` began with `( 'final' | 'var' ) outerPattern`, followed
/// by `=`, the `final` or `var` keyword. Otherwise `null`.
/// by either `=` or `in`, the `final` or `var` keyword. Otherwise `null`.
Token? patternKeyword;
@override

View file

@ -5082,9 +5082,10 @@ class ForEachPartsWithPatternImpl extends ForEachPartsImpl
Token get beginToken => keyword;
@override
ChildEntities get _childEntities => super._childEntities
ChildEntities get _childEntities => ChildEntities()
..addToken('keyword', keyword)
..addNode('pattern', pattern);
..addNode('pattern', pattern)
..addAll(super._childEntities);
@override
E? accept<E>(AstVisitor<E> visitor) =>

View file

@ -4043,7 +4043,7 @@ class AstBuilder extends StackListener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
assert(optionalOrNull('await', awaitToken));
assert(optional('for', forToken));
assert(optional('(', leftParenthesis));
@ -4053,7 +4053,16 @@ class AstBuilder extends StackListener {
var variableOrDeclaration = pop()!;
ForEachPartsImpl forLoopParts;
if (variableOrDeclaration is VariableDeclarationStatementImpl) {
if (patternKeyword != null) {
// TODO(paulberry): handle metadata
// ignore: unused_local_variable
var metadata = pop() as List<AnnotationImpl>?;
forLoopParts = ForEachPartsWithPatternImpl(
keyword: patternKeyword,
pattern: variableOrDeclaration as DartPatternImpl,
inKeyword: inKeyword,
iterable: iterable);
} else if (variableOrDeclaration is VariableDeclarationStatementImpl) {
var variableList = variableOrDeclaration.variables;
forLoopParts = ForEachPartsWithDeclarationImpl(
loopVariable: DeclaredIdentifierImpl(

View file

@ -6271,6 +6271,69 @@ PostfixPattern
''');
}
test_pattern_inForIn_element() {
_parse('''
void f(x) => [for (var (a, b) in x) 0];
''');
var node = findNode.forElement('for');
assertParsedNodeText(node, r'''
ForElement
forKeyword: for
leftParenthesis: (
forLoopParts: ForEachPartsWithPattern
keyword: var
pattern: RecordPattern
leftParenthesis: (
fields
RecordPatternField
pattern: VariablePattern
name: a
RecordPatternField
pattern: VariablePattern
name: b
rightParenthesis: )
inKeyword: in
iterable: SimpleIdentifier
token: x
rightParenthesis: )
body: IntegerLiteral
literal: 0
''');
}
test_pattern_inForIn_statement() {
_parse('''
void f(x) {
for (var (a, b) in x) {}
}
''');
var node = findNode.forStatement('for');
assertParsedNodeText(node, r'''
ForStatement
forKeyword: for
leftParenthesis: (
forLoopParts: ForEachPartsWithPattern
keyword: var
pattern: RecordPattern
leftParenthesis: (
fields
RecordPatternField
pattern: VariablePattern
name: a
RecordPatternField
pattern: VariablePattern
name: b
rightParenthesis: )
inKeyword: in
iterable: SimpleIdentifier
token: x
rightParenthesis: )
body: Block
leftBracket: {
rightBracket: }
''');
}
test_pattern_inForInitializer_element() {
_parse('''
void f(x) => [for (var (a, b) = x; ;) 0];

View file

@ -550,6 +550,14 @@ class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
});
}
@override
void visitForEachPartsWithPattern(ForEachPartsWithPattern node) {
_writeln('ForEachPartsWithPattern');
_withIndent(() {
_writeNamedChildEntities(node);
});
}
@override
void visitForElement(ForElement node) {
_writeln('ForElement');

View file

@ -6761,7 +6761,11 @@ class BodyBuilder extends StackListenerImpl
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
if (patternKeyword != null) {
throw new UnimplementedError(
'TODO(paulberry): handle pattern in for-in loop');
}
push(awaitToken ?? NullValue.AwaitToken);
push(forToken);
push(inKeyword);

View file

@ -1767,7 +1767,7 @@ class _MacroListener implements Listener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
_unsupported();
}

View file

@ -806,11 +806,12 @@ abstract class AbstractParserAstListener implements Listener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
ForInLoopPartsHandle data = new ForInLoopPartsHandle(ParserAstType.HANDLE,
awaitToken: awaitToken,
forToken: forToken,
leftParenthesis: leftParenthesis,
patternKeyword: patternKeyword,
inKeyword: inKeyword);
seen(data);
}
@ -4329,12 +4330,14 @@ class ForInLoopPartsHandle extends ParserAstNode {
final Token? awaitToken;
final Token forToken;
final Token leftParenthesis;
final Token? patternKeyword;
final Token inKeyword;
ForInLoopPartsHandle(ParserAstType type,
{this.awaitToken,
required this.forToken,
required this.leftParenthesis,
this.patternKeyword,
required this.inKeyword})
: super("ForInLoopParts", type);
@ -4343,6 +4346,7 @@ class ForInLoopPartsHandle extends ParserAstNode {
"awaitToken": awaitToken,
"forToken": forToken,
"leftParenthesis": leftParenthesis,
"patternKeyword": patternKeyword,
"inKeyword": inKeyword,
};
}

View file

@ -44,7 +44,7 @@ beginCompilationUnit(main)
handleNoArguments())
handleSend(, ))
endForInExpression())
handleForInLoopParts(await, for, (, in)
handleForInLoopParts(await, for, (, null, in)
beginForInBody({)
beginBlock({, BlockKind(statement))
endBlock(0, {, }, BlockKind(statement))

View file

@ -53,8 +53,8 @@ parseUnit(main)
listener: handleForInitializerExpressionStatement(, true)
reportRecoverableError(), Message[ExpectedButGot, Expected 'in' before this., null, {string: in}])
listener: handleRecoverableError(Message[ExpectedButGot, Expected 'in' before this., null, {string: in}], ), ))
parseForInRest(, await, for, ))
parseForInLoopPartsRest(, await, for, ))
parseForInRest(, await, for, null, ))
parseForInLoopPartsRest(, await, for, null, ))
reportRecoverableErrorWithToken(), Instance of 'Template<(Token) => Message>')
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
listener: beginForInExpression())
@ -75,7 +75,7 @@ parseUnit(main)
listener: handleSend(, ))
ensureCloseParen(, ()
listener: endForInExpression())
listener: handleForInLoopParts(await, for, (, in)
listener: handleForInLoopParts(await, for, (, null, in)
listener: beginForInBody({)
parseStatement())
parseStatementX())

View file

@ -37,7 +37,7 @@ beginCompilationUnit(main)
handleLiteralInt(3)
handleLiteralList(3, [, null, ])
endForInExpression())
handleForInLoopParts(null, for, (, :)
handleForInLoopParts(null, for, (, null, :)
beginForInBody({)
beginBlock({, BlockKind(statement))
handleIdentifier(print, expression)

View file

@ -53,8 +53,8 @@ parseUnit(main)
listener: handleForInitializerLocalVariableDeclaration(i, true)
reportRecoverableError(:, ColonInPlaceOfIn)
listener: handleRecoverableError(ColonInPlaceOfIn, :, :)
parseForInRest(i, null, for, i)
parseForInLoopPartsRest(i, null, for, i)
parseForInRest(i, null, for, null, i)
parseForInLoopPartsRest(i, null, for, null, i)
listener: beginForInExpression([)
parseExpression(:)
parsePrecedenceExpression(:, 1, true)
@ -83,7 +83,7 @@ parseUnit(main)
listener: handleLiteralList(3, [, null, ])
ensureCloseParen(], ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, :)
listener: handleForInLoopParts(null, for, (, null, :)
listener: beginForInBody({)
parseStatement())
parseStatementX())

View file

@ -25,7 +25,7 @@ beginCompilationUnit(main)
handleNoTypeArguments([])
handleLiteralList(0, [, null, ])
endForInExpression())
handleForInLoopParts(null, for, (, in)
handleForInLoopParts(null, for, (, null, in)
beginForInBody({)
beginBlock({, BlockKind(statement))
endBlock(0, {, }, BlockKind(statement))

View file

@ -49,8 +49,8 @@ parseUnit(main)
listener: endInitializedIdentifier(i)
listener: endVariablesDeclaration(1, null)
listener: handleForInitializerLocalVariableDeclaration(i, true)
parseForInRest(i, null, for, i)
parseForInLoopPartsRest(i, null, for, i)
parseForInRest(i, null, for, null, i)
parseForInLoopPartsRest(i, null, for, null, i)
listener: beginForInExpression([])
parseExpression(in)
parsePrecedenceExpression(in, 1, true)
@ -64,7 +64,7 @@ parseUnit(main)
listener: handleLiteralList(0, [, null, ])
ensureCloseParen(], ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, in)
listener: handleForInLoopParts(null, for, (, null, in)
listener: beginForInBody({)
parseStatement())
parseStatementX())

View file

@ -29,7 +29,7 @@ beginCompilationUnit(main)
handleNoTypeArguments([])
handleLiteralList(0, [, null, ])
endForInExpression())
handleForInLoopParts(null, for, (, in)
handleForInLoopParts(null, for, (, null, in)
beginForInBody({)
beginBlock({, BlockKind(statement))
endBlock(0, {, }, BlockKind(statement))

View file

@ -68,8 +68,8 @@ parseUnit(main)
listener: handleNoArguments(in)
listener: handleSend(i, in)
listener: handleForInitializerExpressionStatement(i, true)
parseForInRest(i, null, for, i)
parseForInLoopPartsRest(i, null, for, i)
parseForInRest(i, null, for, null, i)
parseForInLoopPartsRest(i, null, for, null, i)
listener: beginForInExpression([])
parseExpression(in)
parsePrecedenceExpression(in, 1, true)
@ -83,7 +83,7 @@ parseUnit(main)
listener: handleLiteralList(0, [, null, ])
ensureCloseParen(], ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, in)
listener: handleForInLoopParts(null, for, (, null, in)
listener: beginForInBody({)
parseStatement())
parseStatementX())

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,9 +39,8 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(Future)
skipOuterPattern(var)
skipObjectPatternRest(Future)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,9 +39,8 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(Future)
skipOuterPattern(var)
skipObjectPatternRest(Future)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,9 +39,8 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(_)
skipOuterPattern(var)
skipObjectPatternRest(_)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,9 +39,8 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(_)
skipOuterPattern(var)
skipObjectPatternRest(_)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -74,9 +74,8 @@ parseUnit(class)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(C)
skipOuterPattern(var)
skipObjectPatternRest(C)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,8 +40,7 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,9 +40,8 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipObjectPatternRest(C)
skipOuterPattern(final)
skipObjectPatternRest(C)
listener: beginMetadataStar(final)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(final, {, final)

View file

@ -40,9 +40,8 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(C)
skipOuterPattern(var)
skipObjectPatternRest(C)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,8 +40,7 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,8 +40,7 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,8 +40,7 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -40,8 +40,7 @@ parseUnit(f)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -53,9 +53,8 @@ parseUnit(f)
listener: endMetadata(@, null, final)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipObjectPatternRest(C)
skipOuterPattern(final)
skipObjectPatternRest(C)
parsePatternVariableDeclarationStatement(final, {, final)
parsePattern(final, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(final, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, final)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipOuterPattern(final)
parsePatternVariableDeclarationStatement(final, {, final)
parsePattern(final, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(final, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, final)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipOuterPattern(final)
parsePatternVariableDeclarationStatement(final, {, final)
parsePattern(final, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(final, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, final)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipOuterPattern(final)
parsePatternVariableDeclarationStatement(final, {, final)
parsePattern(final, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(final, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, final)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(final, {, null, final, null, null)
looksLikeOuterPatternEquals(final)
skipOuterPattern(final)
skipOuterPattern(final)
parsePatternVariableDeclarationStatement(final, {, final)
parsePattern(final, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(final, isRefutableContext: false)

View file

@ -53,9 +53,8 @@ parseUnit(f)
listener: endMetadata(@, null, var)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipObjectPatternRest(C)
skipOuterPattern(var)
skipObjectPatternRest(C)
parsePatternVariableDeclarationStatement(var, {, var)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, var)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
parsePatternVariableDeclarationStatement(var, {, var)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, var)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
parsePatternVariableDeclarationStatement(var, {, var)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, var)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
parsePatternVariableDeclarationStatement(var, {, var)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)

View file

@ -53,8 +53,7 @@ parseUnit(f)
listener: endMetadata(@, null, var)
listener: endMetadataStar(1)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
parsePatternVariableDeclarationStatement(var, {, var)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)

View file

@ -0,0 +1 @@
void f(x) => [for (var (a, b) in x) 0];

View file

@ -0,0 +1,43 @@
beginCompilationUnit(void)
beginMetadataStar(void)
endMetadataStar(0)
beginTopLevelMember(void)
beginTopLevelMethod(, null, null)
handleVoidKeyword(void)
handleIdentifier(f, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(x)
endMetadataStar(0)
beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
handleNoType(()
handleIdentifier(x, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
handleNoTypeArguments([)
beginForControlFlow(null, for)
beginMetadataStar(var)
endMetadataStar(0)
handleNoType(()
handleVariablePattern(null, a)
handlePatternField(null)
handleNoType(,)
handleVariablePattern(null, b)
handlePatternField(null)
handleRecordPattern((, 2)
beginForInExpression(x)
handleIdentifier(x, expression)
handleNoTypeArguments())
handleNoArguments())
handleSend(x, ))
endForInExpression())
handleForInLoopParts(null, for, (, var, in)
handleLiteralInt(0)
endForInControlFlow(0)
handleLiteralList(1, [, null, ])
handleExpressionFunctionBody(=>, ;)
endTopLevelMethod(void, null, ;)
endTopLevelDeclaration()
endCompilationUnit(1, )

View file

@ -0,0 +1,107 @@
parseUnit(void)
skipErrorTokens(void)
listener: beginCompilationUnit(void)
syntheticPreviousToken(void)
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
parseMetadataStar()
listener: beginMetadataStar(void)
listener: endMetadataStar(0)
parseTopLevelMemberImpl()
listener: beginTopLevelMember(void)
parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, f, false)
listener: beginTopLevelMethod(, null, null)
listener: handleVoidKeyword(void)
ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
listener: handleIdentifier(f, topLevelFunctionDeclaration)
parseMethodTypeVar(f)
listener: handleNoTypeVariables(()
parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
parseFormalParameters(f, MemberKind.TopLevelMethod)
parseFormalParametersRest((, MemberKind.TopLevelMethod)
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
parseMetadataStar(()
listener: beginMetadataStar(x)
listener: endMetadataStar(0)
listener: beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
listener: handleNoType(()
ensureIdentifier((, formalParameterDeclaration)
listener: handleIdentifier(x, formalParameterDeclaration)
listener: handleFormalParameterWithoutValue())
listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
parseAsyncModifierOpt())
listener: handleAsyncModifier(null, null)
inPlainSync()
parseFunctionBody(), false, false)
parseExpressionFunctionBody(=>, false)
parseExpression(=>)
looksLikeOuterPatternEquals(=>)
skipOuterPattern(=>)
parsePrecedenceExpression(=>, 1, true)
parseUnaryExpression(=>, true)
parsePrimary(=>, expression)
listener: handleNoTypeArguments([)
parseLiteralListSuffix(=>, null)
listener: beginForControlFlow(null, for)
parseForLoopPartsStart(null, for, ForPartsContext(null))
parseExpressionStatementOrDeclaration((, ForPartsContext(null))
parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)
parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
parsePattern((, precedence: 1, isRefutableContext: false)
parsePrimaryPattern((, isRefutableContext: false)
parseVariablePattern((, typeInfo: Instance of 'NoType')
listener: handleNoType(()
listener: handleVariablePattern(null, a)
listener: handlePatternField(null)
parsePattern(,, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(,, isRefutableContext: false)
parseVariablePattern(,, typeInfo: Instance of 'NoType')
listener: handleNoType(,)
listener: handleVariablePattern(null, b)
listener: handlePatternField(null)
ensureCloseParen(b, ()
listener: handleRecordPattern((, 2)
parseForInLoopPartsRest(), null, for, var, null)
listener: beginForInExpression(x)
parseExpression(in)
looksLikeOuterPatternEquals(in)
skipOuterPattern(in)
skipObjectPatternRest(x)
parsePrecedenceExpression(in, 1, true)
parseUnaryExpression(in, true)
parsePrimary(in, expression)
parseSendOrFunctionLiteral(in, expression)
parseSend(in, expression)
isNextIdentifier(in)
ensureIdentifier(in, expression)
listener: handleIdentifier(x, expression)
listener: handleNoTypeArguments())
parseArgumentsOpt(x)
listener: handleNoArguments())
listener: handleSend(x, ))
ensureCloseParen(x, ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, var, in)
parseExpression())
looksLikeOuterPatternEquals())
skipOuterPattern())
parsePrecedenceExpression(), 1, true)
parseUnaryExpression(), true)
parsePrimary(), expression)
parseLiteralInt())
listener: handleLiteralInt(0)
listener: endForInControlFlow(0)
listener: handleLiteralList(1, [, null, ])
ensureSemicolon(])
listener: handleExpressionFunctionBody(=>, ;)
inGenerator()
listener: endTopLevelMethod(void, null, ;)
listener: endTopLevelDeclaration()
reportAllErrorTokens(void)
listener: endCompilationUnit(1, )

View file

@ -0,0 +1,5 @@
void f(x) => [for (var (a, b) in x) 0];
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] =>[SimpleToken] [[BeginToken]for[KeywordToken] ([BeginToken]var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] 0[StringToken]][SimpleToken];[SimpleToken]
[SimpleToken]

View file

@ -0,0 +1,5 @@
void f(x) => [for (var (a, b) in x) 0];
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] =>[SimpleToken] [[BeginToken]for[KeywordToken] ([BeginToken]var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] 0[StringToken]][SimpleToken];[SimpleToken]
[SimpleToken]

View file

@ -0,0 +1,3 @@
void f(x) {
for (var (a, b) in x) {}
}

View file

@ -0,0 +1,45 @@
beginCompilationUnit(void)
beginMetadataStar(void)
endMetadataStar(0)
beginTopLevelMember(void)
beginTopLevelMethod(, null, null)
handleVoidKeyword(void)
handleIdentifier(f, topLevelFunctionDeclaration)
handleNoTypeVariables(()
beginFormalParameters((, MemberKind.TopLevelMethod)
beginMetadataStar(x)
endMetadataStar(0)
beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
handleNoType(()
handleIdentifier(x, formalParameterDeclaration)
handleFormalParameterWithoutValue())
endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
handleAsyncModifier(null, null)
beginBlockFunctionBody({)
beginForStatement(for)
beginMetadataStar(var)
endMetadataStar(0)
handleNoType(()
handleVariablePattern(null, a)
handlePatternField(null)
handleNoType(,)
handleVariablePattern(null, b)
handlePatternField(null)
handleRecordPattern((, 2)
beginForInExpression(x)
handleIdentifier(x, expression)
handleNoTypeArguments())
handleNoArguments())
handleSend(x, ))
endForInExpression())
handleForInLoopParts(null, for, (, var, in)
beginForInBody({)
beginBlock({, BlockKind(statement))
endBlock(0, {, }, BlockKind(statement))
endForInBody(})
endForIn(})
endBlockFunctionBody(1, {, })
endTopLevelMethod(void, null, })
endTopLevelDeclaration()
endCompilationUnit(1, )

View file

@ -0,0 +1,103 @@
parseUnit(void)
skipErrorTokens(void)
listener: beginCompilationUnit(void)
syntheticPreviousToken(void)
parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
parseMetadataStar()
listener: beginMetadataStar(void)
listener: endMetadataStar(0)
parseTopLevelMemberImpl()
listener: beginTopLevelMember(void)
parseTopLevelMethod(, null, null, , Instance of 'VoidType', null, f, false)
listener: beginTopLevelMethod(, null, null)
listener: handleVoidKeyword(void)
ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
listener: handleIdentifier(f, topLevelFunctionDeclaration)
parseMethodTypeVar(f)
listener: handleNoTypeVariables(()
parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
parseFormalParameters(f, MemberKind.TopLevelMethod)
parseFormalParametersRest((, MemberKind.TopLevelMethod)
listener: beginFormalParameters((, MemberKind.TopLevelMethod)
parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
parseMetadataStar(()
listener: beginMetadataStar(x)
listener: endMetadataStar(0)
listener: beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
listener: handleNoType(()
ensureIdentifier((, formalParameterDeclaration)
listener: handleIdentifier(x, formalParameterDeclaration)
listener: handleFormalParameterWithoutValue())
listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
parseAsyncModifierOpt())
listener: handleAsyncModifier(null, null)
inPlainSync()
parseFunctionBody(), false, false)
listener: beginBlockFunctionBody({)
notEofOrValue(}, for)
parseStatement({)
parseStatementX({)
parseForStatement({, null)
listener: beginForStatement(for)
parseForLoopPartsStart(null, for, ForPartsContext(null))
parseExpressionStatementOrDeclaration((, ForPartsContext(null))
parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePattern(var, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(var, isRefutableContext: false)
parseParenthesizedPatternOrRecordPattern(var, isRefutableContext: false)
parsePattern((, precedence: 1, isRefutableContext: false)
parsePrimaryPattern((, isRefutableContext: false)
parseVariablePattern((, typeInfo: Instance of 'NoType')
listener: handleNoType(()
listener: handleVariablePattern(null, a)
listener: handlePatternField(null)
parsePattern(,, precedence: 1, isRefutableContext: false)
parsePrimaryPattern(,, isRefutableContext: false)
parseVariablePattern(,, typeInfo: Instance of 'NoType')
listener: handleNoType(,)
listener: handleVariablePattern(null, b)
listener: handlePatternField(null)
ensureCloseParen(b, ()
listener: handleRecordPattern((, 2)
parseForInRest(), null, for, var, null)
parseForInLoopPartsRest(), null, for, var, null)
listener: beginForInExpression(x)
parseExpression(in)
looksLikeOuterPatternEquals(in)
skipOuterPattern(in)
skipObjectPatternRest(x)
parsePrecedenceExpression(in, 1, true)
parseUnaryExpression(in, true)
parsePrimary(in, expression)
parseSendOrFunctionLiteral(in, expression)
parseSend(in, expression)
isNextIdentifier(in)
ensureIdentifier(in, expression)
listener: handleIdentifier(x, expression)
listener: handleNoTypeArguments())
parseArgumentsOpt(x)
listener: handleNoArguments())
listener: handleSend(x, ))
ensureCloseParen(x, ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, var, in)
listener: beginForInBody({)
parseStatement())
parseStatementX())
parseBlock(), BlockKind(statement))
ensureBlock(), null, null)
listener: beginBlock({, BlockKind(statement))
notEofOrValue(}, })
listener: endBlock(0, {, }, BlockKind(statement))
listener: endForInBody(})
listener: endForIn(})
notEofOrValue(}, })
listener: endBlockFunctionBody(1, {, })
listener: endTopLevelMethod(void, null, })
listener: endTopLevelDeclaration()
reportAllErrorTokens(void)
listener: endCompilationUnit(1, )

View file

@ -0,0 +1,9 @@
void f(x) {
for (var (a, b) in x) {}
}
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
for[KeywordToken] ([BeginToken]var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken]
}[SimpleToken]
[SimpleToken]

View file

@ -0,0 +1,9 @@
void f(x) {
for (var (a, b) in x) {}
}
void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
for[KeywordToken] ([BeginToken]var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken]
}[SimpleToken]
[SimpleToken]

View file

@ -47,8 +47,7 @@ parseUnit(void)
parseForLoopPartsStart(null, for, ForPartsContext(null))
parseExpressionStatementOrDeclaration((, ForPartsContext(null))
parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePattern(var, precedence: 1, isRefutableContext: false)

View file

@ -43,8 +43,7 @@ parseUnit(void)
parseForLoopPartsStart(null, for, ForPartsContext(null))
parseExpressionStatementOrDeclaration((, ForPartsContext(null))
parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePattern(var, precedence: 1, isRefutableContext: false)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -57,8 +57,7 @@ parseUnit(UnmatchedToken({))
parseStatement(;)
parseStatementX(;)
parseExpressionStatementOrDeclarationAfterModifiers(var, ;, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
looksLikeLocalFunction(=)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -39,8 +39,7 @@ parseUnit(void)
parseStatement({)
parseStatementX({)
parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
looksLikeOuterPatternEquals(var)
skipOuterPattern(var)
skipOuterPattern(var)
listener: beginMetadataStar(var)
listener: endMetadataStar(0)
parsePatternVariableDeclarationStatement(var, {, var)

View file

@ -50,7 +50,7 @@ beginCompilationUnit(main)
endRecordLiteral((, 2, null)
handleLiteralList(2, [, null, ])
endForInExpression())
handleForInLoopParts(null, for, (, in)
handleForInLoopParts(null, for, (, null, in)
beginForInBody({)
beginBlock({, BlockKind(statement))
handleIdentifier(print, expression)

View file

@ -71,8 +71,8 @@ parseUnit(main)
listener: endInitializedIdentifier(x)
listener: endVariablesDeclaration(1, null)
listener: handleForInitializerLocalVariableDeclaration(x, true)
parseForInRest(x, null, for, x)
parseForInLoopPartsRest(x, null, for, x)
parseForInRest(x, null, for, null, x)
parseForInLoopPartsRest(x, null, for, null, x)
listener: beginForInExpression([)
parseExpression(in)
parsePrecedenceExpression(in, 1, true)
@ -125,7 +125,7 @@ parseUnit(main)
listener: handleLiteralList(2, [, null, ])
ensureCloseParen(], ()
listener: endForInExpression())
listener: handleForInLoopParts(null, for, (, in)
listener: handleForInLoopParts(null, for, (, null, in)
listener: beginForInBody({)
parseStatement())
parseStatementX())

View file

@ -997,7 +997,7 @@ class TestInfoListener implements Listener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
calls.add('handleForInLoopParts '
'$awaitToken $forToken $leftParenthesis $inKeyword');
}

View file

@ -918,15 +918,17 @@ class ParserTestListener implements Listener {
@override
void handleForInLoopParts(Token? awaitToken, Token forToken,
Token leftParenthesis, Token inKeyword) {
Token leftParenthesis, Token? patternKeyword, Token inKeyword) {
seen(awaitToken);
seen(forToken);
seen(leftParenthesis);
seen(patternKeyword);
seen(inKeyword);
doPrint('handleForInLoopParts('
'$awaitToken, '
'$forToken, '
'$leftParenthesis, '
'$patternKeyword, '
'$inKeyword)');
}

View file

@ -2104,30 +2104,33 @@ class TestParser extends Parser {
}
@override
Token parseForInRest(
Token token, Token? awaitToken, Token forToken, Token identifier) {
Token parseForInRest(Token token, Token? awaitToken, Token forToken,
Token? patternKeyword, Token? identifier) {
doPrint('parseForInRest('
'$token, '
'$awaitToken, '
'$forToken, '
'$patternKeyword, '
'$identifier)');
indent++;
var result = super.parseForInRest(token, awaitToken, forToken, identifier);
var result = super.parseForInRest(
token, awaitToken, forToken, patternKeyword, identifier);
indent--;
return result;
}
@override
Token parseForInLoopPartsRest(
Token token, Token? awaitToken, Token forToken, Token identifier) {
Token parseForInLoopPartsRest(Token token, Token? awaitToken, Token forToken,
Token? patternKeyword, Token? identifier) {
doPrint('parseForInLoopPartsRest('
'$token, '
'$awaitToken, '
'$forToken, '
'$patternKeyword, '
'$identifier)');
indent++;
var result =
super.parseForInLoopPartsRest(token, awaitToken, forToken, identifier);
var result = super.parseForInLoopPartsRest(
token, awaitToken, forToken, patternKeyword, identifier);
indent--;
return result;
}