Version 2.19.0-465.0.dev
Merge 05ee431fb44412f78ffed02c3186236d193f2729 into dev
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index a9ce0bc..1220e11 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2304,6 +2304,9 @@
/// Return the `var` or `final` keyword introducing the pattern.
Token get keyword;
+ /// Returns the annotations associated with this node.
+ NodeList<Annotation> get metadata;
+
/// The pattern that will match the expression.
DartPattern get pattern;
}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 52a6357..f7d7be2 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5069,6 +5069,9 @@
@experimental
class ForEachPartsWithPatternImpl extends ForEachPartsImpl
implements ForEachPartsWithPattern {
+ /// The annotations associated with this node.
+ final NodeListImpl<AnnotationImpl> _metadata = NodeListImpl._();
+
@override
final Token keyword;
@@ -5076,19 +5079,31 @@
final DartPatternImpl pattern;
ForEachPartsWithPatternImpl({
+ required List<AnnotationImpl>? metadata,
required this.keyword,
required this.pattern,
required super.inKeyword,
required super.iterable,
}) {
+ _metadata._initialize(this, metadata);
_becomeParentOf(pattern);
}
@override
- Token get beginToken => keyword;
+ Token get beginToken {
+ if (_metadata.isEmpty) {
+ return keyword;
+ } else {
+ return _metadata.beginToken!;
+ }
+ }
+
+ @override
+ NodeListImpl<AnnotationImpl> get metadata => _metadata;
@override
ChildEntities get _childEntities => ChildEntities()
+ ..addNodeList('metadata', metadata)
..addToken('keyword', keyword)
..addNode('pattern', pattern)
..addAll(super._childEntities);
@@ -5099,6 +5114,7 @@
@override
void visitChildren(AstVisitor visitor) {
+ _metadata.accept(visitor);
pattern.accept(visitor);
super.visitChildren(visitor);
}
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index 298605c..790ca13 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -484,6 +484,7 @@
@override
void visitForEachPartsWithPattern(ForEachPartsWithPattern node) {
+ _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
sink.write(node.keyword.lexeme);
_visitNode(node.pattern);
sink.write(' in ');
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 7f197b8..20b4c2d 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -599,7 +599,8 @@
@override
bool visitForEachPartsWithPattern(ForEachPartsWithPattern node) {
var other = _other as ForEachPartsWithPattern;
- return isEqualTokens(node.keyword, other.keyword) &&
+ return _isEqualNodeLists(node.metadata, other.metadata) &&
+ isEqualTokens(node.keyword, other.keyword) &&
isEqualNodes(node.pattern, other.pattern) &&
isEqualTokens(node.inKeyword, other.inKeyword) &&
isEqualNodes(node.iterable, other.iterable);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index d4d74e0..22e2295 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -4054,10 +4054,9 @@
ForEachPartsImpl forLoopParts;
if (patternKeyword != null) {
- // TODO(paulberry): handle metadata
- // ignore: unused_local_variable
var metadata = pop() as List<AnnotationImpl>?;
forLoopParts = ForEachPartsWithPatternImpl(
+ metadata: metadata,
keyword: patternKeyword,
pattern: variableOrDeclaration as DartPatternImpl,
inKeyword: inKeyword,
diff --git a/pkg/analyzer/test/generated/patterns_parser_test.dart b/pkg/analyzer/test/generated/patterns_parser_test.dart
index 56c8bc4..9512a99 100644
--- a/pkg/analyzer/test/generated/patterns_parser_test.dart
+++ b/pkg/analyzer/test/generated/patterns_parser_test.dart
@@ -6271,7 +6271,7 @@
''');
}
- test_pattern_inForIn_element() {
+ test_pattern_inForIn_element_noMetadata() {
_parse('''
void f(x) => [for (var (a, b) in x) 0];
''');
@@ -6301,7 +6301,42 @@
''');
}
- test_pattern_inForIn_statement() {
+ test_pattern_inForIn_element_withMetadata() {
+ _parse('''
+void f(x) => [for (@annotation var (a, b) in x) 0];
+''');
+ var node = findNode.forElement('for');
+ assertParsedNodeText(node, r'''
+ForElement
+ forKeyword: for
+ leftParenthesis: (
+ forLoopParts: ForEachPartsWithPattern
+ metadata
+ Annotation
+ atSign: @
+ name: SimpleIdentifier
+ token: annotation
+ 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_noMetadata() {
_parse('''
void f(x) {
for (var (a, b) in x) {}
@@ -6334,6 +6369,44 @@
''');
}
+ test_pattern_inForIn_statement_withMetadata() {
+ _parse('''
+void f(x) {
+ for (@annotation var (a, b) in x) {}
+}
+''');
+ var node = findNode.forStatement('for');
+ assertParsedNodeText(node, r'''
+ForStatement
+ forKeyword: for
+ leftParenthesis: (
+ forLoopParts: ForEachPartsWithPattern
+ metadata
+ Annotation
+ atSign: @
+ name: SimpleIdentifier
+ token: annotation
+ 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];
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart
new file mode 100644
index 0000000..d795e2f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart
@@ -0,0 +1 @@
+void f(x) => [for (@annotation var (a, b) in x) 0];
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect
new file mode 100644
index 0000000..d24ff18
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.expect
@@ -0,0 +1,48 @@
+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(@)
+ beginMetadata(@)
+ handleIdentifier(annotation, metadataReference)
+ handleNoTypeArguments(var)
+ handleNoArguments(var)
+ endMetadata(@, null, var)
+ endMetadataStar(1)
+ 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, )
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect
new file mode 100644
index 0000000..1193376
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.intertwined.expect
@@ -0,0 +1,117 @@
+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))
+ parseMetadataStar(()
+ listener: beginMetadataStar(@)
+ parseMetadata(()
+ listener: beginMetadata(@)
+ ensureIdentifier(@, metadataReference)
+ listener: handleIdentifier(annotation, metadataReference)
+ parseQualifiedRestOpt(annotation, metadataContinuation)
+ listener: handleNoTypeArguments(var)
+ parseArgumentsOpt(annotation)
+ listener: handleNoArguments(var)
+ listener: endMetadata(@, null, var)
+ listener: endMetadataStar(1)
+ parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
+ skipOuterPattern(var)
+ 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, )
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.parser.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.parser.expect
new file mode 100644
index 0000000..6b885d2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.parser.expect
@@ -0,0 +1,5 @@
+void f(x) => [for (@annotation var (a, b) in x) 0];
+
+
+void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] =>[SimpleToken] [[BeginToken]for[KeywordToken] ([BeginToken]@[SimpleToken]annotation[StringToken] var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] 0[StringToken]][SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.scanner.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.scanner.expect
new file mode 100644
index 0000000..6b885d2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_element_withMetadata.dart.scanner.expect
@@ -0,0 +1,5 @@
+void f(x) => [for (@annotation var (a, b) in x) 0];
+
+
+void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] =>[SimpleToken] [[BeginToken]for[KeywordToken] ([BeginToken]@[SimpleToken]annotation[StringToken] var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] 0[StringToken]][SimpleToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart
new file mode 100644
index 0000000..fa751cc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart
@@ -0,0 +1,3 @@
+void f(x) {
+ for (@annotation var (a, b) in x) {}
+}
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect
new file mode 100644
index 0000000..d5e68a3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.expect
@@ -0,0 +1,50 @@
+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(@)
+ beginMetadata(@)
+ handleIdentifier(annotation, metadataReference)
+ handleNoTypeArguments(var)
+ handleNoArguments(var)
+ endMetadata(@, null, var)
+ endMetadataStar(1)
+ 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, )
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect
new file mode 100644
index 0000000..8a4314b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.intertwined.expect
@@ -0,0 +1,113 @@
+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))
+ parseMetadataStar(()
+ listener: beginMetadataStar(@)
+ parseMetadata(()
+ listener: beginMetadata(@)
+ ensureIdentifier(@, metadataReference)
+ listener: handleIdentifier(annotation, metadataReference)
+ parseQualifiedRestOpt(annotation, metadataContinuation)
+ listener: handleNoTypeArguments(var)
+ parseArgumentsOpt(annotation)
+ listener: handleNoArguments(var)
+ listener: endMetadata(@, null, var)
+ listener: endMetadataStar(1)
+ parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
+ skipOuterPattern(var)
+ 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, )
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.parser.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.parser.expect
new file mode 100644
index 0000000..91e697a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.parser.expect
@@ -0,0 +1,9 @@
+void f(x) {
+for (@annotation var (a, b) in x) {}
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
+for[KeywordToken] ([BeginToken]@[SimpleToken]annotation[StringToken] var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.scanner.expect b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.scanner.expect
new file mode 100644
index 0000000..91e697a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/patterns/pattern_inForIn_statement_withMetadata.dart.scanner.expect
@@ -0,0 +1,9 @@
+void f(x) {
+for (@annotation var (a, b) in x) {}
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]x[StringToken])[SimpleToken] {[BeginToken]
+for[KeywordToken] ([BeginToken]@[SimpleToken]annotation[StringToken] var[KeywordToken] ([BeginToken]a[StringToken],[SimpleToken] b[StringToken])[SimpleToken] in[KeywordToken] x[StringToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/runtime/tools/heapsnapshot/README b/runtime/tools/heapsnapshot/README
new file mode 100644
index 0000000..626c8e4
--- /dev/null
+++ b/runtime/tools/heapsnapshot/README
@@ -0,0 +1,67 @@
+Examples:
+
+# Load
+load <file>
+
+# Show named sets / known variables
+info
+
+# Find live objects
+closure roots
+
+# or give a name
+all = closure roots
+
+# Look into the object
+stats all
+
+# Filter lists from "all" into "lists"
+lists = filter all _List
+
+# Find empty lists into "empty-lists"
+empty-lists = dfilter lists ==0
+
+# Who's using the empty lists?
+users empty-lists
+
+# print that info (from $0 in this case as we didn't give it a name but it was
+# the first one we didn't give a name)
+stat $0
+
+# Filter more
+empty-growable-lists = filter (users empty-lists) _GrowableList
+
+# Print
+stats empty-growable-lists
+
+# Who's using them?
+retainers empty-growable-lists
+
+# Look into strings next
+strings = filter all String
+
+# What's inside the strings
+dstats strings
+
+# Who's pointing to the big strings?
+retainers (dfilter strings >=1024)
+
+# Small strings
+small-strings = dfilter strings <100
+
+# See them
+dstats small-strings
+
+# Who's retaining the string "foo"
+f = dfilter small-strings foo
+retainters f
+
+# Find stuff with specific field
+hasField = filter all :specificField
+stats closure hasField :specificField
+foo = follow hasField :specificField
+stats closure foo
+
+# Stop the closure search if going into specific files
+stats closure foo ^file1.dart ^file2.dart ^file3.dart
+
diff --git a/tools/VERSION b/tools/VERSION
index 0b1aab7..902592e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 19
PATCH 0
-PRERELEASE 464
+PRERELEASE 465
PRERELEASE_PATCH 0
diff --git a/tools/manage_deps.dart b/tools/manage_deps.dart
index 80b1b56..5283ad1 100755
--- a/tools/manage_deps.dart
+++ b/tools/manage_deps.dart
@@ -146,13 +146,17 @@
'--format=%C(auto) $originUrl/+/%h %s ',
'$currentRev..$target',
], workingDirectory: pkgDir, explanation: 'Listing new commits');
+ // To avoid github notifying issues in the sdk when it sees #issueid
+ // we remove all '#' characters.
+ final cleanedGitLogResult =
+ gitLogResult.map((x) => x.replaceAll('#', '')).join('\n');
final commitMessage = '''
Bump $toUpdate to $target
Changes:
```
> git log --format="%C(auto) %h %s" ${currentRev.substring(0, 7)}..${target.substring(0, 7)}
-${gitLogResult.join('\n')}
+$cleanedGitLogResult
```
Diff: $originUrl/+/$currentRev~..$target/
''';