[cfe] Use (Name)Iterator instead of forEach

- where a closure isn't already available.

Change-Id: I8fb76af6336898a8ccf7f051dc6da665d0c09e55
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/257202
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index b34f25b..661dc70 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -8,6 +8,7 @@
 
 import 'builder/builder.dart';
 import 'builder/library_builder.dart';
+import 'builder/name_iterator.dart';
 import 'builder/prefix_builder.dart';
 
 import 'kernel/utils.dart' show toKernelCombinators;
@@ -18,8 +19,6 @@
 
 import 'source/source_library_builder.dart';
 
-import 'scope.dart' show NameIteratorExtension;
-
 class Import {
   /// The library that is importing [imported];
   final SourceLibraryBuilder importer;
@@ -76,18 +75,28 @@
         prefixBuilder!.addToExportScope(name, member, charOffset);
       };
     }
-    imported!.exportScope
-        .filteredNameIterator(
-            includeDuplicates: false, includeAugmentations: false)
-        .forEach((String name, Builder member) {
+    NameIterator<Builder> iterator = imported!.exportScope.filteredNameIterator(
+        includeDuplicates: false, includeAugmentations: false);
+    while (iterator.moveNext()) {
+      String name = iterator.name;
+      Builder member = iterator.current;
+      bool include = true;
       if (combinators != null) {
         for (CombinatorBuilder combinator in combinators!) {
-          if (combinator.isShow && !combinator.names.contains(name)) return;
-          if (combinator.isHide && combinator.names.contains(name)) return;
+          if (combinator.isShow && !combinator.names.contains(name)) {
+            include = false;
+            break;
+          }
+          if (combinator.isHide && combinator.names.contains(name)) {
+            include = false;
+            break;
+          }
         }
       }
-      add(name, member);
-    });
+      if (include) {
+        add(name, member);
+      }
+    }
     if (prefixBuilder != null) {
       Builder? existing =
           importer.addBuilder(prefix, prefixBuilder!, prefixCharOffset);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index fb34f1a..de9eb8c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -385,12 +385,14 @@
                 coreTypes.objectClass != declarationBuilder.cls,
         benchmarker = libraryBuilder.loader.target.benchmarker,
         this.scope = enclosingScope {
-    formalParameterScope
-        ?.filteredIterator<VariableBuilder>(
-            includeDuplicates: false, includeAugmentations: false)
-        .forEach((VariableBuilder builder) {
-      typeInferrer.assignedVariables.declare(builder.variable!);
-    });
+    Iterator<VariableBuilder>? iterator =
+        formalParameterScope?.filteredIterator<VariableBuilder>(
+            includeDuplicates: false, includeAugmentations: false);
+    if (iterator != null) {
+      while (iterator.moveNext()) {
+        typeInferrer.assignedVariables.declare(iterator.current.variable!);
+      }
+    }
   }
 
   BodyBuilder.withParents(FieldBuilder field, SourceLibraryBuilder part,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 5583a40..a4a152d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -30,6 +30,7 @@
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
+import '../builder/name_iterator.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
@@ -62,7 +63,7 @@
         templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
 import '../problems.dart' show unhandled;
-import '../scope.dart' show AmbiguousBuilder, NameIteratorExtension;
+import '../scope.dart' show AmbiguousBuilder;
 import '../source/name_scheme.dart';
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 import '../source/source_constructor_builder.dart';
@@ -1322,14 +1323,12 @@
           patchConstructorNames.add(name);
         }
       });
-      builder.constructorScope
-          .filteredNameIterator(
-              includeDuplicates: false, includeAugmentations: true)
-          .forEach((String name, Builder builder) {
-        if (builder is ConstructorBuilder) {
-          patchConstructorNames.remove(name);
-        }
-      });
+      NameIterator<ConstructorBuilder> iterator = builder.constructorScope
+          .filteredNameIterator<ConstructorBuilder>(
+              includeDuplicates: false, includeAugmentations: true);
+      while (iterator.moveNext()) {
+        patchConstructorNames.remove(iterator.name);
+      }
       Set<String> kernelConstructorNames =
           cls.constructors.map((c) => c.name.text).toSet().difference({""});
       return kernelConstructorNames.containsAll(patchConstructorNames);
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 472e8b5..247aa38 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -285,13 +285,15 @@
       }
     }
 
