[cfe] Cleanup NameSpace

This remove part of the NameSpace to avoid an overreliance on its implementation. This is done in preparation for hold the name space content in a single map instead of a separate map for getables and setables.

The NamedBuilder interfaces is added to use for Builders that can be mapped in name spaces. This avoids the need for the NameIterator and all the associated methods.

Change-Id: Ia547bdc8ddcb83f47473b51a2059428b352f8916
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428001
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/base/export.dart b/pkg/front_end/lib/src/base/export.dart
index 41a6da2..43f1c34 100644
--- a/pkg/front_end/lib/src/base/export.dart
+++ b/pkg/front_end/lib/src/base/export.dart
@@ -31,7 +31,7 @@
   /// This set in [SourceLibraryBuilder._addDependencies].
   late final LibraryDependency libraryDependency;
 
-  bool addToExportScope(String name, Builder member) {
+  bool addToExportScope(String name, NamedBuilder member) {
     if (combinators != null) {
       for (CombinatorBuilder combinator in combinators!) {
         if (combinator.isShow && !combinator.names.contains(name)) return false;
diff --git a/pkg/front_end/lib/src/base/import.dart b/pkg/front_end/lib/src/base/import.dart
index 96876c2..58da04c 100644
--- a/pkg/front_end/lib/src/base/import.dart
+++ b/pkg/front_end/lib/src/base/import.dart
@@ -6,7 +6,6 @@
 
 import '../builder/builder.dart';
 import '../builder/library_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/prefix_builder.dart';
 import '../source/source_library_builder.dart';
 import 'combinator.dart' show CombinatorBuilder;
@@ -69,11 +68,11 @@
   void finalizeImports(SourceCompilationUnit importer) {
     if (nativeImportPath != null) return;
 
-    void Function(String, Builder) add;
+    void Function(String, NamedBuilder) add;
 
     PrefixFragment? prefixFragment = this.prefixFragment;
     if (prefixFragment == null) {
-      add = (String name, Builder builder) {
+      add = (String name, NamedBuilder builder) {
         importer.addImportedBuilderToScope(
             name: name, builder: builder, charOffset: importOffset);
       };
@@ -86,16 +85,16 @@
             charOffset: prefixOffset);
       }
 
-      add = (String name, Builder member) {
+      add = (String name, NamedBuilder member) {
         prefixFragment.builder.addToPrefixScope(name, member,
             importOffset: importOffset, prefixOffset: prefixOffset);
       };
     }
-    NameIterator<Builder> iterator = importedLibraryBuilder!.exportNameSpace
-        .filteredNameIterator(includeDuplicates: false);
+    Iterator<NamedBuilder> iterator = importedLibraryBuilder!.exportNameSpace
+        .filteredIterator(includeDuplicates: false);
     while (iterator.moveNext()) {
-      String name = iterator.name;
-      Builder member = iterator.current;
+      NamedBuilder member = iterator.current;
+      String name = member.name;
       bool include = true;
       if (combinators != null) {
         for (CombinatorBuilder combinator in combinators!) {
diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart
index 3067a19..2551527 100644
--- a/pkg/front_end/lib/src/base/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/base/incremental_compiler.dart
@@ -8,6 +8,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show ScannerConfiguration;
+import 'package:front_end/src/base/name_space.dart';
 import 'package:kernel/binary/ast_from_binary.dart'
     show
         BinaryBuilderWithMetadata,
@@ -65,13 +66,12 @@
 import '../api_prototype/lowering_predicates.dart'
     show isExtensionThisName, syntheticThisName;
 import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
-import '../builder/builder.dart' show Builder;
+import '../builder/builder.dart' show Builder, NamedBuilder;
 import '../builder/declaration_builders.dart'
     show ClassBuilder, ExtensionBuilder, ExtensionTypeDeclarationBuilder;
 import '../builder/library_builder.dart'
     show CompilationUnit, LibraryBuilder, SourceCompilationUnit;
 import '../builder/member_builder.dart' show MemberBuilder;
-import '../builder/name_iterator.dart' show NameIterator;
 import '../builder/property_builder.dart';
 import '../codes/cfe_codes.dart';
 import '../dill/dill_class_builder.dart' show DillClassBuilder;
@@ -99,10 +99,9 @@
 import 'hybrid_file_system.dart' show HybridFileSystem;
 import 'incremental_serializer.dart' show IncrementalSerializer;
 import 'library_graph.dart' show LibraryGraph;
-import 'lookup_result.dart';
 import 'ticker.dart' show Ticker;
 import 'uri_translator.dart' show UriTranslator;
-import 'uris.dart' show dartCore, getPartUri;
+import 'uris.dart' show getPartUri;
 
 final Uri dartFfiUri = Uri.parse("dart:ffi");
 
@@ -594,10 +593,11 @@
         /// source builders. Patch that up.
 
         // Maps from old library builder to map of new content.
-        Map<LibraryBuilder, Map<String, Builder>>? replacementMap = {};
+        Map<LibraryBuilder, Map<String, NamedBuilder>>? replacementMap = {};
 
         // Maps from old library builder to map of new content.
-        Map<LibraryBuilder, Map<String, Builder>>? replacementSettersMap = {};
+        Map<LibraryBuilder, Map<String, NamedBuilder>>? replacementSettersMap =
+            {};
 
         _experimentalInvalidationFillReplacementMaps(
             convertedLibraries!, replacementMap, replacementSettersMap);
@@ -609,10 +609,10 @@
 
             // Clear cached calculations that points (potential) to now replaced
             // things.
-            for (Builder builder in builder.libraryNameSpace.localMembers) {
-              if (builder is DillClassBuilder) {
-                builder.clearCachedValues();
-              }
+            Iterator<DillClassBuilder> iterator = builder.libraryNameSpace
+                .filteredIterator(includeDuplicates: true);
+            while (iterator.moveNext()) {
+              iterator.current.clearCachedValues();
             }
           }
         }
@@ -652,62 +652,10 @@
   // Coverage-ignore(suite): Not run.
   String? _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
       DillLibraryBuilder dillLibraryBuilder) {
-    bool isEquivalent = true;
-    StringBuffer sb = new StringBuffer();
-    sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
-    sourceLibraryBuilder.exportNameSpace
-        .forEachLocalMember((String name, Builder sourceBuilder) {
-      Builder? dillBuilder =
-          dillLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.getable;
-      if (dillBuilder == null) {
-        if ((name == 'dynamic' || name == 'Never') &&
-            sourceLibraryBuilder.importUri == dartCore) {
-          // The source library builder for dart:core has synthetically
-          // injected builders for `dynamic` and `Never` which do not have
-          // corresponding classes in the AST.
-          return;
-        }
-        sb.writeln('No dill builder for ${name}: $sourceBuilder');
-        isEquivalent = false;
-      }
-    });
-    dillLibraryBuilder.exportNameSpace
-        .forEachLocalMember((String name, Builder dillBuilder) {
-      Builder? sourceBuilder =
-          sourceLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.getable;
-      if (sourceBuilder == null) {
-        sb.writeln('No source builder for ${name}: $dillBuilder');
-        isEquivalent = false;
-      }
-    });
-    sourceLibraryBuilder.exportNameSpace
-        .forEachLocalSetter((String name, Builder sourceBuilder) {
-      Builder? dillBuilder =
-          dillLibraryBuilder.exportNameSpace.lookupLocalMember(name)?.setable;
-      if (dillBuilder == null) {
-        sb.writeln('No dill builder for ${name}=: $sourceBuilder');
-        isEquivalent = false;
-      }
-    });
-    dillLibraryBuilder.exportNameSpace
-        .forEachLocalSetter((String name, Builder dillBuilder) {
-      LookupResult? result =
-          sourceLibraryBuilder.exportNameSpace.lookupLocalMember(name);
-      Builder? sourceBuilder = result?.setable;
-      if (sourceBuilder == null) {
-        sourceBuilder = result?.getable;
-        if (sourceBuilder is PropertyBuilder && sourceBuilder.hasSetter) {
-          // Assignable fields can be lowered into a getter and setter.
-          return;
-        }
-        sb.writeln('No source builder for ${name}=: $dillBuilder');
-        isEquivalent = false;
-      }
-    });
-    if (isEquivalent) {
-      return null;
-    }
-    return sb.toString();
+    return areNameSpacesEquivalent(
+        importUri: sourceLibraryBuilder.importUri,
+        sourceNameSpace: sourceLibraryBuilder.exportNameSpace,
+        dillNameSpace: dillLibraryBuilder.exportNameSpace);
   }
 
   /// Compute which libraries to output and which (previous) errors/warnings we
@@ -819,24 +767,24 @@
   /// happen because of experimental invalidation.
   void _experimentalInvalidationFillReplacementMaps(
       Map<LibraryBuilder, CompilationUnit> rebuildBodiesMap,
-      Map<LibraryBuilder, Map<String, Builder>> replacementMap,
-      Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap) {
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap,
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementSettersMap) {
     for (MapEntry<LibraryBuilder, CompilationUnit> entry
         in rebuildBodiesMap.entries) {
-      Map<String, Builder> childReplacementMap = {};
-      Map<String, Builder> childReplacementSettersMap = {};
+      Map<String, NamedBuilder> childReplacementMap = {};
+      Map<String, NamedBuilder> childReplacementSettersMap = {};
       CompilationUnit mainCompilationUnit = rebuildBodiesMap[entry.key]!;
       replacementMap[entry.key] = childReplacementMap;
       replacementSettersMap[entry.key] = childReplacementSettersMap;
-      NameIterator iterator =
-          mainCompilationUnit.libraryBuilder.localMembersNameIterator;
+      Iterator<NamedBuilder> iterator =
+          mainCompilationUnit.libraryBuilder.localMembersIterator;
       while (iterator.moveNext()) {
-        Builder childBuilder = iterator.current;
+        NamedBuilder childBuilder = iterator.current;
         if (childBuilder is SourceExtensionBuilder &&
             childBuilder.isUnnamedExtension) {
           continue;
         }
-        String name = iterator.name;
+        String name = childBuilder.name;
         Map<String, Builder> map;
         if (isMappedAsSetter(childBuilder)) {
           map = childReplacementSettersMap;
@@ -889,10 +837,10 @@
       Map<DillLibraryBuilder, CompilationUnit> rebuildBodiesMap) {
     if (experimentalInvalidation != null) {
       // Maps from old library builder to map of new content.
-      Map<LibraryBuilder, Map<String, Builder>> replacementMap = {};
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap = {};
 
       // Maps from old library builder to map of new content.
-      Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap = {};
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementSettersMap = {};
 
       _experimentalInvalidationFillReplacementMaps(
           rebuildBodiesMap, replacementMap, replacementSettersMap);
@@ -961,10 +909,10 @@
         if (builder.isBuiltAndMarked) {
           // Clear cached calculations in classes which upon calculation can
           // mark things as needed.
-          for (Builder builder in builder.libraryNameSpace.localMembers) {
-            if (builder is DillClassBuilder) {
-              builder.clearCachedValues();
-            }
+          Iterator<DillClassBuilder> iterator = builder.libraryNameSpace
+              .filteredIterator(includeDuplicates: true);
+          while (iterator.moveNext()) {
+            iterator.current.clearCachedValues();
           }
           builder.isBuiltAndMarked = false;
         }
@@ -1883,7 +1831,7 @@
               packageLanguageVersion:
                   new ImplicitLanguageVersion(libraryBuilder.languageVersion),
               loader: lastGoodKernelTarget.loader,
-              nameOrigin: libraryBuilder,
+              resolveInLibrary: libraryBuilder,
               isUnsupported: libraryBuilder.isUnsupported,
               forAugmentationLibrary: false,
               forPatchLibrary: false,
@@ -1897,17 +1845,6 @@
 
       SourceLibraryBuilder debugLibrary = debugCompilationUnit.createLibrary();
       debugLibrary.buildNameSpace();
-      libraryBuilder.libraryNameSpace.forEachLocalMember((name, member) {
-        debugLibrary.libraryNameSpace
-            .addLocalMember(name, member, setter: false);
-      });
-      libraryBuilder.libraryNameSpace.forEachLocalSetter((name, member) {
-        debugLibrary.libraryNameSpace
-            .addLocalMember(name, member, setter: true);
-      });
-      libraryBuilder.libraryNameSpace.forEachLocalExtension((member) {
-        debugLibrary.libraryNameSpace.addExtension(member);
-      });
       debugLibrary.buildScopes(lastGoodKernelTarget.loader.coreLibrary);
       _ticker.logMs("Created debug library");
 
@@ -1939,7 +1876,6 @@
         debugLibrary.addImportsToScope();
         _ticker.logMs("Added imports");
       }
-      SourceCompilationUnit? orgCompilationUnit = debugCompilationUnit;
       debugCompilationUnit = new SourceCompilationUnitImpl(
           importUri: libraryUri,
           fileUri: debugExprUri,
@@ -1947,7 +1883,7 @@
           packageLanguageVersion:
               new ImplicitLanguageVersion(libraryBuilder.languageVersion),
           loader: lastGoodKernelTarget.loader,
-          nameOrigin: libraryBuilder,
+          resolveInLibrary: libraryBuilder,
           parentScope: debugCompilationUnit.compilationUnitScope,
           isUnsupported: libraryBuilder.isUnsupported,
           forAugmentationLibrary: false,
@@ -1962,24 +1898,6 @@
 
       debugLibrary = debugCompilationUnit.createLibrary();
 
-      // Copy over the prefix namespace for extensions
-      // (`forEachExtensionInScope`) to be found when imported via prefixes.
-      // TODO(johnniwinther): Do we still need these with the new scope
-      //  structure?
-      orgCompilationUnit.prefixNameSpace.forEachLocalMember((name, member) {
-        debugCompilationUnit.prefixNameSpace
-            .addLocalMember(name, member, setter: false);
-      });
-      // Does a prefix namespace ever have anything but locals?
-      orgCompilationUnit.prefixNameSpace.forEachLocalSetter((name, member) {
-        debugCompilationUnit.prefixNameSpace
-            .addLocalMember(name, member, setter: true);
-      });
-      orgCompilationUnit.prefixNameSpace.forEachLocalExtension((member) {
-        debugCompilationUnit.prefixNameSpace.addExtension(member);
-      });
-      orgCompilationUnit = null;
-
       HybridFileSystem hfs =
           lastGoodKernelTarget.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
diff --git a/pkg/front_end/lib/src/base/lookup_result.dart b/pkg/front_end/lib/src/base/lookup_result.dart
index 842bccb..34b3401 100644
--- a/pkg/front_end/lib/src/base/lookup_result.dart
+++ b/pkg/front_end/lib/src/base/lookup_result.dart
@@ -7,16 +7,17 @@
 import 'scope.dart';
 
 abstract class LookupResult {
-  /// The [Builder] used for reading this entity, if any.
-  Builder? get getable;
+  /// The [NamedBuilder] used for reading this entity, if any.
+  NamedBuilder? get getable;
 
-  /// The [Builder] used for writing to this entity, if any.
-  Builder? get setable;
+  /// The [NamedBuilder] used for writing to this entity, if any.
+  NamedBuilder? get setable;
 
   /// Creates a [LookupResult] for [getable] and [setable] which filters
   /// instance members if [staticOnly] is `true`, and creates an
   /// [AmbiguousBuilder] for duplicates using [fileUri] and [fileOffset].
-  static LookupResult? createProcessedResult(Builder? getable, Builder? setable,
+  static LookupResult? createProcessedResult(
+      NamedBuilder? getable, NamedBuilder? setable,
       {required String name,
       required Uri fileUri,
       required int fileOffset,
@@ -50,11 +51,13 @@
     return _fromBuilders(getable, setable, assertNoGetterSetterConflict: true);
   }
 
-  static LookupResult? createResult(Builder? getable, Builder? setable) {
+  static LookupResult? createResult(
+      NamedBuilder? getable, NamedBuilder? setable) {
     return _fromBuilders(getable, setable, assertNoGetterSetterConflict: false);
   }
 
-  static LookupResult? _fromBuilders(Builder? getable, Builder? setable,
+  static LookupResult? _fromBuilders(
+      NamedBuilder? getable, NamedBuilder? setable,
       {required bool assertNoGetterSetterConflict}) {
     if (getable is LookupResult) {
       LookupResult lookupResult = getable as LookupResult;
@@ -98,30 +101,30 @@
 
 class GetableResult implements LookupResult {
   @override
-  final Builder getable;
+  final NamedBuilder getable;
 
   GetableResult(this.getable);
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 }
 
 class SetableResult implements LookupResult {
   @override
-  final Builder setable;
+  final NamedBuilder setable;
 
   SetableResult(this.setable);
 
   @override
-  Builder? get getable => null;
+  NamedBuilder? get getable => null;
 }
 
 class GetableSetableResult implements LookupResult {
   @override
-  final Builder getable;
+  final NamedBuilder getable;
 
   @override
-  final Builder setable;
+  final NamedBuilder setable;
 
   GetableSetableResult(this.getable, this.setable);
 }
diff --git a/pkg/front_end/lib/src/base/name_space.dart b/pkg/front_end/lib/src/base/name_space.dart
index 2114c26..9d6a3faef 100644
--- a/pkg/front_end/lib/src/base/name_space.dart
+++ b/pkg/front_end/lib/src/base/name_space.dart
@@ -6,13 +6,14 @@
 import '../builder/declaration_builders.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
-import '../builder/name_iterator.dart';
+import '../builder/property_builder.dart';
 import '../dill/dill_library_builder.dart';
 import 'lookup_result.dart';
 import 'scope.dart';
+import 'uris.dart';
 
 abstract class NameSpace {
-  void addLocalMember(String name, Builder member, {required bool setter});
+  void addLocalMember(String name, NamedBuilder member, {required bool setter});
 
   /// Adds [builder] to the extensions in this name space.
   void addExtension(ExtensionBuilder builder);
@@ -36,24 +37,11 @@
   /// name space without any filtering or processed of duplicates.
   LookupResult? lookupLocalMember(String name);
 
-  void forEachLocalMember(void Function(String name, Builder member) f);
-
-  void forEachLocalSetter(void Function(String name, MemberBuilder member) f);
-
   void forEachLocalExtension(void Function(ExtensionBuilder member) f);
 
-  Iterable<Builder> get localMembers;
-
   /// Returns an iterator of all members and setters mapped in this name space,
   /// including duplicate members mapped to the same name.
-  Iterator<Builder> get unfilteredIterator;
-
-  /// Returns an iterator of all members and setters mapped in this name space,
-  /// including duplicate members mapped to the same name.
-  ///
-  /// Compared to [unfilteredIterator] this iterator also gives access to the
-  /// name that the builders are mapped to.
-  NameIterator get unfilteredNameIterator;
+  Iterator<NamedBuilder> get unfilteredIterator;
 
   /// Returns a filtered iterator of members and setters mapped in this name
   /// space.
@@ -62,20 +50,7 @@
   /// declared in [parent] are included. If [includeDuplicates] is `true`, all
   /// duplicates of the same name are included, otherwise, only the first
   /// declared member is included.
-  Iterator<T> filteredIterator<T extends Builder>(
-      {required bool includeDuplicates});
-
-  /// Returns a filtered iterator of members and setters mapped in this name
-  /// space.
-  ///
-  /// Only members of type [T] are included. If [parent] is provided, on members
-  /// declared in [parent] are included. If [includeDuplicates] is `true`, all
-  /// duplicates of the same name are included, otherwise, only the first
-  /// declared member is included.
-  ///
-  /// Compared to [filteredIterator] this iterator also gives access to the
-  /// name that the builders are mapped to.
-  NameIterator<T> filteredNameIterator<T extends Builder>(
+  Iterator<T> filteredIterator<T extends NamedBuilder>(
       {required bool includeDuplicates});
 }
 
@@ -84,19 +59,10 @@
 
   void addConstructor(String name, MemberBuilder builder);
 
-  void forEachConstructor(void Function(String, MemberBuilder) f);
-
   /// Returns an iterator of all constructors mapped in this scope,
   /// including duplicate constructors mapped to the same name.
   Iterator<MemberBuilder> get unfilteredConstructorIterator;
 
-  /// Returns an iterator of all constructors mapped in this scope,
-  /// including duplicate constructors mapped to the same name.
-  ///
-  /// Compared to [unfilteredConstructorIterator] this iterator also gives
-  /// access to the name that the builders are mapped to.
-  NameIterator<MemberBuilder> get unfilteredConstructorNameIterator;
-
   /// Returns a filtered iterator of constructors mapped in this scope.
   ///
   /// Only members of type [T] are included. If [parent] is provided, on members
@@ -105,37 +71,26 @@
   /// declared member is included.
   Iterator<T> filteredConstructorIterator<T extends MemberBuilder>(
       {required bool includeDuplicates});
-
-  /// Returns a filtered iterator of constructors mapped in this scope.
-  ///
-  /// Only members of type [T] are included. If [parent] is provided, on members
-  /// declared in [parent] are included. If [includeDuplicates] is `true`, all
-  /// duplicates of the same name are included, otherwise, only the first
-  /// declared member is included.
-  ///
-  /// Compared to [filteredConstructorIterator] this iterator also gives access
-  /// to the name that the builders are mapped to.
-  NameIterator<T> filteredConstructorNameIterator<T extends MemberBuilder>(
-      {required bool includeDuplicates});
 }
 
 class NameSpaceImpl implements NameSpace {
-  Map<String, Builder>? _getables;
-  Map<String, MemberBuilder>? _setables;
+  Map<String, NamedBuilder>? _getables;
+  Map<String, NamedBuilder>? _setables;
   Set<ExtensionBuilder>? _extensions;
 
   NameSpaceImpl(
-      {Map<String, Builder>? getables,
-      Map<String, MemberBuilder>? setables,
+      {Map<String, NamedBuilder>? getables,
+      Map<String, NamedBuilder>? setables,
       Set<ExtensionBuilder>? extensions})
       : _getables = getables,
         _setables = setables,
         _extensions = extensions;
 
   @override
-  void addLocalMember(String name, Builder member, {required bool setter}) {
+  void addLocalMember(String name, NamedBuilder member,
+      {required bool setter}) {
     if (setter) {
-      (_setables ??= {})[name] = member as MemberBuilder;
+      (_setables ??= {})[name] = member;
     } else {
       (_getables ??= {})[name] = member;
     }
@@ -147,54 +102,24 @@
   }
 
   @override
-  Iterator<T> filteredIterator<T extends Builder>(
+  Iterator<T> filteredIterator<T extends NamedBuilder>(
       {required bool includeDuplicates}) {
     return new FilteredIterator<T>(unfilteredIterator,
         includeDuplicates: includeDuplicates);
   }
 
   @override
-  NameIterator<T> filteredNameIterator<T extends Builder>(
-      {required bool includeDuplicates}) {
-    return new FilteredNameIterator<T>(unfilteredNameIterator,
-        includeDuplicates: includeDuplicates);
-  }
-
-  @override
   void forEachLocalExtension(void Function(ExtensionBuilder member) f) {
     _extensions?.forEach(f);
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void forEachLocalMember(void Function(String name, Builder member) f) {
-    if (_getables != null) {
-      for (MapEntry<String, Builder> entry in _getables!.entries) {
-        f(entry.key, entry.value);
-      }
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void forEachLocalSetter(void Function(String name, MemberBuilder member) f) {
-    if (_setables != null) {
-      for (MapEntry<String, MemberBuilder> entry in _setables!.entries) {
-        f(entry.key, entry.value);
-      }
-    }
-  }
-
-  @override
-  Iterable<Builder> get localMembers => _getables?.values ?? const [];
-
-  @override
   LookupResult? lookupLocal(String name,
       {required Uri fileUri,
       required int fileOffset,
       required bool staticOnly}) {
-    Builder? getable = _getables?[name];
-    Builder? setable = _setables?[name];
+    NamedBuilder? getable = _getables?[name];
+    NamedBuilder? setable = _setables?[name];
     return LookupResult.createProcessedResult(getable, setable,
         name: name,
         fileUri: fileUri,
@@ -208,14 +133,89 @@
   }
 
   @override
-  Iterator<Builder> get unfilteredIterator => new ScopeIterator(
+  Iterator<NamedBuilder> get unfilteredIterator => new ScopeIterator(
       _getables?.values.iterator,
       _setables?.values.iterator,
       _extensions?.iterator);
+}
 
-  @override
-  NameIterator<Builder> get unfilteredNameIterator =>
-      new ScopeNameIterator(_getables, _setables, _extensions?.iterator);
+// Coverage-ignore(suite): Not run.
+/// Returns a string with an error message if [sourceNameSpace] and
+/// [dillNameSpace] are not equivalent.
+///
+/// This should be used for assertions only.
+String? areNameSpacesEquivalent(
+    {required Uri importUri,
+    required NameSpace sourceNameSpace,
+    required NameSpace dillNameSpace}) {
+  sourceNameSpace as NameSpaceImpl;
+  dillNameSpace as NameSpaceImpl;
+
+  Map<String, NamedBuilder>? sourceGetables = sourceNameSpace._getables;
+  Map<String, NamedBuilder>? sourceSetables = sourceNameSpace._setables;
+
+  Map<String, NamedBuilder>? dillGetables = dillNameSpace._getables;
+  Map<String, NamedBuilder>? dillSetables = dillNameSpace._setables;
+
+  bool isEquivalent = true;
+  StringBuffer sb = new StringBuffer();
+  sb.writeln('Mismatch on ${importUri}:');
+  if (sourceGetables != null) {
+    for (MapEntry<String, NamedBuilder> sourceEntry in sourceGetables.entries) {
+      Builder? dillBuilder = dillGetables?[sourceEntry.key];
+      if (dillBuilder == null) {
+        if ((sourceEntry.key == 'dynamic' || sourceEntry.key == 'Never') &&
+            importUri == dartCore) {
+          // The source library builder for dart:core has synthetically
+          // injected builders for `dynamic` and `Never` which do not have
+          // corresponding classes in the AST.
+          continue;
+        }
+        sb.writeln(
+            'No dill builder for ${sourceEntry.key}: ${sourceEntry.value}');
+        isEquivalent = false;
+      }
+    }
+  }
+  if (dillGetables != null) {
+    for (MapEntry<String, NamedBuilder> dillEntry in dillGetables.entries) {
+      Builder? sourceBuilder = sourceGetables?[dillEntry.key];
+      if (sourceBuilder == null) {
+        sb.writeln(
+            'No source builder for ${dillEntry.key}: ${dillEntry.value}');
+        isEquivalent = false;
+      }
+    }
+  }
+  if (sourceSetables != null) {
+    for (MapEntry<String, NamedBuilder> sourceEntry in sourceSetables.entries) {
+      Builder? dillBuilder = dillGetables?[sourceEntry.key];
+      if (dillBuilder == null) {
+        sb.writeln(
+            'No dill builder for ${sourceEntry.key}=: ${sourceEntry.value}');
+        isEquivalent = false;
+      }
+    }
+  }
+  if (dillSetables != null) {
+    for (MapEntry<String, NamedBuilder> dillEntry in dillSetables.entries) {
+      Builder? sourceBuilder = sourceSetables?[dillEntry.key];
+      if (sourceBuilder == null) {
+        sourceBuilder = sourceGetables?[dillEntry.key];
+        if (sourceBuilder is PropertyBuilder && sourceBuilder.hasSetter) {
+          // Assignable fields can be lowered into a getter and setter.
+          continue;
+        }
+        sb.writeln(
+            'No source builder for ${dillEntry.key}=: ${dillEntry.value}');
+        isEquivalent = false;
+      }
+    }
+  }
+  if (isEquivalent) {
+    return null;
+  }
+  return sb.toString();
 }
 
 class DeclarationNameSpaceImpl extends NameSpaceImpl
@@ -244,28 +244,11 @@
       new ConstructorNameSpaceIterator(_constructors?.values.iterator);
 
   @override
-  NameIterator<MemberBuilder> get unfilteredConstructorNameIterator =>
-      new ConstructorNameSpaceNameIterator(
-          _constructors?.keys.iterator, _constructors?.values.iterator);
-
-  @override
   Iterator<T> filteredConstructorIterator<T extends MemberBuilder>(
       {required bool includeDuplicates}) {
     return new FilteredIterator<T>(unfilteredConstructorIterator,
         includeDuplicates: includeDuplicates);
   }
-
-  @override
-  NameIterator<T> filteredConstructorNameIterator<T extends MemberBuilder>(
-      {required bool includeDuplicates}) {
-    return new FilteredNameIterator<T>(unfilteredConstructorNameIterator,
-        includeDuplicates: includeDuplicates);
-  }
-
-  @override
-  void forEachConstructor(void Function(String, MemberBuilder) f) {
-    _constructors?.forEach(f);
-  }
 }
 
 abstract class LazyNameSpace extends NameSpaceImpl {
@@ -273,13 +256,13 @@
   void ensureNameSpace();
 
   @override
-  Map<String, Builder>? get _getables {
+  Map<String, NamedBuilder>? get _getables {
     ensureNameSpace();
     return super._getables;
   }
 
   @override
-  Map<String, MemberBuilder>? get _setables {
+  Map<String, NamedBuilder>? get _setables {
     ensureNameSpace();
     return super._setables;
   }
@@ -315,8 +298,9 @@
   /// Patch up the scope, using the two replacement maps to replace builders in
   /// scope. The replacement maps from old LibraryBuilder to map, mapping
   /// from name to new (replacement) builder.
-  void patchUpScope(Map<LibraryBuilder, Map<String, Builder>> replacementMap,
-      Map<LibraryBuilder, Map<String, Builder>> replacementMapSetters) {
+  void patchUpScope(
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap,
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMapSetters) {
     // In the following we refer to non-setters as 'getters' for brevity.
     //
     // We have to replace all getters and setters in [_locals] and [_setters]
@@ -346,10 +330,10 @@
         // We start be collecting the relation between an existing getter/setter
         // and the getter/setter that will replace it. This information is used
         // below to handle all the different cases that can occur.
-        Builder? existingGetter = _getables?[name];
+        NamedBuilder? existingGetter = _getables?[name];
         LibraryBuilder? replacementLibraryBuilderFromGetter;
-        Builder? replacementGetterFromGetter;
-        Builder? replacementSetterFromGetter;
+        NamedBuilder? replacementGetterFromGetter;
+        NamedBuilder? replacementSetterFromGetter;
         if (existingGetter != null &&
             replacementMap.containsKey(existingGetter.parent)) {
           replacementLibraryBuilderFromGetter =
@@ -359,10 +343,10 @@
           replacementSetterFromGetter =
               replacementMapSetters[replacementLibraryBuilderFromGetter]![name];
         }
-        Builder? existingSetter = _setables?[name];
+        NamedBuilder? existingSetter = _setables?[name];
         LibraryBuilder? replacementLibraryBuilderFromSetter;
-        Builder? replacementGetterFromSetter;
-        Builder? replacementSetterFromSetter;
+        NamedBuilder? replacementGetterFromSetter;
+        NamedBuilder? replacementSetterFromSetter;
         if (existingSetter != null &&
             replacementMap.containsKey(existingSetter.parent)) {
           replacementLibraryBuilderFromSetter =
diff --git a/pkg/front_end/lib/src/base/scope.dart b/pkg/front_end/lib/src/base/scope.dart
index 6180c0d..ed0de56 100644
--- a/pkg/front_end/lib/src/base/scope.dart
+++ b/pkg/front_end/lib/src/base/scope.dart
@@ -11,7 +11,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/prefix_builder.dart';
 import '../kernel/hierarchy/class_member.dart' show ClassMember;
 import '../kernel/kernel_helper.dart';
@@ -134,9 +133,7 @@
   @override
   final ScopeKind kind;
 
-  final String classNameOrDebugName;
-
-  BaseNameSpaceLookupScope(this.kind, this.classNameOrDebugName);
+  BaseNameSpaceLookupScope(this.kind);
 
   NameSpace get _nameSpace;
 
@@ -156,7 +153,7 @@
   }
 
   @override
-  String toString() => "$runtimeType(${kind},$classNameOrDebugName)";
+  String toString() => "$runtimeType(${kind})";
 }
 
 class NameSpaceLookupScope extends BaseNameSpaceLookupScope {
@@ -166,8 +163,7 @@
   @override
   final LookupScope? _parent;
 
-  NameSpaceLookupScope(this._nameSpace, super.kind, super.classNameOrDebugName,
-      {LookupScope? parent})
+  NameSpaceLookupScope(this._nameSpace, super.kind, {LookupScope? parent})
       : _parent = parent;
 }
 
@@ -230,7 +226,7 @@
   final NameSpace _importNameSpace;
 
   CompilationUnitImportScope(this._compilationUnit, this._importNameSpace)
-      : super(ScopeKind.import, 'import');
+      : super(ScopeKind.import);
 
   @override
   NameSpace get _nameSpace => _importNameSpace;
@@ -255,9 +251,7 @@
   @override
   final LookupScope? _parent;
 
-  CompilationUnitScope(
-      this._compilationUnit, super.kind, super.classNameOrDebugName,
-      {LookupScope? parent})
+  CompilationUnitScope(this._compilationUnit, super.kind, {LookupScope? parent})
       : _parent = parent;
 
   @override
@@ -286,8 +280,7 @@
   @override
   final LookupScope? _parent;
 
-  CompilationUnitPrefixScope(
-      this._nameSpace, super.kind, super.classNameOrDebugName,
+  CompilationUnitPrefixScope(this._nameSpace, super.kind,
       {required LookupScope? parent})
       : _parent = parent;
 
@@ -318,8 +311,7 @@
   @override
   final LookupScope? _parent;
 
-  DeclarationBuilderScope(this._parent)
-      : super(ScopeKind.declaration, 'declaration');
+  DeclarationBuilderScope(this._parent) : super(ScopeKind.declaration);
 
   @override
   NameSpace get _nameSpace {
@@ -336,8 +328,11 @@
 
 /// Computes a builder for the import collision between [declaration] and
 /// [other].
-Builder computeAmbiguousDeclarationForImport(ProblemReporting problemReporting,
-    String name, Builder declaration, Builder other,
+NamedBuilder computeAmbiguousDeclarationForImport(
+    ProblemReporting problemReporting,
+    String name,
+    NamedBuilder declaration,
+    NamedBuilder other,
     {required UriOffset uriOffset}) {
   // Prefix fragments are merged to singular prefix builders when computing the
   // import scope.
@@ -348,7 +343,7 @@
   if (declaration == other) return declaration;
   if (declaration is InvalidTypeDeclarationBuilder) return declaration;
   if (other is InvalidTypeDeclarationBuilder) return other;
-  Builder? preferred;
+  NamedBuilder? preferred;
   Uri uri = computeLibraryUri(declaration);
   Uri otherUri = computeLibraryUri(other);
   if (declaration is LoadLibraryBuilder) {
@@ -384,10 +379,11 @@
       suppressMessage: false);
 }
 
-abstract class ProblemBuilder extends BuilderImpl {
+abstract class ProblemBuilder extends NamedBuilderImpl {
+  @override
   final String name;
 
-  final Builder builder;
+  final NamedBuilder builder;
 
   @override
   final int fileOffset;
@@ -404,7 +400,8 @@
 }
 
 class AmbiguousBuilder extends ProblemBuilder {
-  AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri)
+  AmbiguousBuilder(
+      String name, NamedBuilder builder, int charOffset, Uri fileUri)
       : super(name, builder, charOffset, fileUri);
 
   @override
@@ -416,8 +413,8 @@
 
   // TODO(ahe): Also provide context.
 
-  Builder getFirstDeclaration() {
-    Builder declaration = builder;
+  NamedBuilder getFirstDeclaration() {
+    NamedBuilder declaration = builder;
     while (declaration.next != null) {
       declaration = declaration.next!;
     }
@@ -549,32 +546,32 @@
 class AmbiguousMemberBuilder extends AmbiguousBuilder
     with ErroneousMemberBuilderMixin {
   AmbiguousMemberBuilder(
-      String name, Builder builder, int charOffset, Uri fileUri)
+      String name, NamedBuilder builder, int charOffset, Uri fileUri)
       : super(name, builder, charOffset, fileUri);
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get setable => this;
+  NamedBuilder get setable => this;
 }
 
 /// Iterator over builders mapped in a [Scope], including duplicates for each
 /// directly mapped builder.
-class ScopeIterator implements Iterator<Builder> {
-  Iterator<Builder>? local;
-  Iterator<Builder>? setters;
-  Iterator<Builder>? extensions;
+class ScopeIterator implements Iterator<NamedBuilder> {
+  Iterator<NamedBuilder>? local;
+  Iterator<NamedBuilder>? setters;
+  Iterator<NamedBuilder>? extensions;
 
-  Builder? _current;
+  NamedBuilder? _current;
 
   ScopeIterator(this.local, this.setters, this.extensions);
 
   @override
   bool moveNext() {
-    Builder? next = _current?.next;
+    NamedBuilder? next = _current?.next;
     if (next != null) {
       _current = next;
       return true;
@@ -611,82 +608,12 @@
   }
 
   @override
-  Builder get current {
+  NamedBuilder get current {
     return _current ?? // Coverage-ignore(suite): Not run.
         (throw new StateError('No element'));
   }
 }
 
-/// Iterator over builders mapped in a [Scope], including duplicates for each
-/// directly mapped builder.
-///
-/// Compared to [ScopeIterator] this iterator also gives
-/// access to the name that the builders are mapped to.
-class ScopeNameIterator extends ScopeIterator implements NameIterator<Builder> {
-  Iterator<String>? localNames;
-  Iterator<String>? setterNames;
-
-  String? _name;
-
-  ScopeNameIterator(Map<String, Builder>? getables,
-      Map<String, Builder>? setables, Iterator<Builder>? extensions)
-      : localNames = getables?.keys.iterator,
-        setterNames = setables?.keys.iterator,
-        super(getables?.values.iterator, setables?.values.iterator, extensions);
-
-  @override
-  bool moveNext() {
-    Builder? next = _current?.next;
-    if (next != null) {
-      _current = next;
-      return true;
-    }
-    if (local != null) {
-      if (local!.moveNext()) {
-        localNames!.moveNext();
-        _current = local!.current;
-        _name = localNames!.current;
-        return true;
-      }
-      local = null;
-      localNames = null;
-    }
-    if (setters != null) {
-      if (setters!.moveNext()) {
-        setterNames!.moveNext();
-        _current = setters!.current;
-        _name = setterNames!.current;
-        return true;
-      }
-      setters = null;
-      setterNames = null;
-    }
-    if (extensions != null) {
-      while (extensions!.moveNext()) {
-        Builder extension = extensions!.current;
-        // Named extensions have already been included throw [local] so we skip
-        // them here.
-        if (extension is SourceExtensionBuilder &&
-            extension.isUnnamedExtension) {
-          _current = extension;
-          _name = extension.name;
-          return true;
-        }
-      }
-      extensions = null;
-    }
-    _current = null;
-    _name = null;
-    return false;
-  }
-
-  @override
-  String get name {
-    return _name ?? // Coverage-ignore(suite): Not run.
-        (throw new StateError('No element'));
-  }
-}
-
 /// Iterator over builders mapped in a [ConstructorNameSpace], including
 /// duplicates for each directly mapped builder.
 class ConstructorNameSpaceIterator implements Iterator<MemberBuilder> {
@@ -720,58 +647,15 @@
   }
 }
 
-/// Iterator over builders mapped in a [ConstructorNameSpace], including
-/// duplicates for each directly mapped builder.
-///
-/// Compared to [ConstructorNameSpaceIterator] this iterator also gives
-/// access to the name that the builders are mapped to.
-class ConstructorNameSpaceNameIterator extends ConstructorNameSpaceIterator
-    implements NameIterator<MemberBuilder> {
-  Iterator<String>? _localNames;
-
-  String? _name;
-
-  ConstructorNameSpaceNameIterator(this._localNames, super.local);
-
-  @override
-  bool moveNext() {
-    MemberBuilder? next = _current?.next as MemberBuilder?;
-    if (next != null) {
-      _current = next;
-      return true;
-    }
-    if (_local != null) {
-      if (_local!.moveNext()) {
-        _localNames!.moveNext();
-        _current = _local!.current;
-        _name = _localNames!.current;
-        return true;
-      }
-      _local = null;
-      _localNames = null;
-    }
-    _current = null;
-    _name = null;
-    return false;
-  }
-
-  @override
-  String get name {
-    return _name ?? // Coverage-ignore(suite): Not run.
-        (throw new StateError('No element'));
-  }
-}
-
 /// Filtered builder [Iterator].
-class FilteredIterator<T extends Builder> implements Iterator<T> {
-  final Iterator<Builder> _iterator;
+class FilteredIterator<T extends NamedBuilder> implements Iterator<T> {
+  final Iterator<NamedBuilder> _iterator;
   final bool includeDuplicates;
 
   FilteredIterator(this._iterator, {required this.includeDuplicates});
 
-  bool _include(Builder element) {
-    if (!includeDuplicates &&
-        (element.isDuplicate)) {
+  bool _include(NamedBuilder element) {
+    if (!includeDuplicates && (element.isDuplicate)) {
       return false;
     }
     return element is T;
@@ -783,7 +667,7 @@
   @override
   bool moveNext() {
     while (_iterator.moveNext()) {
-      Builder candidate = _iterator.current;
+      NamedBuilder candidate = _iterator.current;
       if (_include(candidate)) {
         return true;
       }
@@ -792,43 +676,7 @@
   }
 }
 
-/// Filtered [NameIterator].
-///
-/// Compared to [FilteredIterator] this iterator also gives
-/// access to the name that the builders are mapped to.
-class FilteredNameIterator<T extends Builder> implements NameIterator<T> {
-  final NameIterator<Builder> _iterator;
-  final bool includeDuplicates;
-
-  FilteredNameIterator(this._iterator, {required this.includeDuplicates});
-
-  bool _include(Builder element) {
-    if (!includeDuplicates &&
-        (element.isDuplicate)) {
-      return false;
-    }
-    return element is T;
-  }
-
-  @override
-  T get current => _iterator.current as T;
-
-  @override
-  String get name => _iterator.name;
-
-  @override
-  bool moveNext() {
-    while (_iterator.moveNext()) {
-      Builder candidate = _iterator.current;
-      if (_include(candidate)) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-extension IteratorExtension<T extends Builder> on Iterator<T> {
+extension IteratorExtension<T extends NamedBuilder> on Iterator<T> {
   void forEach(void Function(T) f) {
     while (moveNext()) {
       f(current);
@@ -848,14 +696,6 @@
   }
 }
 
-extension NameIteratorExtension<T extends Builder> on NameIterator<T> {
-  void forEach(void Function(String, T) f) {
-    while (moveNext()) {
-      f(name, current);
-    }
-  }
-}
-
 class IteratorSequence<T> implements Iterator<T> {
   Iterator<Iterator<T>> _iterators;
 
diff --git a/pkg/front_end/lib/src/builder/builder.dart b/pkg/front_end/lib/src/builder/builder.dart
index 92cb4a6..111a4d7 100644
--- a/pkg/front_end/lib/src/builder/builder.dart
+++ b/pkg/front_end/lib/src/builder/builder.dart
@@ -3,11 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 abstract class Builder {
-  /// Used when multiple things with the same name are declared within the same
-  /// parent. Only used for top-level and class-member declarations, not for
-  /// block scopes.
-  Builder? next;
-
   Builder? get parent;
 
   Uri? get fileUri;
@@ -196,6 +191,15 @@
   bool get isTopLevel;
 
   bool get isTypeParameter;
+}
+
+abstract class NamedBuilder implements Builder {
+  String get name;
+
+  /// Used when multiple things with the same name are declared within the same
+  /// parent. Only used for top-level and class-member declarations, not for
+  /// block scopes.
+  NamedBuilder? next;
 
   /// Return `true` if this builder is a duplicate of another with the same
   /// name. This is `false` for the builder first declared amongst duplicates.
@@ -203,9 +207,6 @@
 }
 
 abstract class BuilderImpl implements Builder {
-  @override
-  Builder? next;
-
   BuilderImpl();
 
   @override
@@ -252,12 +253,17 @@
 
   @override
   bool get isTypeParameter => false;
+}
+
+abstract class NamedBuilderImpl extends BuilderImpl implements NamedBuilder {
+  @override
+  NamedBuilder? next;
 
   @override
   bool get isDuplicate => next != null;
 }
 
-extension BuilderExtension on Builder {
+extension BuilderExtension on NamedBuilder {
   /// Returns the 'duplicate index' for this builder, which is the number of
   /// builders declared prior this.
   ///
@@ -265,7 +271,7 @@
   int get duplicateIndex {
     if (next != null) {
       int count = 0;
-      Builder? current = next;
+      NamedBuilder? current = next;
       while (current != null) {
         count++;
         current = current.next;
diff --git a/pkg/front_end/lib/src/builder/builder_mixins.dart b/pkg/front_end/lib/src/builder/builder_mixins.dart
index 9ca31cd..5c81b84 100644
--- a/pkg/front_end/lib/src/builder/builder_mixins.dart
+++ b/pkg/front_end/lib/src/builder/builder_mixins.dart
@@ -8,7 +8,6 @@
 import '../base/lookup_result.dart';
 import '../base/messages.dart';
 import '../base/problems.dart';
-import '../base/scope.dart';
 import 'builder.dart';
 import 'declaration_builders.dart';
 import 'library_builder.dart';
@@ -53,20 +52,16 @@
         hasExplicitTypeArguments: hasExplicitTypeArguments);
   }
 
-  void forEach(void f(String name, Builder builder)) {
-    nameSpace.filteredNameIterator(includeDuplicates: false).forEach(f);
-  }
-
   @override
   InterfaceType? get thisType => null;
 
   @override
-  Builder? lookupLocalMember(String name,
+  NamedBuilder? lookupLocalMember(String name,
       {bool setter = false, bool required = false}) {
     // TODO(johnniwinther): Support augmented on extensions/extension type
     //  declarations.
     LookupResult? result = nameSpace.lookupLocalMember(name);
-    Builder? builder = setter ? result?.setable : result?.getable;
+    NamedBuilder? builder = setter ? result?.setable : result?.getable;
     if (required && builder == null) {
       internalProblem(
           templateInternalProblemNotFoundIn.withArguments(
@@ -77,9 +72,9 @@
     return builder;
   }
 
-  Builder? lookupLocalMemberByName(Name name,
+  MemberBuilder? lookupLocalMemberByName(Name name,
       {bool setter = false, bool required = false}) {
-    Builder? builder =
+    NamedBuilder? builder =
         lookupLocalMember(name.text, setter: setter, required: required);
     if (builder == null && setter) {
       // When looking up setters, we include assignable fields.
@@ -106,6 +101,6 @@
         builder = null;
       }
     }
-    return builder;
+    return builder as MemberBuilder?;
   }
 }
diff --git a/pkg/front_end/lib/src/builder/class_builder.dart b/pkg/front_end/lib/src/builder/class_builder.dart
index 9654b08..e3ff677 100644
--- a/pkg/front_end/lib/src/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/builder/class_builder.dart
@@ -27,26 +27,6 @@
   ///
   Iterator<T> fullConstructorIterator<T extends MemberBuilder>();
 
-  /// [NameIterator] for all constructors declared in this class or any of its
-  /// augmentations.
-  ///
-  /// Duplicates and augmenting constructors are _not_ included.
-  ///
-  /// For instance:
-  ///
-  ///     class Class {
-  ///       Class(); // declared, so it is included
-  ///       Class.named(); // declared, so it is included
-  ///       Class.named(); // duplicate, so it is *not* included
-  ///     }
-  ///
-  ///     augment class Class {
-  ///       augment Class(); // augmenting, so it is *not* included
-  ///       Class.extra(); // declared, so it is included
-  ///     }
-  ///
-  NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>();
-
   /// [Iterator] for all members declared in this class or any of its
   /// augmentations.
   ///
@@ -65,27 +45,7 @@
   ///       extra() {} // Declared, so it is included.
   ///     }
   ///
-  Iterator<T> fullMemberIterator<T extends Builder>();
-
-  /// [NameIterator] for all members declared in this class or any of its
-  /// augmentations.
-  ///
-  /// Duplicates and augmenting members are _not_ included.
-  ///
-  /// For instance:
-  ///
-  ///     class Class {
-  ///       method() {} // Declared, so it is included.
-  ///       method2() {} // Declared, so it is included.
-  ///       method2() {} // Duplicate, so it is *not* included.
-  ///     }
-  ///
-  ///     augment class Class {
-  ///       augment method() {} // Augmenting, so it is *not* included.
-  ///       extra() {} // Declared, so it is included.
-  ///     }
-  ///
-  NameIterator<T> fullMemberNameIterator<T extends Builder>();
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>();
 }
 
 abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
@@ -193,10 +153,10 @@
   }
 
   @override
-  Builder? lookupLocalMember(String name,
+  NamedBuilder? lookupLocalMember(String name,
       {bool setter = false, bool required = false}) {
     LookupResult? result = nameSpace.lookupLocalMember(name);
-    Builder? builder = setter ? result?.setable : result?.getable;
+    NamedBuilder? builder = setter ? result?.setable : result?.getable;
     if (required && builder == null) {
       internalProblem(
           templateInternalProblemNotFoundIn.withArguments(
diff --git a/pkg/front_end/lib/src/builder/declaration_builder.dart b/pkg/front_end/lib/src/builder/declaration_builder.dart
index ab52bb5..33f069a 100644
--- a/pkg/front_end/lib/src/builder/declaration_builder.dart
+++ b/pkg/front_end/lib/src/builder/declaration_builder.dart
@@ -38,7 +38,7 @@
   /// If [setter] is `true` the sought member is a setter or assignable field.
   /// If [required] is `true` and no member is found an internal problem is
   /// reported.
-  Builder? lookupLocalMember(String name,
+  NamedBuilder? lookupLocalMember(String name,
       {bool setter = false, bool required = false});
 
   List<DartType> buildAliasedTypeArguments(LibraryBuilder library,
diff --git a/pkg/front_end/lib/src/builder/declaration_builders.dart b/pkg/front_end/lib/src/builder/declaration_builders.dart
index a076358..5f4a283 100644
--- a/pkg/front_end/lib/src/builder/declaration_builders.dart
+++ b/pkg/front_end/lib/src/builder/declaration_builders.dart
@@ -22,7 +22,6 @@
 import 'formal_parameter_builder.dart';
 import 'library_builder.dart';
 import 'member_builder.dart';
-import 'name_iterator.dart';
 import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'record_type_builder.dart';
diff --git a/pkg/front_end/lib/src/builder/extension_builder.dart b/pkg/front_end/lib/src/builder/extension_builder.dart
index be307a5..9b085ee0 100644
--- a/pkg/front_end/lib/src/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/builder/extension_builder.dart
@@ -24,7 +24,7 @@
   // TODO(johnniwinther): Support [AmbiguousBuilder] here and in instance
   // member lookup to avoid reporting that the member doesn't exist when it is
   // duplicate.
-  Builder? lookupLocalMemberByName(Name name,
+  MemberBuilder? lookupLocalMemberByName(Name name,
       {bool setter = false, bool required = false});
 }
 
diff --git a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
index 442e0f9..31b8ac4 100644
--- a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
@@ -50,7 +50,7 @@
 
 /// A builder for a formal parameter, i.e. a parameter on a method or
 /// constructor.
-class FormalParameterBuilder extends BuilderImpl
+class FormalParameterBuilder extends NamedBuilderImpl
     implements VariableBuilder, ParameterBuilder, InferredTypeListener {
   static const String noNameSentinel = 'no name sentinel';
 
@@ -146,10 +146,10 @@
       !isSuperInitializingFormal;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => isAssignable ? this : null;
+  NamedBuilder? get setable => isAssignable ? this : null;
 
   @override
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/lib/src/builder/library_builder.dart b/pkg/front_end/lib/src/builder/library_builder.dart
index 94cb69c..b4374d0 100644
--- a/pkg/front_end/lib/src/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/builder/library_builder.dart
@@ -42,7 +42,6 @@
 import 'factory_builder.dart';
 import 'member_builder.dart';
 import 'metadata_builder.dart';
-import 'name_iterator.dart';
 import 'prefix_builder.dart';
 import 'type_builder.dart';
 
@@ -277,7 +276,7 @@
 
   void addImportedBuilderToScope(
       {required String name,
-      required Builder builder,
+      required NamedBuilder builder,
       required int charOffset});
 
   void addImportsToScope();
@@ -364,34 +363,21 @@
   /// Returns an iterator of all members (typedefs, classes and members)
   /// declared in this library, including duplicate declarations.
   // TODO(johnniwinther): Should the only exist on [SourceLibraryBuilder]?
-  Iterator<Builder> get localMembersIterator;
+  Iterator<NamedBuilder> get localMembersIterator;
 
   /// Returns an iterator of all members of specified type
   /// declared in this library, including duplicate declarations.
   // TODO(johnniwinther): Should the only exist on [SourceLibraryBuilder]?
-  Iterator<T> localMembersIteratorOfType<T extends Builder>();
-
-  /// Returns an iterator of all members (typedefs, classes and members)
-  /// declared in this library, including duplicate declarations.
-  ///
-  /// Compared to [localMembersIterator] this also gives access to the name
-  /// that the builders are mapped to.
-  NameIterator<Builder> get localMembersNameIterator;
+  Iterator<T> localMembersIteratorOfType<T extends NamedBuilder>();
 
   /// [Iterator] for all declarations declared in this library or any of its
   /// augmentations.
   ///
   /// Duplicates and augmenting members are _not_ included.
-  Iterator<T> fullMemberIterator<T extends Builder>();
-
-  /// [NameIterator] for all declarations declared in this class or any of its
-  /// augmentations.
-  ///
-  /// Duplicates and augmenting members are _not_ included.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>();
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>();
 
   /// Returns true if the export scope was modified.
-  bool addToExportScope(String name, Builder member,
+  bool addToExportScope(String name, NamedBuilder member,
       {required UriOffset uriOffset});
 
   /// Looks up [constructorName] in the class named [className].
@@ -415,7 +401,7 @@
   ///
   /// If [required] is `true` and no member is found an internal problem is
   /// reported.
-  Builder? lookupLocalMember(String name, {bool required = false});
+  NamedBuilder? lookupLocalMember(String name, {bool required = false});
 
   void recordAccess(
       CompilationUnit accessor, int charOffset, int length, Uri fileUri);
@@ -467,21 +453,16 @@
   Uri get importUri;
 
   @override
-  Iterator<Builder> get localMembersIterator {
+  Iterator<NamedBuilder> get localMembersIterator {
     return libraryNameSpace.filteredIterator(includeDuplicates: true);
   }
 
   @override
-  Iterator<T> localMembersIteratorOfType<T extends Builder>() {
+  Iterator<T> localMembersIteratorOfType<T extends NamedBuilder>() {
     return libraryNameSpace.filteredIterator<T>(includeDuplicates: true);
   }
 
   @override
-  NameIterator<Builder> get localMembersNameIterator {
-    return libraryNameSpace.filteredNameIterator(includeDuplicates: true);
-  }
-
-  @override
   FormattedMessage? addProblem(
       Message message, int charOffset, int length, Uri? fileUri,
       {bool wasHandled = false,
@@ -500,8 +481,8 @@
   /// Computes a builder for the export collision between [declaration] and
   /// [other]. If [declaration] is declared in [libraryNameSpace] then this is
   /// returned instead of reporting a collision.
-  Builder _computeAmbiguousDeclarationForExport(
-      String name, Builder declaration, Builder other,
+  NamedBuilder _computeAmbiguousDeclarationForExport(
+      String name, NamedBuilder declaration, NamedBuilder other,
       {required UriOffset uriOffset}) {
     // Prefix builders and load library builders are not part of an export
     // scope.
@@ -516,7 +497,7 @@
     if (declaration == other) return declaration;
     if (declaration is InvalidTypeDeclarationBuilder) return declaration;
     if (other is InvalidTypeDeclarationBuilder) return other;
-    Builder? preferred;
+    NamedBuilder? preferred;
     Uri? uri;
     Uri? otherUri;
     if (libraryNameSpace.lookupLocalMember(name)?.getable == declaration) {
@@ -555,13 +536,13 @@
   }
 
   @override
-  bool addToExportScope(String name, Builder member,
+  bool addToExportScope(String name, NamedBuilder member,
       {required UriOffset uriOffset}) {
     if (name.startsWith("_")) return false;
     if (member is PrefixBuilder) return false;
     bool isSetter = isMappedAsSetter(member);
     LookupResult? result = exportNameSpace.lookupLocalMember(name);
-    Builder? existing = isSetter ? result?.setable : result?.getable;
+    NamedBuilder? existing = isSetter ? result?.setable : result?.getable;
     if (existing == member) {
       return false;
     } else {
@@ -571,7 +552,7 @@
         exportNameSpace.addLocalMember(name, member, setter: isSetter);
         return true;
       } else if (existing != null) {
-        Builder result = _computeAmbiguousDeclarationForExport(
+        NamedBuilder result = _computeAmbiguousDeclarationForExport(
             name, existing, member,
             uriOffset: uriOffset);
         exportNameSpace.addLocalMember(name, result, setter: isSetter);
@@ -631,8 +612,8 @@
   }
 
   @override
-  Builder? lookupLocalMember(String name, {bool required = false}) {
-    Builder? builder = libraryNameSpace.lookupLocalMember(name)?.getable;
+  NamedBuilder? lookupLocalMember(String name, {bool required = false}) {
+    NamedBuilder? builder = libraryNameSpace.lookupLocalMember(name)?.getable;
     if (required && builder == null) {
       internalProblem(
           templateInternalProblemNotFoundIn.withArguments(
diff --git a/pkg/front_end/lib/src/builder/member_builder.dart b/pkg/front_end/lib/src/builder/member_builder.dart
index 684cc17..7c24bdd 100644
--- a/pkg/front_end/lib/src/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/builder/member_builder.dart
@@ -11,7 +11,8 @@
 import 'declaration_builders.dart';
 import 'library_builder.dart';
 
-abstract class MemberBuilder implements Builder, LookupResult {
+abstract class MemberBuilder implements Builder, LookupResult, NamedBuilder {
+  @override
   String get name;
 
   LibraryBuilder get libraryBuilder;
@@ -118,7 +119,8 @@
   bool get isProperty;
 }
 
-abstract class MemberBuilderImpl extends BuilderImpl implements MemberBuilder {
+abstract class MemberBuilderImpl extends NamedBuilderImpl
+    implements MemberBuilder {
   @override
   Uri get fileUri;
 
diff --git a/pkg/front_end/lib/src/builder/name_iterator.dart b/pkg/front_end/lib/src/builder/name_iterator.dart
deleted file mode 100644
index 550d405..0000000
--- a/pkg/front_end/lib/src/builder/name_iterator.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'builder.dart';
-
-/// An iterator on [Builder]s that provide the name that they are mapped to.
-abstract class NameIterator<T extends Builder> implements Iterator<T> {
-  String get name;
-}
diff --git a/pkg/front_end/lib/src/builder/prefix_builder.dart b/pkg/front_end/lib/src/builder/prefix_builder.dart
index 483037a..6743415 100644
--- a/pkg/front_end/lib/src/builder/prefix_builder.dart
+++ b/pkg/front_end/lib/src/builder/prefix_builder.dart
@@ -18,13 +18,14 @@
 import 'declaration_builders.dart';
 import 'library_builder.dart';
 
-class PrefixBuilder extends BuilderImpl implements LookupResult {
+class PrefixBuilder extends NamedBuilderImpl implements LookupResult {
+  @override
   final String name;
 
   final NameSpace _prefixNameSpace = new NameSpaceImpl();
 
   late final LookupScope _prefixScope =
-      new NameSpaceLookupScope(_prefixNameSpace, ScopeKind.library, "top");
+      new NameSpaceLookupScope(_prefixNameSpace, ScopeKind.library);
 
   @override
   final SourceLibraryBuilder parent;
@@ -50,7 +51,7 @@
     assert(deferred == (loadLibraryBuilder != null),
         "LoadLibraryBuilder must be provided iff prefix is deferred.");
     if (loadLibraryBuilder != null) {
-      addToPrefixScope('loadLibrary', loadLibraryBuilder!,
+      addToPrefixScope(loadLibraryBuilder!.name, loadLibraryBuilder!,
           importOffset: importOffset, prefixOffset: prefixOffset);
     }
   }
@@ -68,7 +69,7 @@
     return _prefixScope.lookup(name, charOffset, fileUri);
   }
 
-  void addToPrefixScope(String name, Builder member,
+  void addToPrefixScope(String name, NamedBuilder member,
       {required int importOffset, required int prefixOffset}) {
     if (deferred && member is ExtensionBuilder) {
       parent.addProblem(templateDeferredExtensionImport.withArguments(name),
@@ -78,9 +79,9 @@
     bool isSetter = isMappedAsSetter(member);
 
     LookupResult? existingResult = _prefixNameSpace.lookupLocalMember(name);
-    Builder? existing =
+    NamedBuilder? existing =
         isSetter ? existingResult?.setable : existingResult?.getable;
-    Builder result;
+    NamedBuilder result;
     if (existing != null) {
       result = computeAmbiguousDeclarationForImport(
           parent, name, existing, member,
@@ -99,10 +100,10 @@
   String get fullNameForErrors => name;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 }
 
 class PrefixFragment {
diff --git a/pkg/front_end/lib/src/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/builder/type_declaration_builder.dart
index aa874bd..fa0d6d0 100644
--- a/pkg/front_end/lib/src/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/builder/type_declaration_builder.dart
@@ -5,7 +5,9 @@
 part of 'declaration_builders.dart';
 
 // Coverage-ignore(suite): Not run.
-abstract class ITypeDeclarationBuilder implements Builder, LookupResult {
+abstract class ITypeDeclarationBuilder
+    implements Builder, LookupResult, NamedBuilder {
+  @override
   String get name;
 
   bool get isNamedMixinApplication;
@@ -55,7 +57,7 @@
           typeParametersTraversalState});
 }
 
-abstract class TypeDeclarationBuilderImpl extends BuilderImpl
+abstract class TypeDeclarationBuilderImpl extends NamedBuilderImpl
     implements ITypeDeclarationBuilder {
   @override
   // Coverage-ignore(suite): Not run.
@@ -71,10 +73,10 @@
   int get typeParametersCount => 0;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   String toString() {
diff --git a/pkg/front_end/lib/src/dill/dill_builder_mixins.dart b/pkg/front_end/lib/src/dill/dill_builder_mixins.dart
index 09d9dc1..9d701f5 100644
--- a/pkg/front_end/lib/src/dill/dill_builder_mixins.dart
+++ b/pkg/front_end/lib/src/dill/dill_builder_mixins.dart
@@ -60,11 +60,11 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -88,10 +88,10 @@
   Reference? get invokeTargetReference => null;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => hasSetter ? this : null;
+  NamedBuilder? get setable => hasSetter ? this : null;
 
   List<ClassMember>? _localMembers;
   List<ClassMember>? _localSetters;
@@ -130,10 +130,10 @@
   Reference? get writeTargetReference => null;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   List<ClassMember>? _localMembers;
 
@@ -172,10 +172,10 @@
   Reference? get invokeTargetReference => null;
 
   @override
-  Builder? get getable => null;
+  NamedBuilder? get getable => null;
 
   @override
-  Builder get setable => this;
+  NamedBuilder get setable => this;
 
   List<ClassMember>? _localSetters;
 
@@ -197,10 +197,10 @@
   bool get isOperator => false;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -230,10 +230,10 @@
   bool get isOperator => true;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   Member? get readTarget => null;
@@ -269,11 +269,11 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/lib/src/dill/dill_class_builder.dart b/pkg/front_end/lib/src/dill/dill_class_builder.dart
index d601d0e..ce31029 100644
--- a/pkg/front_end/lib/src/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_class_builder.dart
@@ -11,7 +11,6 @@
 import '../builder/declaration_builders.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/type_builder.dart';
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 import 'dill_member_builder.dart';
@@ -21,22 +20,12 @@
   DeclarationNameSpace get nameSpace;
 
   @override
-  // Coverage-ignore(suite): Not run.
   Iterator<T> fullConstructorIterator<T extends MemberBuilder>() =>
       nameSpace.filteredConstructorIterator<T>(includeDuplicates: false);
 
   @override
-  NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() =>
-      nameSpace.filteredConstructorNameIterator<T>(includeDuplicates: false);
-
-  @override
-  Iterator<T> fullMemberIterator<T extends Builder>() =>
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>() =>
       nameSpace.filteredIterator<T>(includeDuplicates: false);
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
-      nameSpace.filteredNameIterator<T>(includeDuplicates: false);
 }
 
 class DillClassBuilder extends ClassBuilderImpl
diff --git a/pkg/front_end/lib/src/dill/dill_library_builder.dart b/pkg/front_end/lib/src/dill/dill_library_builder.dart
index 428001b1..156cc9a 100644
--- a/pkg/front_end/lib/src/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_library_builder.dart
@@ -17,7 +17,6 @@
 import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/never_type_declaration_builder.dart';
 import '../builder/property_builder.dart';
 import '../codes/cfe_codes.dart'
@@ -318,7 +317,7 @@
     }
   }
 
-  Builder? _addBuilder(String? name, Builder declaration) {
+  void _addBuilder(String? name, NamedBuilder declaration) {
     if (name == null || name.isEmpty) return null;
 
     bool isSetter = isMappedAsSetter(declaration);
@@ -339,7 +338,6 @@
         exportNameSpace.addLocalMember(name, declaration, setter: false);
       }
     }
-    return declaration;
   }
 
   void addTypedef(Typedef typedef, Map<Name, Procedure>? tearOffs) {
@@ -364,7 +362,7 @@
 
   void finalizeExports() {
     unserializableExports?.forEach((String name, String messageText) {
-      Builder declaration;
+      NamedBuilder declaration;
       if (messageText == exportDynamicSentinel) {
         assert(
             name == 'dynamic', "Unexpected export name for 'dynamic': '$name'");
@@ -387,11 +385,11 @@
       exportNameSpace.addLocalMember(name, declaration, setter: false);
     });
 
-    Map<Reference, Builder>? sourceBuildersMap =
+    Map<Reference, NamedBuilder>? sourceBuildersMap =
         loader.currentSourceLoader?.buildersCreatedWithReferences;
     for (Reference reference in library.additionalExports) {
       NamedNode node = reference.node as NamedNode;
-      Builder? declaration = sourceBuildersMap?[reference];
+      NamedBuilder? declaration = sourceBuildersMap?[reference];
       String name;
       if (declaration != null) {
         // Coverage-ignore-block(suite): Not run.
@@ -475,25 +473,19 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Iterator<T> fullMemberIterator<T extends Builder>() {
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>() {
     return libraryNameSpace.filteredIterator<T>(includeDuplicates: false);
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>() {
-    return libraryNameSpace.filteredNameIterator(includeDuplicates: false);
-  }
-
-  @override
   Version get languageVersion => library.languageVersion;
 
   /// Patch up the export scope, using the two replacement maps to replace
   /// builders in the export scope. The replacement maps from old LibraryBuilder
   /// to map, mapping from name to new (replacement) builder.
   void patchUpExportScope(
-      Map<LibraryBuilder, Map<String, Builder>> replacementMap,
-      Map<LibraryBuilder, Map<String, Builder>> replacementMapSetters) {
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMap,
+      Map<LibraryBuilder, Map<String, NamedBuilder>> replacementMapSetters) {
     _exportScope.patchUpScope(replacementMap, replacementMapSetters);
   }
 }
diff --git a/pkg/front_end/lib/src/dill/dill_member_builder.dart b/pkg/front_end/lib/src/dill/dill_member_builder.dart
index 08b69a9..8e4c639 100644
--- a/pkg/front_end/lib/src/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_member_builder.dart
@@ -257,7 +257,6 @@
       super.libraryBuilder, DillClassBuilder super.declarationBuilder);
 
   @override
-  // Coverage-ignore(suite): Not run.
   Member get member => _procedure;
 
   @override
diff --git a/pkg/front_end/lib/src/fragment/field/encoding.dart b/pkg/front_end/lib/src/fragment/field/encoding.dart
index 4e3c846..786c451 100644
--- a/pkg/front_end/lib/src/fragment/field/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/field/encoding.dart
@@ -581,7 +581,6 @@
         ..isExtensionMember = isExtensionMember;
       isInstanceMember = false;
     } else if (isExtensionTypeMember) {
-      // Coverage-ignore-block(suite): Not run.
       _field!
         ..isStatic = _fragment.builder.isStatic
         ..isExtensionTypeMember = true;
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 28985dd..2d7c478 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -806,8 +806,8 @@
       (declaredInCurrentGuard ??= {}).add(variable);
     }
     String variableName = variable.name!;
-    List<int>? previousOffsets =
-        scope.declare(variableName, new VariableBuilderImpl(variable, uri));
+    List<int>? previousOffsets = scope.declare(
+        variableName, new VariableBuilderImpl(variableName, variable, uri));
     if (previousOffsets != null && previousOffsets.isNotEmpty) {
       // This case is different from the above error. In this case, the problem
       // is using `x` before it's declared: `{ var x; { print(x); var x;
@@ -9138,7 +9138,7 @@
     if (isWildcardLoweredFormalParameter(name)) {
       name = '_';
     }
-    Builder? builder = _context.lookupLocalMember(name);
+    NamedBuilder? builder = _context.lookupLocalMember(name);
     if (builder?.next != null) {
       // Duplicated name, already reported.
       while (builder != null) {
diff --git a/pkg/front_end/lib/src/kernel/body_builder_context.dart b/pkg/front_end/lib/src/kernel/body_builder_context.dart
index 1d1bee8..77b5319 100644
--- a/pkg/front_end/lib/src/kernel/body_builder_context.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder_context.dart
@@ -110,7 +110,7 @@
   /// declaration or library.
   ///
   /// If [required] is `true`, an error is thrown if the member is not found.
-  Builder? lookupLocalMember(String name, {bool required = false}) {
+  NamedBuilder? lookupLocalMember(String name, {bool required = false}) {
     return declarationContext.lookupLocalMember(name, required: required);
   }
 
@@ -423,7 +423,7 @@
     throw new UnsupportedError('${runtimeType}.lookupSuperConstructor');
   }
 
-  Builder? lookupLocalMember(String name, {bool required = false});
+  NamedBuilder? lookupLocalMember(String name, {bool required = false});
 
   bool get isExtensionTypeDeclaration => false;
 
@@ -460,7 +460,7 @@
   DeclarationBuilder get _declarationBuilder;
 
   @override
-  Builder? lookupLocalMember(String name, {bool required = false}) {
+  NamedBuilder? lookupLocalMember(String name, {bool required = false}) {
     return _declarationBuilder.lookupLocalMember(name, required: required);
   }
 
@@ -639,7 +639,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? lookupLocalMember(String name, {bool required = false}) {
+  NamedBuilder? lookupLocalMember(String name, {bool required = false}) {
     return _libraryBuilder.lookupLocalMember(name, required: required);
   }
 }
diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart
index 0d67ca7..55f2209 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator.dart
@@ -1952,8 +1952,8 @@
       int extensionTypeArgumentOffset,
       Extension extension,
       Name targetName,
-      Builder? getterBuilder,
-      Builder? setterBuilder,
+      MemberBuilder? getterBuilder,
+      MemberBuilder? setterBuilder,
       Expression receiver,
       List<DartType>? explicitTypeArguments,
       int extensionTypeParameterCount,
@@ -2316,31 +2316,15 @@
       Token token,
       int extensionTypeArgumentOffset,
       Extension extension,
-      Builder? getterBuilder,
-      Builder? setterBuilder,
+      MemberBuilder? getterBuilder,
+      MemberBuilder? setterBuilder,
       Expression receiver,
       Expression index,
       List<DartType>? explicitTypeArguments,
       int extensionTypeParameterCount,
       {required bool isNullAware}) {
-    Procedure? readTarget;
-    if (getterBuilder != null) {
-      if (getterBuilder is MemberBuilder) {
-        MemberBuilder procedureBuilder = getterBuilder;
-        readTarget = procedureBuilder.invokeTarget as Procedure?;
-      } else {
-        return unhandled(
-            "${getterBuilder.runtimeType}",
-            "InstanceExtensionAccessGenerator.fromBuilder",
-            offsetForToken(token),
-            helper.uri);
-      }
-    }
-    Procedure? writeTarget;
-    if (setterBuilder is MemberBuilder) {
-      MemberBuilder memberBuilder = setterBuilder;
-      writeTarget = memberBuilder.invokeTarget as Procedure?;
-    }
+    Procedure? readTarget = getterBuilder?.invokeTarget as Procedure?;
+    Procedure? writeTarget = setterBuilder?.invokeTarget as Procedure?;
     return new ExplicitExtensionIndexedAccessGenerator(
         helper,
         token,
@@ -2623,11 +2607,11 @@
 
   Generator _createInstanceAccess(Token token, Name name,
       {bool isNullAware = false}) {
-    Builder? getter = extensionBuilder.lookupLocalMemberByName(name);
+    MemberBuilder? getter = extensionBuilder.lookupLocalMemberByName(name);
     if (getter != null && getter.isStatic) {
       getter = null;
     }
-    Builder? setter =
+    MemberBuilder? setter =
         extensionBuilder.lookupLocalMemberByName(name, setter: true);
     if (setter != null && setter.isStatic) {
       setter = null;
@@ -2715,8 +2699,10 @@
   @override
   Generator buildIndexedAccess(Expression index, Token token,
       {required bool isNullAware}) {
-    Builder? getter = extensionBuilder.lookupLocalMemberByName(indexGetName);
-    Builder? setter = extensionBuilder.lookupLocalMemberByName(indexSetName);
+    MemberBuilder? getter =
+        extensionBuilder.lookupLocalMemberByName(indexGetName);
+    MemberBuilder? setter =
+        extensionBuilder.lookupLocalMemberByName(indexSetName);
     if (getter == null && setter == null) {
       // Coverage-ignore-block(suite): Not run.
       return new UnresolvedNameGenerator(_helper, token, indexGetName,
diff --git a/pkg/front_end/lib/src/kernel/kernel_target.dart b/pkg/front_end/lib/src/kernel/kernel_target.dart
index aad4547..d3fa0d2 100644
--- a/pkg/front_end/lib/src/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/kernel/kernel_target.dart
@@ -50,7 +50,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/method_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/type_builder.dart';
@@ -891,11 +890,11 @@
         bool isConstructorAdded = false;
         Map<TypeParameter, DartType>? substitutionMap;
 
-        NameIterator<MemberBuilder> iterator =
-            superclassBuilder.fullConstructorNameIterator();
+        Iterator<MemberBuilder> iterator =
+            superclassBuilder.fullConstructorIterator();
         while (iterator.moveNext()) {
-          String name = iterator.name;
           MemberBuilder memberBuilder = iterator.current;
+          String name = memberBuilder.name;
           if (memberBuilder.invokeTarget is Constructor) {
             substitutionMap ??=
                 builder.getSubstitutionMap(superclassBuilder.cls);
diff --git a/pkg/front_end/lib/src/kernel/kernel_variable_builder.dart b/pkg/front_end/lib/src/kernel/kernel_variable_builder.dart
index 00b6c74..89cc858 100644
--- a/pkg/front_end/lib/src/kernel/kernel_variable_builder.dart
+++ b/pkg/front_end/lib/src/kernel/kernel_variable_builder.dart
@@ -7,14 +7,17 @@
 import '../builder/builder.dart';
 import '../builder/variable_builder.dart';
 
-class VariableBuilderImpl extends BuilderImpl implements VariableBuilder {
+class VariableBuilderImpl extends NamedBuilderImpl implements VariableBuilder {
+  @override
+  final String name;
+
   @override
   final Uri fileUri;
 
   @override
   final VariableDeclaration variable;
 
-  VariableBuilderImpl(this.variable, this.fileUri);
+  VariableBuilderImpl(this.name, this.variable, this.fileUri);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -30,10 +33,10 @@
   bool get isAssignable => variable.isAssignable;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => isAssignable ? this : null;
+  NamedBuilder? get setable => isAssignable ? this : null;
 
   @override
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/lib/src/kernel/load_library_builder.dart b/pkg/front_end/lib/src/kernel/load_library_builder.dart
index 1b1955c..ec477e6 100644
--- a/pkg/front_end/lib/src/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/kernel/load_library_builder.dart
@@ -25,7 +25,10 @@
 import 'forest.dart' show Forest;
 
 /// Builder to represent the `deferLibrary.loadLibrary` calls and tear-offs.
-class LoadLibraryBuilder extends BuilderImpl {
+class LoadLibraryBuilder extends NamedBuilderImpl {
+  @override
+  String get name => 'loadLibrary';
+
   @override
   final SourceLibraryBuilder parent;
 
@@ -87,5 +90,5 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  String get fullNameForErrors => 'loadLibrary';
+  String get fullNameForErrors => name;
 }
diff --git a/pkg/front_end/lib/src/source/source_builder_mixins.dart b/pkg/front_end/lib/src/source/source_builder_mixins.dart
index 3ed2427..523784e 100644
--- a/pkg/front_end/lib/src/source/source_builder_mixins.dart
+++ b/pkg/front_end/lib/src/source/source_builder_mixins.dart
@@ -13,7 +13,6 @@
 import '../builder/builder_mixins.dart';
 import '../builder/declaration_builders.dart';
 import '../builder/library_builder.dart';
-import '../builder/member_builder.dart';
 import '../builder/type_builder.dart';
 import '../kernel/type_algorithms.dart';
 import 'source_library_builder.dart';
@@ -51,7 +50,8 @@
     ClassBuilder objectClassBuilder =
         coreLibrary.lookupLocalMember('Object', required: true) as ClassBuilder;
 
-    void buildBuilders(String name, Builder declaration) {
+    void buildBuilders(NamedBuilder declaration) {
+      String name = declaration.name;
       Builder? objectGetter = objectClassBuilder.lookupLocalMember(name);
       Builder? objectSetter =
           objectClassBuilder.lookupLocalMember(name, setter: true);
@@ -90,8 +90,8 @@
       }
     }
 
-    nameSpace.unfilteredNameIterator.forEach(buildBuilders);
-    nameSpace.unfilteredConstructorNameIterator.forEach(buildBuilders);
+    nameSpace.unfilteredIterator.forEach(buildBuilders);
+    nameSpace.unfilteredConstructorIterator.forEach(buildBuilders);
   }
 
   int buildBodyNodes({required bool addMembersToLibrary}) {
@@ -121,39 +121,37 @@
     int count = context.computeDefaultTypesForVariables(typeParameters,
         inErrorRecovery: hasErrors);
 
-    Iterator<SourceMemberBuilder> iterator =
+    Iterator<SourceMemberBuilder> constructorIterator =
         nameSpace.filteredConstructorIterator<SourceMemberBuilder>(
             includeDuplicates: false);
-    while (iterator.moveNext()) {
-      count += iterator.current
+    while (constructorIterator.moveNext()) {
+      count += constructorIterator.current
           .computeDefaultTypes(context, inErrorRecovery: hasErrors);
     }
 
-    forEach((String name, Builder member) {
-      if (member is SourceMemberBuilder) {
-        count +=
-            member.computeDefaultTypes(context, inErrorRecovery: hasErrors);
-      } else {
-        // Coverage-ignore-block(suite): Not run.
-        assert(
-            false,
-            "Unexpected extension type member "
-            "$member (${member.runtimeType}).");
-      }
-    });
+    Iterator<SourceMemberBuilder> memberIterator =
+        nameSpace.filteredIterator(includeDuplicates: false);
+    while (memberIterator.moveNext()) {
+      count += memberIterator.current
+          .computeDefaultTypes(context, inErrorRecovery: hasErrors);
+    }
     return count;
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
-    forEach((String name, Builder builder) {
-      (builder as SourceMemberBuilder)
+    Iterator<SourceMemberBuilder> memberIterator =
+        nameSpace.filteredIterator(includeDuplicates: false);
+    while (memberIterator.moveNext()) {
+      memberIterator.current
           .checkTypes(libraryBuilder, nameSpace, typeEnvironment);
-    });
+    }
 
-    nameSpace.forEachConstructor((String name, MemberBuilder builder) {
-      (builder as SourceMemberBuilder)
+    Iterator<SourceMemberBuilder> constructorIterator =
+        nameSpace.filteredConstructorIterator(includeDuplicates: false);
+    while (constructorIterator.moveNext()) {
+      constructorIterator.current
           .checkTypes(libraryBuilder, nameSpace, typeEnvironment);
-    });
+    }
   }
 
   void _buildMember(SourceMemberBuilder memberBuilder, Member member,
diff --git a/pkg/front_end/lib/src/source/source_class_builder.dart b/pkg/front_end/lib/src/source/source_class_builder.dart
index 3d94a6d..b9b3607 100644
--- a/pkg/front_end/lib/src/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/source/source_class_builder.dart
@@ -33,7 +33,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/method_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';
@@ -527,22 +526,13 @@
   }
 
   @override
-  Iterator<T> fullMemberIterator<T extends Builder>() =>
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>() =>
       nameSpace.filteredIterator<T>(includeDuplicates: false);
 
   @override
-  // Coverage-ignore(suite): Not run.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
-      nameSpace.filteredNameIterator<T>(includeDuplicates: false);
-
-  @override
   Iterator<T> fullConstructorIterator<T extends MemberBuilder>() =>
       nameSpace.filteredConstructorIterator<T>(includeDuplicates: false);
 
-  @override
-  NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() =>
-      nameSpace.filteredConstructorNameIterator<T>(includeDuplicates: false);
-
   /// Looks up the constructor by [name] on the class built by this class
   /// builder.
   SourceConstructorBuilder? lookupConstructor(Name name) {
@@ -759,7 +749,7 @@
       if (hasEnumSuperinterface && cls != underscoreEnumClass) {
         // Instance members named `values` are restricted.
         LookupResult? result = nameSpace.lookupLocalMember("values");
-        Builder? customValuesDeclaration = result?.getable;
+        NamedBuilder? customValuesDeclaration = result?.getable;
         if (customValuesDeclaration != null &&
             !customValuesDeclaration.isStatic) {
           // Retrieve the earliest declaration for error reporting.
diff --git a/pkg/front_end/lib/src/source/source_compilation_unit.dart b/pkg/front_end/lib/src/source/source_compilation_unit.dart
index 2266cbf..a04ae48 100644
--- a/pkg/front_end/lib/src/source/source_compilation_unit.dart
+++ b/pkg/front_end/lib/src/source/source_compilation_unit.dart
@@ -131,7 +131,7 @@
       LookupScope? parentScope,
       required bool forAugmentationLibrary,
       required SourceCompilationUnit? augmentationRoot,
-      required LibraryBuilder? nameOrigin,
+      required LibraryBuilder? resolveInLibrary,
       required bool? referenceIsPartOwner,
       required bool forPatchLibrary,
       required bool isAugmenting,
@@ -154,7 +154,7 @@
         prefixNameSpace: prefixNameSpace,
         forAugmentationLibrary: forAugmentationLibrary,
         augmentationRoot: augmentationRoot,
-        nameOrigin: nameOrigin,
+        resolveInLibrary: resolveInLibrary,
         referenceIsPartOwner: referenceIsPartOwner,
         forPatchLibrary: forPatchLibrary,
         isAugmenting: isAugmenting,
@@ -175,7 +175,7 @@
       required NameSpace prefixNameSpace,
       required this.forAugmentationLibrary,
       required SourceCompilationUnit? augmentationRoot,
-      required LibraryBuilder? nameOrigin,
+      required LibraryBuilder? resolveInLibrary,
       required bool? referenceIsPartOwner,
       required this.forPatchLibrary,
       required this.isAugmenting,
@@ -187,18 +187,25 @@
         _libraryNameSpaceBuilder = libraryNameSpaceBuilder,
         _importNameSpace = importNameSpace,
         _prefixNameSpace = prefixNameSpace,
-        _nameOrigin = nameOrigin,
+        _nameOrigin = resolveInLibrary,
         _parentScope = parentScope,
         _referenceIsPartOwner = referenceIsPartOwner,
         _problemReporting = new LibraryProblemReporting(loader, fileUri) {
     LookupScope scope =
         _importScope = new CompilationUnitImportScope(this, _importNameSpace);
     _prefixScope = new CompilationUnitPrefixScope(
-        prefixNameSpace, ScopeKind.prefix, 'prefix',
+        prefixNameSpace, ScopeKind.prefix,
         parent: scope);
+    LookupScope libraryScope = _prefixScope;
+    if (resolveInLibrary != null) {
+      // Coverage-ignore-block(suite): Not run.
+      libraryScope = new NameSpaceLookupScope(
+          resolveInLibrary.libraryNameSpace, ScopeKind.library,
+          parent: libraryScope);
+    }
     _compilationUnitScope = new CompilationUnitScope(
-        this, ScopeKind.compilationUnit, 'compilation-unit',
-        parent: _prefixScope);
+        this, ScopeKind.compilationUnit,
+        parent: libraryScope);
 
     // TODO(johnniwinther): Create these in [createOutlineBuilder].
     _builderFactoryResult = _builderFactory = new BuilderFactoryImpl(
@@ -951,11 +958,12 @@
 
       // TODO(johnniwinther): Can we create the core import as a parent scope
       //  instead of copying it everywhere?
-      NameIterator<Builder> iterator = loader.coreLibrary.exportNameSpace
-          .filteredNameIterator(includeDuplicates: false);
+      Iterator<NamedBuilder> iterator = loader.coreLibrary.exportNameSpace
+          .filteredIterator(includeDuplicates: false);
       while (iterator.moveNext()) {
+        NamedBuilder builder = iterator.current;
         addImportedBuilderToScope(
-            name: iterator.name, builder: iterator.current, charOffset: -1);
+            name: builder.name, builder: builder, charOffset: -1);
       }
     }
 
@@ -965,12 +973,12 @@
   @override
   void addImportedBuilderToScope(
       {required String name,
-      required Builder builder,
+      required NamedBuilder builder,
       required int charOffset}) {
     bool isSetter = isMappedAsSetter(builder);
     LookupResult? result = _importNameSpace.lookupLocalMember(name);
 
-    Builder? existing = isSetter ? result?.setable : result?.getable;
+    NamedBuilder? existing = isSetter ? result?.setable : result?.getable;
     if (existing != null) {
       if (existing != builder) {
         _importNameSpace.addLocalMember(
@@ -1064,9 +1072,9 @@
   int computeVariances() {
     int count = 0;
 
-    Iterator<Builder> iterator = libraryBuilder.localMembersIterator;
+    Iterator<NamedBuilder> iterator = libraryBuilder.localMembersIterator;
     while (iterator.moveNext()) {
-      Builder? declaration = iterator.current;
+      NamedBuilder? declaration = iterator.current;
       while (declaration != null) {
         if (declaration is TypeAliasBuilder &&
             declaration.typeParametersCount > 0) {
diff --git a/pkg/front_end/lib/src/source/source_constructor_builder.dart b/pkg/front_end/lib/src/source/source_constructor_builder.dart
index 2125e02..d5e2407 100644
--- a/pkg/front_end/lib/src/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/source/source_constructor_builder.dart
@@ -305,7 +305,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   bool get hasParameters => _introductory.hasParameters;
 
@@ -402,7 +402,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -770,7 +770,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
   Constructor get invokeTarget => _constructor;
@@ -843,7 +843,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart
index 94f71aa..30985d0 100644
--- a/pkg/front_end/lib/src/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -205,7 +205,7 @@
         "values", staticFieldNameScheme, indexedClass,
         fieldIsLateWithLowering: false);
 
-    Builder? customValuesDeclaration =
+    NamedBuilder? customValuesDeclaration =
         nameSpace.lookupLocalMember("values")?.getable;
     if (customValuesDeclaration != null) {
       // Retrieve the earliest declaration for error reporting.
@@ -224,9 +224,9 @@
       "hashCode",
       "=="
     ]) {
-      Builder? customIndexDeclaration =
+      NamedBuilder? customIndexDeclaration =
           nameSpace.lookupLocalMember(restrictedInstanceMemberName)?.getable;
-      Builder? invalidDeclaration;
+      NamedBuilder? invalidDeclaration;
       if (customIndexDeclaration is PropertyBuilder &&
           !customIndexDeclaration.hasAbstractGetter &&
           !customIndexDeclaration.isEnumElement) {
diff --git a/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart
index 1753a98..db9bec3 100644
--- a/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart
@@ -21,7 +21,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/record_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../fragment/fragment.dart';
@@ -856,22 +855,13 @@
       _extensionTypeDeclaration.declaredRepresentationType;
 
   @override
-  Iterator<T> fullMemberIterator<T extends Builder>() =>
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>() =>
       nameSpace.filteredIterator<T>(includeDuplicates: false);
 
   @override
-  // Coverage-ignore(suite): Not run.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
-      nameSpace.filteredNameIterator<T>(includeDuplicates: false);
-
-  @override
   Iterator<T> fullConstructorIterator<T extends MemberBuilder>() =>
       nameSpace.filteredConstructorIterator<T>(includeDuplicates: false);
 
-  @override
-  NameIterator<T> fullConstructorNameIterator<T extends MemberBuilder>() =>
-      nameSpace.filteredConstructorNameIterator<T>(includeDuplicates: false);
-
   BodyBuilderContext createBodyBuilderContext() {
     return new ExtensionTypeBodyBuilderContext(this);
   }
diff --git a/pkg/front_end/lib/src/source/source_factory_builder.dart b/pkg/front_end/lib/src/source/source_factory_builder.dart
index 813f11e..c9ce24f 100644
--- a/pkg/front_end/lib/src/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/source/source_factory_builder.dart
@@ -110,11 +110,11 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
   // Coverage-ignore(suite): Not run.
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   Builder get parent => declarationBuilder;
diff --git a/pkg/front_end/lib/src/source/source_library_builder.dart b/pkg/front_end/lib/src/source/source_library_builder.dart
index c17ef44..0d4d3ec 100644
--- a/pkg/front_end/lib/src/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/source/source_library_builder.dart
@@ -41,7 +41,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_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';
@@ -382,15 +381,10 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Iterator<T> fullMemberIterator<T extends Builder>() =>
+  Iterator<T> fullMemberIterator<T extends NamedBuilder>() =>
       libraryNameSpace.filteredIterator<T>(includeDuplicates: false);
 
   @override
-  // Coverage-ignore(suite): Not run.
-  NameIterator<T> fullMemberNameIterator<T extends Builder>() =>
-      libraryNameSpace.filteredNameIterator<T>(includeDuplicates: false);
-
-  @override
   bool get isSynthetic => compilationUnit.isSynthetic;
 
   bool get isInferenceUpdate1Enabled =>
@@ -473,11 +467,12 @@
   void buildInitialScopes() {
     assert(checkState(required: [SourceLibraryBuilderState.scopesBuilt]));
 
-    NameIterator iterator =
-        libraryNameSpace.filteredNameIterator(includeDuplicates: false);
+    Iterator<NamedBuilder> iterator =
+        libraryNameSpace.filteredIterator(includeDuplicates: false);
     UriOffset uriOffset = new UriOffset(fileUri, TreeNode.noOffset);
     while (iterator.moveNext()) {
-      addToExportScope(iterator.name, iterator.current, uriOffset: uriOffset);
+      NamedBuilder builder = iterator.current;
+      addToExportScope(builder.name, builder, uriOffset: uriOffset);
     }
 
     state = SourceLibraryBuilderState.initialExportScopesBuilt;
@@ -492,11 +487,11 @@
       part.addImportsToScope();
     }
 
-    NameIterator<Builder> iterator =
-        exportNameSpace.filteredNameIterator(includeDuplicates: false);
+    Iterator<NamedBuilder> iterator =
+        exportNameSpace.filteredIterator(includeDuplicates: false);
     while (iterator.moveNext()) {
-      String name = iterator.name;
-      Builder builder = iterator.current;
+      NamedBuilder builder = iterator.current;
+      String name = builder.name;
       if (builder.parent != this) {
         if (builder is TypeDeclarationBuilder) {
           switch (builder) {
@@ -686,10 +681,11 @@
         localMembersIteratorOfType();
     while (extensionIterator.moveNext()) {
       SourceExtensionBuilder extension_ = extensionIterator.current;
-      for (Builder member in extension_.nameSpace.localMembers) {
-        if (member is SourcePropertyBuilder &&
-            !member.isStatic &&
-            member.hasExplicitGetter) {
+      Iterator<SourcePropertyBuilder> iterator =
+          extension_.nameSpace.filteredIterator(includeDuplicates: false);
+      while (iterator.moveNext()) {
+        SourcePropertyBuilder member = iterator.current;
+        if (!member.isStatic && member.hasExplicitGetter) {
           individualPropertyReasons[member.readTarget!] =
               member.memberName.isPrivate
                   ? PropertyNonPromotabilityReason.isNotField
@@ -709,10 +705,11 @@
         individualPropertyReasons[representationGetter] =
             PropertyNonPromotabilityReason.isNotPrivate;
       }
-      for (Builder member in extensionType.nameSpace.localMembers) {
-        if (member is SourcePropertyBuilder &&
-            !member.isStatic &&
-            member.hasExplicitGetter) {
+      Iterator<SourcePropertyBuilder> iterator =
+          extensionType.nameSpace.filteredIterator(includeDuplicates: false);
+      while (iterator.moveNext()) {
+        SourcePropertyBuilder member = iterator.current;
+        if (!member.isStatic && member.hasExplicitGetter) {
           individualPropertyReasons[member.readTarget!] =
               member.memberName.isPrivate
                   ? PropertyNonPromotabilityReason.isNotField
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index cb31d24..059421e 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -50,7 +50,6 @@
 import '../builder/declaration_builders.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../codes/cfe_codes.dart';
@@ -113,7 +112,7 @@
   /// For builders created with a reference, this maps from that reference to
   /// that builder. This is used for looking up source builders when finalizing
   /// exports in dill builders.
-  Map<Reference, Builder> buildersCreatedWithReferences = {};
+  Map<Reference, NamedBuilder> buildersCreatedWithReferences = {};
 
   /// Used when checking whether a return type of an async function is valid.
   ///
@@ -420,7 +419,7 @@
         packageLanguageVersion: packageLanguageVersion,
         loader: this,
         augmentationRoot: origin,
-        nameOrigin: null,
+        resolveInLibrary: null,
         indexedLibrary: referencesFromIndex,
         referenceIsPartOwner: referenceIsPartOwner,
         isUnsupported: origin?.isUnsupported ??
@@ -1277,9 +1276,7 @@
             // TODO(johnniwinther): This should be the body scope of the
             //  fragment in which we are compiling the expression.
             memberScope = new NameSpaceLookupScope(
-                builder.nameSpace,
-                ScopeKind.declaration,
-                "debugExpression in class $enclosingClassOrExtension",
+                builder.nameSpace, ScopeKind.declaration,
                 parent: TypeParameterScope.fromList(
                     memberScope, builder.typeParameters));
           case ExtensionBuilder():
@@ -1287,9 +1284,7 @@
             // TODO(johnniwinther): This should be the body scope of the
             //  fragment in which we are compiling the expression.
             memberScope = new NameSpaceLookupScope(
-                builder.nameSpace,
-                ScopeKind.declaration,
-                "debugExpression in extension $enclosingClassOrExtension",
+                builder.nameSpace, ScopeKind.declaration,
                 // TODO(johnniwinther): Shouldn't type parameters be in scope?
                 parent: memberScope);
           case ExtensionTypeDeclarationBuilder():
@@ -1438,9 +1433,12 @@
         both.add(exported as SourceLibraryBuilder);
       }
       for (Export export in exported.exporters) {
-        exported.exportNameSpace
-            .filteredNameIterator(includeDuplicates: false)
-            .forEach(export.addToExportScope);
+        Iterator<NamedBuilder> iterator =
+            exported.exportNameSpace.filteredIterator(includeDuplicates: false);
+        while (iterator.moveNext()) {
+          NamedBuilder builder = iterator.current;
+          export.addToExportScope(builder.name, builder);
+        }
       }
     }
     bool wasChanged = false;
@@ -1448,10 +1446,11 @@
       wasChanged = false;
       for (SourceLibraryBuilder exported in both) {
         for (Export export in exported.exporters) {
-          NameIterator<Builder> iterator = exported.exportNameSpace
-              .filteredNameIterator(includeDuplicates: false);
+          Iterator<NamedBuilder> iterator = exported.exportNameSpace
+              .filteredIterator(includeDuplicates: false);
           while (iterator.moveNext()) {
-            if (export.addToExportScope(iterator.name, iterator.current)) {
+            NamedBuilder builder = iterator.current;
+            if (export.addToExportScope(builder.name, builder)) {
               wasChanged = true;
             }
           }
diff --git a/pkg/front_end/lib/src/source/source_method_builder.dart b/pkg/front_end/lib/src/source/source_method_builder.dart
index 8d4d476..215c9de 100644
--- a/pkg/front_end/lib/src/source/source_method_builder.dart
+++ b/pkg/front_end/lib/src/source/source_method_builder.dart
@@ -100,10 +100,10 @@
   bool get isSynthesized => false;
 
   @override
-  Builder get getable => this;
+  NamedBuilder get getable => this;
 
   @override
-  Builder? get setable => null;
+  NamedBuilder? get setable => null;
 
   @override
   int buildBodyNodes(BuildNodesCallback f) {
diff --git a/pkg/front_end/lib/src/source/source_property_builder.dart b/pkg/front_end/lib/src/source/source_property_builder.dart
index 2e2b6cf..03c909f 100644
--- a/pkg/front_end/lib/src/source/source_property_builder.dart
+++ b/pkg/front_end/lib/src/source/source_property_builder.dart
@@ -162,11 +162,11 @@
   bool get isEnumElement => _introductoryField?.isEnumElement ?? false;
 
   @override
-  Builder? get getable =>
+  NamedBuilder? get getable =>
       _introductoryField != null || _introductoryGetable != null ? this : null;
 
   @override
-  Builder? get setable =>
+  NamedBuilder? get setable =>
       _introductoryField != null && _introductoryField!.hasSetter ||
               _introductorySetable != null
           ? this
diff --git a/pkg/front_end/lib/src/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/source/source_type_alias_builder.dart
index 04df66f..270c57f 100644
--- a/pkg/front_end/lib/src/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/source/source_type_alias_builder.dart
@@ -12,7 +12,6 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
-import '../builder/name_iterator.dart';
 import '../builder/record_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../codes/cfe_codes.dart'
@@ -415,11 +414,11 @@
                 libraryBuilder.library)) {
           tearOffs = {};
           _tearOffDependencies = {};
-          NameIterator<MemberBuilder> iterator =
-              declaration.fullConstructorNameIterator();
+          Iterator<MemberBuilder> iterator =
+              declaration.fullConstructorIterator();
           while (iterator.moveNext()) {
-            String constructorName = iterator.name;
             MemberBuilder builder = iterator.current;
+            String constructorName = builder.name;
             Member? target = builder.invokeTarget;
             if (target != null) {
               if (target is Procedure && target.isRedirectingFactory) {
@@ -472,11 +471,11 @@
                 libraryBuilder.library)) {
           tearOffs = {};
           _tearOffDependencies = {};
-          NameIterator<MemberBuilder> iterator =
-              declaration.fullConstructorNameIterator();
+          Iterator<MemberBuilder> iterator =
+              declaration.fullConstructorIterator();
           while (iterator.moveNext()) {
-            String constructorName = iterator.name;
             MemberBuilder builder = iterator.current;
+            String constructorName = builder.name;
             Member? target = builder.invokeTarget;
             if (target != null) {
               if (target is Procedure && target.isRedirectingFactory) {
diff --git a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
index 87c3d10..feacd72 100644
--- a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
+++ b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
@@ -1592,9 +1592,9 @@
     required List<NominalParameterBuilder> unboundNominalParameters,
     required Map<SourceClassBuilder, TypeBuilder> mixinApplications,
   }) {
-    Map<String, Builder> getables = {};
+    Map<String, NamedBuilder> getables = {};
 
-    Map<String, MemberBuilder> setables = {};
+    Map<String, NamedBuilder> setables = {};
 
     Set<ExtensionBuilder> extensions = {};
 
@@ -1603,7 +1603,7 @@
 
     void _addBuilder(_AddBuilder addBuilder) {
       String name = addBuilder.name;
-      Builder declaration = addBuilder.declaration;
+      NamedBuilder declaration = addBuilder.declaration;
       Uri fileUri = addBuilder.fileUri;
       int charOffset = addBuilder.charOffset;
       if (declaration is SourceExtensionBuilder &&
@@ -1633,9 +1633,9 @@
 
       bool isSetter = isMappedAsSetter(declaration);
 
-      Map<String, Builder> members = isSetter ? setables : getables;
+      Map<String, NamedBuilder> members = isSetter ? setables : getables;
 
-      Builder? existing = members[name];
+      NamedBuilder? existing = members[name];
 
       if (existing == declaration) return;
 
@@ -1817,7 +1817,7 @@
 
 class _AddBuilder {
   final String name;
-  final Builder declaration;
+  final NamedBuilder declaration;
   final Uri fileUri;
   final int charOffset;
   final bool inPatch;
@@ -1887,8 +1887,8 @@
       required ContainerName containerName,
       bool includeConstructors = true}) {
     List<NominalParameterBuilder> unboundNominalParameters = [];
-    Map<String, Builder> getables = {};
-    Map<String, MemberBuilder> setables = {};
+    Map<String, NamedBuilder> getables = {};
+    Map<String, NamedBuilder> setables = {};
     Map<String, MemberBuilder> constructors = {};
 
     Map<String, List<Fragment>> fragmentsByName = {};
@@ -1898,7 +1898,7 @@
 
     void _addBuilder(_AddBuilder addBuilder) {
       String name = addBuilder.name;
-      Builder declaration = addBuilder.declaration;
+      NamedBuilder declaration = addBuilder.declaration;
       Uri fileUri = addBuilder.fileUri;
       int charOffset = addBuilder.charOffset;
 
@@ -1911,10 +1911,10 @@
 
       bool isSetter = isMappedAsSetter(declaration);
 
-      Map<String, Builder> members =
+      Map<String, NamedBuilder> members =
           isConstructor ? constructors : (isSetter ? setables : getables);
 
-      Builder? existing = members[name];
+      NamedBuilder? existing = members[name];
 
       if (existing == declaration) return;
 
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index eba88d4..a18e193 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -198,11 +198,12 @@
       compilerResult, extensionTypeDeclaration.enclosingLibrary,
       required: required)!;
   ExtensionTypeDeclarationBuilder? extensionTypeDeclarationBuilder;
-  for (Builder builder in libraryBuilder.libraryNameSpace.localMembers) {
-    if (builder is ExtensionTypeDeclarationBuilder &&
-        builder.extensionTypeDeclaration == extensionTypeDeclaration) {
-      extensionTypeDeclarationBuilder = builder;
-    }
+  Builder? builder = libraryBuilder.libraryNameSpace
+      .lookupLocalMember(extensionTypeDeclaration.name)
+      ?.getable;
+  if (builder is ExtensionTypeDeclarationBuilder &&
+      builder.extensionTypeDeclaration == extensionTypeDeclaration) {
+    extensionTypeDeclarationBuilder = builder;
   }
   if (extensionTypeDeclarationBuilder == null && required) {
     throw new ArgumentError(
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
index 8e213a7..3edd2f2 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
@@ -1017,11 +1017,10 @@
     ExtensionAccessCandidate? bestSoFar;
     List<ExtensionAccessCandidate> noneMoreSpecific = [];
     extensionScope.forEachExtension((ExtensionBuilder extensionBuilder) {
-      MemberBuilder? thisBuilder = extensionBuilder
-          .lookupLocalMemberByName(name, setter: setter) as MemberBuilder?;
-      MemberBuilder? otherBuilder = extensionBuilder.lookupLocalMemberByName(
-          otherName,
-          setter: otherIsSetter) as MemberBuilder?;
+      MemberBuilder? thisBuilder =
+          extensionBuilder.lookupLocalMemberByName(name, setter: setter);
+      MemberBuilder? otherBuilder = extensionBuilder
+          .lookupLocalMemberByName(otherName, setter: otherIsSetter);
       if ((thisBuilder != null && !thisBuilder.isStatic) ||
           (otherBuilder != null && !otherBuilder.isStatic)) {
         DartType onType;
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index bbf5047..69b533f 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -195,7 +195,7 @@
   ),
   // 100.0%.
   "package:front_end/src/base/name_space.dart": (
-    hitCount: 145,
+    hitCount: 119,
     missCount: 0,
   ),
   // 100.0%.
@@ -215,7 +215,7 @@
   ),
   // 100.0%.
   "package:front_end/src/base/scope.dart": (
-    hitCount: 323,
+    hitCount: 216,
     missCount: 0,
   ),
   // 100.0%.
@@ -250,7 +250,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/builder_mixins.dart": (
-    hitCount: 40,
+    hitCount: 36,
     missCount: 0,
   ),
   // 100.0%.
@@ -325,7 +325,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/library_builder.dart": (
-    hitCount: 104,
+    hitCount: 99,
     missCount: 0,
   ),
   // 100.0%.
@@ -370,7 +370,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/prefix_builder.dart": (
-    hitCount: 73,
+    hitCount: 75,
     missCount: 0,
   ),
   // 100.0%.
@@ -435,7 +435,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_builder.dart": (
-    hitCount: 86,
+    hitCount: 87,
     missCount: 0,
   ),
   // 100.0%.
@@ -445,7 +445,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_type_declaration_builder.dart": (
-    hitCount: 157,
+    hitCount: 158,
     missCount: 0,
   ),
   // 100.0%.
@@ -455,7 +455,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_library_builder.dart": (
-    hitCount: 338,
+    hitCount: 334,
     missCount: 0,
   ),
   // 100.0%.
@@ -465,7 +465,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_member_builder.dart": (
-    hitCount: 200,
+    hitCount: 202,
     missCount: 0,
   ),
   // 100.0%.
@@ -680,7 +680,7 @@
   ),
   // 100.0%.
   "package:front_end/src/kernel/body_builder.dart": (
-    hitCount: 7220,
+    hitCount: 7215,
     missCount: 0,
   ),
   // 100.0%.
@@ -740,7 +740,7 @@
   ),
   // 100.0%.
   "package:front_end/src/kernel/expression_generator.dart": (
-    hitCount: 2457,
+    hitCount: 2455,
     missCount: 0,
   ),
   // 100.0%.
@@ -845,7 +845,7 @@
   ),
   // 100.0%.
   "package:front_end/src/kernel/load_library_builder.dart": (
-    hitCount: 43,
+    hitCount: 44,
     missCount: 0,
   ),
   // 100.0%.
@@ -940,12 +940,12 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_builder_mixins.dart": (
-    hitCount: 113,
+    hitCount: 118,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_class_builder.dart": (
-    hitCount: 1435,
+    hitCount: 1429,
     missCount: 0,
   ),
   // 100.0%.
@@ -965,13 +965,13 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_extension_builder.dart": (
-    hitCount: 130,
+    hitCount: 131,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_extension_type_declaration_builder.dart":
       (
-    hitCount: 535,
+    hitCount: 534,
     missCount: 0,
   ),
   // 100.0%.
@@ -986,17 +986,17 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_library_builder.dart": (
-    hitCount: 1071,
+    hitCount: 1068,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_loader.dart": (
-    hitCount: 1767,
+    hitCount: 1769,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_member_builder.dart": (
-    hitCount: 11,
+    hitCount: 8,
     missCount: 0,
   ),
   // 100.0%.
diff --git a/pkg/front_end/test/dill_type_alias_builder_type_calc_test.dart b/pkg/front_end/test/dill_type_alias_builder_type_calc_test.dart
index d71b165..88f03ae 100644
--- a/pkg/front_end/test/dill_type_alias_builder_type_calc_test.dart
+++ b/pkg/front_end/test/dill_type_alias_builder_type_calc_test.dart
@@ -39,14 +39,16 @@
   ];
   for (LibraryBuilder builder in builders) {
     if (builder is! DillLibraryBuilder) continue;
-    builder.libraryNameSpace.forEachLocalMember((name, member) {
-      if (member is! DillTypeAliasBuilder) return;
+    Iterator<DillTypeAliasBuilder> iterator =
+        builder.libraryNameSpace.filteredIterator(includeDuplicates: false);
+    while (iterator.moveNext()) {
+      DillTypeAliasBuilder member = iterator.current;
       try {
         member.type;
       } catch (e) {
         failures.add(member);
       }
-    });
+    }
   }
 
   if (failures.isNotEmpty) {
diff --git a/pkg/front_end/test/generator_to_string_test.dart b/pkg/front_end/test/generator_to_string_test.dart
index 9ff1785..d171602 100644
--- a/pkg/front_end/test/generator_to_string_test.dart
+++ b/pkg/front_end/test/generator_to_string_test.dart
@@ -97,7 +97,7 @@
         indexedLibrary: null,
         forAugmentationLibrary: false,
         augmentationRoot: null,
-        nameOrigin: null,
+        resolveInLibrary: null,
         referenceIsPartOwner: null,
         forPatchLibrary: false,
         isAugmenting: false,
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index c96ef0a..cea1cce 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -118,9 +118,9 @@
       features.add(Tags.isAbstract);
     }
     clsBuilder.nameSpace
-        .filteredNameIterator(includeDuplicates: false)
-        .forEach((String name, Builder builder) {
-      features.addElement(Tags.scope, name);
+        .filteredIterator(includeDuplicates: false)
+        .forEach((NamedBuilder builder) {
+      features.addElement(Tags.scope, builder.name);
     });
 
     for (Member m in clsBuilder.cls.members) {
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index eb12a7d..d84aa6c 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -31,7 +31,6 @@
 import 'package:front_end/src/base/hybrid_file_system.dart';
 import 'package:front_end/src/base/incremental_compiler.dart';
 import 'package:front_end/src/base/processed_options.dart';
-import 'package:front_end/src/base/scope.dart';
 import 'package:front_end/src/base/uri_translator.dart';
 import 'package:front_end/src/builder/library_builder.dart';
 import 'package:front_end/src/codes/cfe_codes.dart';
@@ -972,9 +971,7 @@
       packageLanguageVersion:
           new ImplicitLanguageVersion(libraryBuilder.languageVersion),
       loader: loader,
-      parentScope: new NameSpaceLookupScope(
-          libraryBuilder.libraryNameSpace, ScopeKind.library, 'top'),
-      nameOrigin: libraryBuilder,
+      resolveInLibrary: libraryBuilder,
       isUnsupported: false,
       forAugmentationLibrary: false,
       isAugmenting: false,