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/
 ''';