From e86fe85aa4935474abcbde91bd2fa0c29b66b609 Mon Sep 17 00:00:00 2001
From: Konstantin Shcheglov <scheglov@google.com>
Date: Tue, 7 Feb 2023 22:58:47 +0000
Subject: [PATCH] Suppport ForEachPartsWithPattern in NodeReplacer.

Change-Id: I152f3c7b0500db9ad4ca633dd0f4491cea460f53
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/281465
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
---
 pkg/analyzer/lib/src/dart/ast/utilities.dart    | 10 ++++++++++
 pkg/analyzer/test/generated/utilities_test.dart | 16 ++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 57a0bcdfa638..8093d4041e2b 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -2513,6 +2513,16 @@ class NodeReplacer extends ThrowingAstVisitor<bool> {
     return visitNode(node);
   }
 
+  @override
+  bool? visitForEachPartsWithPattern(ForEachPartsWithPattern node) {
+    if (identical(node.iterable, _oldNode)) {
+      (node as ForEachPartsWithPatternImpl).iterable =
+          _newNode as ExpressionImpl;
+      return true;
+    }
+    return visitNode(node);
+  }
+
   @override
   bool visitForElement(ForElement node) {
     if (identical(node.forLoopParts, _oldNode)) {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index b81bfa49b9b9..729ea55298a8 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -876,6 +876,22 @@ void f() {
     );
   }
 
+  void test_forEachPartsWithPattern() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (var (a) in []) {}
+  for (var (b) in []) {}
+}
+''');
+    _assertReplacementForChildren<ForEachPartsWithPattern>(
+      destination: findNode.forEachPartsWithPattern('(a)'),
+      source: findNode.forEachPartsWithPattern('(b)'),
+      childAccessors: [
+        (node) => node.iterable,
+      ],
+    );
+  }
+
   void test_forEachStatement_withIdentifier() {
     var findNode = _parseStringToFindNode(r'''
 void f(int a) {