-    constructorScope
-        .filteredNameIterator(
-            includeDuplicates: false, includeAugmentations: true)
-        .forEach((String name, Builder constructor) {
+    NameIterator<MemberBuilder> iterator =
+        constructorScope.filteredNameIterator(
+            includeDuplicates: false, includeAugmentations: true);
+    while (iterator.moveNext()) {
+      String name = iterator.name;
+      MemberBuilder constructor = iterator.current;
       Builder? member = scope.lookupLocalMember(name, setter: false);
-      if (member == null) return;
-      if (!member.isStatic) return;
+      if (member == null) continue;
+      if (!member.isStatic) continue;
       // TODO(ahe): Revisit these messages. It seems like the last two should
       // be `context` parameter to this message.
       addProblem(templateConflictsWithMember.withArguments(name),
@@ -308,7 +310,7 @@
             member.charOffset,
             noLength);
       }
-    });
+    }
 
     scope.forEachLocalSetter((String name, Builder setter) {
       Builder? constructor = constructorScope.lookupLocalMember(name);
@@ -1677,10 +1679,10 @@
     }
     int count = constructorReferences!.length;
     if (count != 0) {
-      constructorScope
-          .filteredIterator(
-              parent: this, includeDuplicates: true, includeAugmentations: true)
-          .forEach((MemberBuilder declaration) {
+      Iterator<MemberBuilder> iterator = constructorScope.filteredIterator(
+          parent: this, includeDuplicates: true, includeAugmentations: true);
+      while (iterator.moveNext()) {
+        MemberBuilder declaration = iterator.current;
         if (declaration.parent?.origin != origin) {
           unexpected("$fileUri", "${declaration.parent!.fileUri}", charOffset,
               fileUri);
@@ -1795,7 +1797,7 @@
             }
           }
         }
-      });
+      }
     }
     return count;
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 1589add..4f05bc5 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -343,10 +343,10 @@
           .registerInitializedField(valuesBuilder);
       constructors[""] = synthesizedDefaultConstructorBuilder;
     } else {
-      constructorScope
-          .filteredNameIterator(
-              includeDuplicates: false, includeAugmentations: true)
-          .forEach((name, member) {
+      Iterator<MemberBuilder> iterator = constructorScope.filteredNameIterator(
+          includeDuplicates: false, includeAugmentations: true);
+      while (iterator.moveNext()) {
+        MemberBuilder member = iterator.current;
         if (member is DeclaredSourceConstructorBuilder) {
           member.ensureGrowableFormals();
           member.formals!.insert(
@@ -370,7 +370,7 @@
                   libraryBuilder,
                   charOffset));
         }
-      });
+      }
     }
 
     if (scope.lookupLocalMember("toString", setter: false) == null) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 8c6fbad..da15627 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -241,16 +241,17 @@
 
   int buildBodyNodes({required bool addMembersToLibrary}) {
     int count = 0;
-    scope
-        .filteredIterator<SourceMemberBuilder>(
-            parent: this, includeDuplicates: false, includeAugmentations: true)
-        .forEach((SourceMemberBuilder declaration) {
+    Iterator<SourceMemberBuilder> iterator =
+        scope.filteredIterator<SourceMemberBuilder>(
+            parent: this, includeDuplicates: false, includeAugmentations: true);
+    while (iterator.moveNext()) {
+      SourceMemberBuilder declaration = iterator.current;
       count +=
           declaration.buildBodyNodes((Member member, BuiltMemberKind kind) {
         _buildMember(declaration, member, kind,
             addMembersToLibrary: addMembersToLibrary);
       });
-    });
+    }
     return count;
   }
 
@@ -289,15 +290,13 @@
       }
     }
 
-    void build(SourceMemberBuilder member) {
-      member.buildOutlineExpressions(
+    Iterator<SourceMemberBuilder> iterator =
+        scope.filteredIterator<SourceMemberBuilder>(
+            parent: this, includeDuplicates: false, includeAugmentations: true);
+    while (iterator.moveNext()) {
+      iterator.current.buildOutlineExpressions(
           classHierarchy, delayedActionPerformers, delayedDefaultValueCloners);
     }
-
-    scope
-        .filteredIterator<SourceMemberBuilder>(
-            parent: this, includeDuplicates: false, includeAugmentations: true)
-        .forEach(build);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 93f8034..592cd5e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -1385,18 +1385,19 @@
       import.finalizeImports(this);
     }
     if (!explicitCoreImport) {
-      loader.coreLibrary.exportScope
+      NameIterator<Builder> iterator = loader.coreLibrary.exportScope
           .filteredNameIterator(
-              includeDuplicates: false, includeAugmentations: false)
-          .forEach((String name, Builder member) {
-        addToScope(name, member, -1, true);
-      });
+              includeDuplicates: false, includeAugmentations: false);
+      while (iterator.moveNext()) {
+        addToScope(iterator.name, iterator.current, -1, true);
+      }
     }
 
-    exportScope
-        .filteredNameIterator(
-            includeDuplicates: false, includeAugmentations: false)
-        .forEach((String name, Builder member) {
+    NameIterator<Builder> iterator = exportScope.filteredNameIterator(
+        includeDuplicates: false, includeAugmentations: false);
+    while (iterator.moveNext()) {
+      String name = iterator.name;
+      Builder member = iterator.current;
       if (member.parent != this) {
         if (member is DynamicTypeDeclarationBuilder) {
           assert(name == 'dynamic',
@@ -1446,7 +1447,7 @@
           }
         }
       }
-    });
+    }
   }
 
   @override
@@ -3753,10 +3754,11 @@
           count += computeDefaultTypesForVariables(declaration.typeVariables,
               inErrorRecovery: issues.isNotEmpty);
 
-          declaration.constructorScope
-              .filteredNameIterator(
-                  includeDuplicates: false, includeAugmentations: true)
-              .forEach((String name, Builder member) {
+          Iterator<MemberBuilder> iterator = declaration.constructorScope
+              .filteredIterator(
+                  includeDuplicates: false, includeAugmentations: true);
+          while (iterator.moveNext()) {
+            MemberBuilder member = iterator.current;
             List<FormalParameterBuilder>? formals;
             if (member is SourceFactoryBuilder) {
               assert(member.isFactory,
@@ -3780,7 +3782,7 @@
                     formal.type);
               }
             }
-          });
+          }
         }
         declaration.forEach((String name, Builder member) {
           if (member is SourceProcedureBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 2a0c8b5..b3ef27c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1359,14 +1359,14 @@
       wasChanged = false;
       for (SourceLibraryBuilder exported in both) {
         for (Export export in exported.exporters) {
-          exported.exportScope
+          NameIterator<Builder> iterator = exported.exportScope
               .filteredNameIterator(
-                  includeDuplicates: false, includeAugmentations: false)
-              .forEach((String name, Builder member) {
-            if (export.addToExportScope(name, member)) {
+                  includeDuplicates: false, includeAugmentations: false);
+          while (iterator.moveNext()) {
+            if (export.addToExportScope(iterator.name, iterator.current)) {
               wasChanged = true;
             }
-          });
+          }
         }
       }
     } while (wasChanged);
@@ -1392,19 +1392,19 @@
     _builders.forEach((Uri uri, dynamic l) {
       SourceLibraryBuilder library = l;
       Set<Builder> members = new Set<Builder>();
-      Iterator<Builder> iterator = library.localMembersIterator;
-      while (iterator.moveNext()) {
-        members.add(iterator.current);
+      Iterator<Builder> memberIterator = library.localMembersIterator;
+      while (memberIterator.moveNext()) {
+        members.add(memberIterator.current);
       }
       List<String> exports = <String>[];
-      library.exportScope
+      NameIterator<Builder> exportsIterator = library.exportScope
           .filteredNameIterator(
-              includeDuplicates: true, includeAugmentations: false)
-          .forEach((String name, Builder member) {
-        if (!members.contains(member)) {
-          exports.add(name);
+              includeDuplicates: true, includeAugmentations: false);
+      while (exportsIterator.moveNext()) {
+        if (!members.contains(exportsIterator.current)) {
+          exports.add(exportsIterator.name);
         }
-      });
+      }
       if (exports.isNotEmpty) {
         print("$uri exports $exports");
       }