mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:18:13 +00:00
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:
parent
ff87b5ea8e
commit
e9a1248fc2
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) =>
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
void f(x) => [for (var (a, b) in x) 0];
|
|
@ -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, )
|
|
@ -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, )
|
|
@ -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]
|
|
@ -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]
|
|
@ -0,0 +1,3 @@
|
|||
void f(x) {
|
||||
for (var (a, b) in x) {}
|
||||
}
|
|
@ -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, )
|
|
@ -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, )
|
|
@ -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]
|
|
@ -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]
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
|
|
@ -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)');
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue