[cfe] Introduce NameSpace

This adds a NameSpace interface to Scope and uses it for access to
local members. The NameSpace represents entities declared with a library
or class/extension (type) declaration and is to be used for creating
a Scope instead of being the scope itself. As such it is added to
LibraryBuilder and IDeclarationBuilder and used in place of the `scope`
property for accessing these entities.

Change-Id: Id9b03bc8e820ad8f6d185cc95d695ac4a5e59f8f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/376622
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart
index 55b7d11..66157f6 100644
--- a/pkg/front_end/lib/src/base/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/base/incremental_compiler.dart
@@ -640,7 +640,7 @@
 
             // Clear cached calculations that points (potential) to now replaced
             // things.
-            for (Builder builder in builder.scope.localMembers) {
+            for (Builder builder in builder.nameSpace.localMembers) {
               if (builder is DillClassBuilder) {
                 builder.clearCachedValues();
               }
@@ -1042,7 +1042,7 @@
         if (builder.isBuiltAndMarked) {
           // Clear cached calculations in classes which upon calculation can
           // mark things as needed.
-          for (Builder builder in builder.scope.localMembers) {
+          for (Builder builder in builder.nameSpace.localMembers) {
             if (builder is DillClassBuilder) {
               builder.clearCachedValues();
             }
@@ -1886,8 +1886,8 @@
 
       Class? cls;
       if (className != null) {
-        Builder? scopeMember =
-            libraryBuilder.scope.lookupLocalMember(className, setter: false);
+        Builder? scopeMember = libraryBuilder.nameSpace
+            .lookupLocalMember(className, setter: false);
         if (scopeMember is ClassBuilder) {
           cls = scopeMember.cls;
         } else {
@@ -1902,8 +1902,8 @@
         if (indexOfDot >= 0) {
           String beforeDot = methodName.substring(0, indexOfDot);
           String afterDot = methodName.substring(indexOfDot + 1);
-          Builder? builder =
-              libraryBuilder.scope.lookupLocalMember(beforeDot, setter: false);
+          Builder? builder = libraryBuilder.nameSpace
+              .lookupLocalMember(beforeDot, setter: false);
           extensionName = beforeDot;
           if (builder is ExtensionBuilder) {
             extension = builder.extension;
@@ -1983,14 +1983,14 @@
         isPatch: false,
       );
       debugLibrary.compilationUnit.createLibrary();
-      libraryBuilder.scope.forEachLocalMember((name, member) {
-        debugLibrary.scope.addLocalMember(name, member, setter: false);
+      libraryBuilder.nameSpace.forEachLocalMember((name, member) {
+        debugLibrary.nameSpace.addLocalMember(name, member, setter: false);
       });
-      libraryBuilder.scope.forEachLocalSetter((name, member) {
-        debugLibrary.scope.addLocalMember(name, member, setter: true);
+      libraryBuilder.nameSpace.forEachLocalSetter((name, member) {
+        debugLibrary.nameSpace.addLocalMember(name, member, setter: true);
       });
-      libraryBuilder.scope.forEachLocalExtension((member) {
-        debugLibrary.scope.addExtension(member);
+      libraryBuilder.nameSpace.forEachLocalExtension((member) {
+        debugLibrary.nameSpace.addExtension(member);
       });
       _ticker.logMs("Created debug library");
 
diff --git a/pkg/front_end/lib/src/base/scope.dart b/pkg/front_end/lib/src/base/scope.dart
index 3ab8263..d7c9f0b 100644
--- a/pkg/front_end/lib/src/base/scope.dart
+++ b/pkg/front_end/lib/src/base/scope.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// ignore_for_file: annotate_overrides
+
 library fasta.scope;
 
 import 'package:kernel/ast.dart';
@@ -178,7 +180,68 @@
   String toString() => "Scope(${kind}, $classNameOrDebugName, ${_local?.keys})";
 }
 
-class Scope extends MutableScope implements ParentScope, LookupScope {
+abstract class NameSpace {
+  void addLocalMember(String name, Builder member, {required bool setter});
+
+  Builder? lookupLocalMember(String name, {required bool setter});
+
+  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 scope,
+  /// including duplicate members mapped to the same name.
+  ///
+  /// The iterator does _not_ include the members and setters mapped in the
+  /// [parent] scope.
+  Iterator<Builder> get unfilteredIterator;
+
+  /// Returns an iterator of all members and setters mapped in this scope,
+  /// including duplicate members mapped to the same name.
+  ///
+  /// The iterator does _not_ include the members and setters mapped in the
+  /// [parent] scope.
+  ///
+  /// Compared to [unfilteredIterator] this iterator also gives access to the
+  /// name that the builders are mapped to.
+  NameIterator get unfilteredNameIterator;
+
+  /// Returns a filtered iterator of members and setters 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. If [includeAugmentations] is `true`, both
+  /// original and augmenting/patching members are included, otherwise, only
+  /// original members are included.
+  Iterator<T> filteredIterator<T extends Builder>(
+      {Builder? parent,
+      required bool includeDuplicates,
+      required bool includeAugmentations});
+
+  /// Returns a filtered iterator of members and setters 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. If [includeAugmentations] is `true`, both
+  /// original and augmenting/patching members are included, otherwise, only
+  /// original members are included.
+  ///
+  /// Compared to [filteredIterator] this iterator also gives access to the
+  /// name that the builders are mapped to.
+  NameIterator<T> filteredNameIterator<T extends Builder>(
+      {Builder? parent,
+      required bool includeDuplicates,
+      required bool includeAugmentations});
+}
+
+class Scope extends MutableScope
+    implements ParentScope, LookupScope, NameSpace {
   /// Indicates whether an attempt to declare new names in this scope should
   /// succeed.
   final bool isModifiable;
diff --git a/pkg/front_end/lib/src/builder/builder_mixins.dart b/pkg/front_end/lib/src/builder/builder_mixins.dart
index 70aebd5..803a236 100644
--- a/pkg/front_end/lib/src/builder/builder_mixins.dart
+++ b/pkg/front_end/lib/src/builder/builder_mixins.dart
@@ -58,7 +58,7 @@
   }
 
   void forEach(void f(String name, Builder builder)) {
-    scope
+    nameSpace
         .filteredNameIterator(
             includeDuplicates: false, includeAugmentations: false)
         .forEach(f);
@@ -72,7 +72,7 @@
       {bool setter = false, bool required = false}) {
     // TODO(johnniwinther): Support augmented on extensions/extension type
     //  declarations.
-    Builder? builder = scope.lookupLocalMember(name, setter: setter);
+    Builder? builder = nameSpace.lookupLocalMember(name, setter: setter);
     if (required && builder == null) {
       internalProblem(
           templateInternalProblemNotFoundIn.withArguments(
diff --git a/pkg/front_end/lib/src/builder/class_builder.dart b/pkg/front_end/lib/src/builder/class_builder.dart
index 58efb80..c7217cd 100644
--- a/pkg/front_end/lib/src/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/builder/class_builder.dart
@@ -177,16 +177,9 @@
   InterfaceType? _nonNullableRawType;
   InterfaceType? _thisType;
 
-  ClassBuilderImpl(
-      List<MetadataBuilder>? metadata,
-      int modifiers,
-      String name,
-      Scope scope,
-      ConstructorScope constructorScope,
-      LibraryBuilder parent,
-      int charOffset)
-      : super(metadata, modifiers, name, parent, charOffset, scope,
-            constructorScope);
+  ClassBuilderImpl(List<MetadataBuilder>? metadata, int modifiers, String name,
+      LibraryBuilder parent, int charOffset)
+      : super(metadata, modifiers, name, parent, charOffset);
 
   @override
   String get debugName => "ClassBuilder";
@@ -236,10 +229,10 @@
   @override
   Builder? lookupLocalMember(String name,
       {bool setter = false, bool required = false}) {
-    Builder? builder = scope.lookupLocalMember(name, setter: setter);
+    Builder? builder = nameSpace.lookupLocalMember(name, setter: setter);
     if (builder == null && isAugmenting) {
       // Coverage-ignore-block(suite): Not run.
-      builder = origin.scope.lookupLocalMember(name, setter: setter);
+      builder = origin.nameSpace.lookupLocalMember(name, setter: setter);
     }
     if (required && builder == null) {
       internalProblem(
diff --git a/pkg/front_end/lib/src/builder/constructor_reference_builder.dart b/pkg/front_end/lib/src/builder/constructor_reference_builder.dart
index af514a2..c99d16e 100644
--- a/pkg/front_end/lib/src/builder/constructor_reference_builder.dart
+++ b/pkg/front_end/lib/src/builder/constructor_reference_builder.dart
@@ -34,7 +34,7 @@
         "${suffix == null ? '' : '.$suffix'}";
   }
 
-  void resolveIn(Scope scope, LibraryBuilder accessingLibrary) {
+  void resolveIn(LookupScope scope, LibraryBuilder accessingLibrary) {
     Builder? declaration;
     String? qualifier = typeName.qualifier;
     if (qualifier != null) {
diff --git a/pkg/front_end/lib/src/builder/declaration_builder.dart b/pkg/front_end/lib/src/builder/declaration_builder.dart
index 6c765dc..757db4c 100644
--- a/pkg/front_end/lib/src/builder/declaration_builder.dart
+++ b/pkg/front_end/lib/src/builder/declaration_builder.dart
@@ -7,6 +7,8 @@
 abstract class IDeclarationBuilder implements ITypeDeclarationBuilder {
   Scope get scope;
 
+  NameSpace get nameSpace;
+
   LibraryBuilder get libraryBuilder;
 
   @override
@@ -49,22 +51,10 @@
 abstract class DeclarationBuilderImpl extends TypeDeclarationBuilderImpl
     implements IDeclarationBuilder {
   @override
-  final Scope scope;
-
-  @override
-  final ConstructorScope constructorScope;
-
-  @override
   final Uri fileUri;
 
-  DeclarationBuilderImpl(
-      List<MetadataBuilder>? metadata,
-      int modifiers,
-      String name,
-      LibraryBuilder parent,
-      int charOffset,
-      this.scope,
-      this.constructorScope)
+  DeclarationBuilderImpl(List<MetadataBuilder>? metadata, int modifiers,
+      String name, LibraryBuilder parent, int charOffset)
       : fileUri = parent.fileUri,
         super(metadata, modifiers, name, parent, charOffset);
 
diff --git a/pkg/front_end/lib/src/builder/extension_builder.dart b/pkg/front_end/lib/src/builder/extension_builder.dart
index 1bc85be..4a3287c 100644
--- a/pkg/front_end/lib/src/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/builder/extension_builder.dart
@@ -34,9 +34,8 @@
     with DeclarationBuilderMixin
     implements ExtensionBuilder {
   ExtensionBuilderImpl(List<MetadataBuilder>? metadata, int modifiers,
-      String name, LibraryBuilder parent, int charOffset, Scope scope)
-      : super(metadata, modifiers, name, parent, charOffset, scope,
-            new ConstructorScope(name, const {}));
+      String name, LibraryBuilder parent, int charOffset)
+      : super(metadata, modifiers, name, parent, charOffset);
 
   @override
   DartType buildAliasedTypeWithBuiltArguments(
diff --git a/pkg/front_end/lib/src/builder/extension_type_declaration_builder.dart b/pkg/front_end/lib/src/builder/extension_type_declaration_builder.dart
index 17ac217..71e61f3 100644
--- a/pkg/front_end/lib/src/builder/extension_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/builder/extension_type_declaration_builder.dart
@@ -35,16 +35,9 @@
     extends DeclarationBuilderImpl
     with DeclarationBuilderMixin
     implements ExtensionTypeDeclarationBuilder {
-  ExtensionTypeDeclarationBuilderImpl(
-      List<MetadataBuilder>? metadata,
-      int modifiers,
-      String name,
-      LibraryBuilder parent,
-      int charOffset,
-      Scope scope,
-      ConstructorScope constructorScope)
-      : super(metadata, modifiers, name, parent, charOffset, scope,
-            constructorScope);
+  ExtensionTypeDeclarationBuilderImpl(List<MetadataBuilder>? metadata,
+      int modifiers, String name, LibraryBuilder parent, int charOffset)
+      : super(metadata, modifiers, name, parent, charOffset);
 
   @override
   DartType buildAliasedTypeWithBuiltArguments(
diff --git a/pkg/front_end/lib/src/builder/library_builder.dart b/pkg/front_end/lib/src/builder/library_builder.dart
index ed8482f..5c105ab 100644
--- a/pkg/front_end/lib/src/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/builder/library_builder.dart
@@ -260,6 +260,8 @@
 abstract class LibraryBuilder implements Builder, ProblemReporting {
   Scope get scope;
 
+  NameSpace get nameSpace;
+
   Scope get exportScope;
 
   List<Export> get exporters;
@@ -420,19 +422,19 @@
 
   @override
   Iterator<Builder> get localMembersIterator {
-    return scope.filteredIterator(
+    return nameSpace.filteredIterator(
         parent: this, includeDuplicates: true, includeAugmentations: true);
   }
 
   @override
   Iterator<T> localMembersIteratorOfType<T extends Builder>() {
-    return scope.filteredIterator<T>(
+    return nameSpace.filteredIterator<T>(
         parent: this, includeDuplicates: true, includeAugmentations: true);
   }
 
   @override
   NameIterator<Builder> get localMembersNameIterator {
-    return scope.filteredNameIterator(
+    return nameSpace.filteredNameIterator(
         parent: this, includeDuplicates: true, includeAugmentations: true);
   }
 
@@ -523,7 +525,7 @@
 
   @override
   Builder? lookupLocalMember(String name, {bool required = false}) {
-    Builder? builder = scope.lookupLocalMember(name, setter: false);
+    Builder? builder = nameSpace.lookupLocalMember(name, setter: false);
     if (required && builder == null) {
       internalProblem(
           templateInternalProblemNotFoundIn.withArguments(
diff --git a/pkg/front_end/lib/src/builder/named_type_builder.dart b/pkg/front_end/lib/src/builder/named_type_builder.dart
index c932be2..df147b9 100644
--- a/pkg/front_end/lib/src/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/builder/named_type_builder.dart
@@ -192,7 +192,7 @@
   }
 
   @override
-  void resolveIn(Scope scope, int charOffset, Uri fileUri,
+  void resolveIn(LookupScope scope, int charOffset, Uri fileUri,
       ProblemReporting problemReporting) {
     if (_declaration != null) return;
     Builder? member;
diff --git a/pkg/front_end/lib/src/builder/type_builder.dart b/pkg/front_end/lib/src/builder/type_builder.dart
index 0e7f423..815c9b1 100644
--- a/pkg/front_end/lib/src/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/builder/type_builder.dart
@@ -491,7 +491,7 @@
   @override
   TypeName get typeName;
 
-  void resolveIn(Scope scope, int charOffset, Uri fileUri,
+  void resolveIn(LookupScope scope, int charOffset, Uri fileUri,
       ProblemReporting problemReporting);
   void bind(
       ProblemReporting problemReporting, TypeDeclarationBuilder declaration);
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 c5483b0..4ea03bf 100644
--- a/pkg/front_end/lib/src/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_class_builder.dart
@@ -52,6 +52,12 @@
   @override
   final Class cls;
 
+  @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
   List<NominalVariableBuilder>? _typeVariables;
 
   TypeBuilder? _supertypeBuilder;
@@ -59,20 +65,20 @@
   List<TypeBuilder>? _interfaceBuilders;
 
   DillClassBuilder(this.cls, DillLibraryBuilder parent)
-      : super(
-            /*metadata builders*/ null,
-            computeModifiers(cls),
-            cls.name,
-            new Scope(
-                kind: ScopeKind.declaration,
-                local: <String, MemberBuilder>{},
-                setters: <String, MemberBuilder>{},
-                parent: parent.scope,
-                debugName: "class ${cls.name}",
-                isModifiable: false),
+      : scope = new Scope(
+            kind: ScopeKind.declaration,
+            local: <String, MemberBuilder>{},
+            setters: <String, MemberBuilder>{},
+            parent: parent.scope,
+            debugName: "class ${cls.name}",
+            isModifiable: false),
+        constructorScope =
             new ConstructorScope(cls.name, <String, MemberBuilder>{}),
-            parent,
-            cls.fileOffset);
+        super(/*metadata builders*/ null, computeModifiers(cls), cls.name,
+            parent, cls.fileOffset);
+
+  @override
+  NameSpace get nameSpace => scope;
 
   @override
   bool get isEnum => cls.isEnum;
@@ -137,7 +143,7 @@
   void addField(Field field) {
     DillFieldBuilder builder = new DillFieldBuilder(field, this);
     String name = field.name.text;
-    scope.addLocalMember(name, builder, setter: false);
+    nameSpace.addLocalMember(name, builder, setter: false);
   }
 
   void addConstructor(Constructor constructor, Procedure? constructorTearOff) {
@@ -160,19 +166,19 @@
         // Coverage-ignore(suite): Not run.
         throw new UnsupportedError("Use addFactory for adding factories");
       case ProcedureKind.Setter:
-        scope.addLocalMember(name, new DillSetterBuilder(procedure, this),
+        nameSpace.addLocalMember(name, new DillSetterBuilder(procedure, this),
             setter: true);
         break;
       case ProcedureKind.Getter:
-        scope.addLocalMember(name, new DillGetterBuilder(procedure, this),
+        nameSpace.addLocalMember(name, new DillGetterBuilder(procedure, this),
             setter: false);
         break;
       case ProcedureKind.Operator:
-        scope.addLocalMember(name, new DillOperatorBuilder(procedure, this),
+        nameSpace.addLocalMember(name, new DillOperatorBuilder(procedure, this),
             setter: false);
         break;
       case ProcedureKind.Method:
-        scope.addLocalMember(name, new DillMethodBuilder(procedure, this),
+        nameSpace.addLocalMember(name, new DillMethodBuilder(procedure, this),
             setter: false);
         break;
     }
diff --git a/pkg/front_end/lib/src/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/dill/dill_extension_builder.dart
index 6e7a056..0c2d701 100644
--- a/pkg/front_end/lib/src/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_extension_builder.dart
@@ -17,30 +17,34 @@
     with DillDeclarationBuilderMixin {
   @override
   final Extension extension;
+
+  @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
   List<NominalVariableBuilder>? _typeParameters;
   TypeBuilder? _onType;
 
   DillExtensionBuilder(this.extension, LibraryBuilder parent)
-      : super(
-            /* metadata = */ null,
-            0,
-            extension.name,
-            parent,
-            extension.fileOffset,
-            new Scope(
-                kind: ScopeKind.declaration,
-                local: <String, MemberBuilder>{},
-                setters: <String, MemberBuilder>{},
-                parent: parent.scope,
-                debugName: "extension ${extension.name}",
-                isModifiable: false)) {
+      : scope = new Scope(
+            kind: ScopeKind.declaration,
+            local: <String, MemberBuilder>{},
+            setters: <String, MemberBuilder>{},
+            parent: parent.scope,
+            debugName: "extension ${extension.name}",
+            isModifiable: false),
+        constructorScope = new ConstructorScope(extension.name, const {}),
+        super(/* metadata = */ null, 0, extension.name, parent,
+            extension.fileOffset) {
     for (ExtensionMemberDescriptor descriptor in extension.memberDescriptors) {
       Name name = descriptor.name;
       switch (descriptor.kind) {
         case ExtensionMemberKind.Method:
           if (descriptor.isStatic) {
             Procedure procedure = descriptor.memberReference.asProcedure;
-            scope.addLocalMember(
+            nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionStaticMethodBuilder(
                     procedure, descriptor, this),
@@ -51,7 +55,7 @@
             assert(
                 tearOff != null, // Coverage-ignore(suite): Not run.
                 "No tear found for ${descriptor}");
-            scope.addLocalMember(
+            nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionInstanceMethodBuilder(
                     procedure, descriptor, this, tearOff!),
@@ -60,25 +64,25 @@
           break;
         case ExtensionMemberKind.Getter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionGetterBuilder(procedure, descriptor, this),
               setter: false);
           break;
         case ExtensionMemberKind.Field:
           Field field = descriptor.memberReference.asField;
-          scope.addLocalMember(
+          nameSpace.addLocalMember(
               name.text, new DillExtensionFieldBuilder(field, descriptor, this),
               setter: false);
           break;
         case ExtensionMemberKind.Setter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionSetterBuilder(procedure, descriptor, this),
               setter: true);
           break;
         case ExtensionMemberKind.Operator:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionOperatorBuilder(procedure, descriptor, this),
               setter: false);
           break;
@@ -87,6 +91,9 @@
   }
 
   @override
+  NameSpace get nameSpace => scope;
+
+  @override
   List<NominalVariableBuilder>? get typeParameters {
     if (_typeParameters == null && extension.typeParameters.isNotEmpty) {
       _typeParameters = computeTypeVariableBuilders(
diff --git a/pkg/front_end/lib/src/dill/dill_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/dill/dill_extension_type_declaration_builder.dart
index 684a37a..7c7e42a 100644
--- a/pkg/front_end/lib/src/dill/dill_extension_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_extension_type_declaration_builder.dart
@@ -19,6 +19,12 @@
     with DillClassMemberAccessMixin, DillDeclarationBuilderMixin {
   final ExtensionTypeDeclaration _extensionTypeDeclaration;
 
+  @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
   List<NominalVariableBuilder>? _typeParameters;
 
   List<TypeBuilder>? _interfaceBuilders;
@@ -27,23 +33,23 @@
 
   DillExtensionTypeDeclarationBuilder(
       this._extensionTypeDeclaration, DillLibraryBuilder parent)
-      : super(
+      : scope = new Scope(
+            kind: ScopeKind.declaration,
+            local: <String, MemberBuilder>{},
+            setters: <String, MemberBuilder>{},
+            parent: parent.scope,
+            debugName: "extension type ${_extensionTypeDeclaration.name}",
+            isModifiable: false),
+        constructorScope = new ConstructorScope(
+            _extensionTypeDeclaration.name, <String, MemberBuilder>{}),
+        super(
             /*metadata builders*/
             null,
             /* modifiers*/
             0,
             _extensionTypeDeclaration.name,
             parent,
-            _extensionTypeDeclaration.fileOffset,
-            new Scope(
-                kind: ScopeKind.declaration,
-                local: <String, MemberBuilder>{},
-                setters: <String, MemberBuilder>{},
-                parent: parent.scope,
-                debugName: "extension type ${_extensionTypeDeclaration.name}",
-                isModifiable: false),
-            new ConstructorScope(
-                _extensionTypeDeclaration.name, <String, MemberBuilder>{})) {
+            _extensionTypeDeclaration.fileOffset) {
     for (Procedure procedure in _extensionTypeDeclaration.procedures) {
       String name = procedure.name.text;
       switch (procedure.kind) {
@@ -54,19 +60,20 @@
               "$procedure (${procedure.kind}).");
         case ProcedureKind.Setter:
           // Coverage-ignore(suite): Not run.
-          scope.addLocalMember(name, new DillSetterBuilder(procedure, this),
+          nameSpace.addLocalMember(name, new DillSetterBuilder(procedure, this),
               setter: true);
           break;
         case ProcedureKind.Getter:
-          scope.addLocalMember(name, new DillGetterBuilder(procedure, this),
+          nameSpace.addLocalMember(name, new DillGetterBuilder(procedure, this),
               setter: false);
           break;
         case ProcedureKind.Operator:
-          scope.addLocalMember(name, new DillOperatorBuilder(procedure, this),
+          nameSpace.addLocalMember(
+              name, new DillOperatorBuilder(procedure, this),
               setter: false);
           break;
         case ProcedureKind.Method:
-          scope.addLocalMember(name, new DillMethodBuilder(procedure, this),
+          nameSpace.addLocalMember(name, new DillMethodBuilder(procedure, this),
               setter: false);
           break;
       }
@@ -78,7 +85,7 @@
         case ExtensionTypeMemberKind.Method:
           if (descriptor.isStatic) {
             Procedure procedure = descriptor.memberReference.asProcedure;
-            scope.addLocalMember(
+            nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionTypeStaticMethodBuilder(
                     procedure, descriptor, this),
@@ -89,7 +96,7 @@
             assert(
                 tearOff != null, // Coverage-ignore(suite): Not run.
                 "No tear found for ${descriptor}");
-            scope.addLocalMember(
+            nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionTypeInstanceMethodBuilder(
                     procedure, descriptor, this, tearOff!),
@@ -98,25 +105,25 @@
           break;
         case ExtensionTypeMemberKind.Getter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionTypeGetterBuilder(procedure, descriptor, this),
               setter: false);
           break;
         case ExtensionTypeMemberKind.Field:
           Field field = descriptor.memberReference.asField;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionTypeFieldBuilder(field, descriptor, this),
               setter: false);
           break;
         case ExtensionTypeMemberKind.Setter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionTypeSetterBuilder(procedure, descriptor, this),
               setter: true);
           break;
         case ExtensionTypeMemberKind.Operator:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          scope.addLocalMember(name.text,
+          nameSpace.addLocalMember(name.text,
               new DillExtensionTypeOperatorBuilder(procedure, descriptor, this),
               setter: false);
           break;
@@ -145,6 +152,9 @@
   DillLibraryBuilder get libraryBuilder => parent as DillLibraryBuilder;
 
   @override
+  NameSpace get nameSpace => scope;
+
+  @override
   DartType get declaredRepresentationType =>
       _extensionTypeDeclaration.declaredRepresentationType;
 
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 3567774..c478e49 100644
--- a/pkg/front_end/lib/src/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_library_builder.dart
@@ -151,6 +151,9 @@
   Scope get scope => _scope;
 
   @override
+  Scope get nameSpace => _scope;
+
+  @override
   Scope get exportScope => _exportScope;
 
   @override
@@ -235,17 +238,17 @@
 
   @override
   void becomeCoreLibrary() {
-    if (scope.lookupLocalMember("dynamic", setter: false) == null) {
+    if (nameSpace.lookupLocalMember("dynamic", setter: false) == null) {
       _addBuilder("dynamic",
           new DynamicTypeDeclarationBuilder(const DynamicType(), this, -1));
     }
-    if (scope.lookupLocalMember("Never", setter: false) == null) {
+    if (nameSpace.lookupLocalMember("Never", setter: false) == null) {
       _addBuilder(
           "Never",
           new NeverTypeDeclarationBuilder(
               const NeverType.nonNullable(), this, -1));
     }
-    assert(scope.lookupLocalMember("Null", setter: false) != null,
+    assert(nameSpace.lookupLocalMember("Null", setter: false) != null,
         "No class 'Null' found in dart:core.");
   }
 
@@ -346,12 +349,13 @@
 
     bool isSetter = declaration.isSetter;
     if (isSetter) {
-      scope.addLocalMember(name, declaration as MemberBuilder, setter: true);
+      nameSpace.addLocalMember(name, declaration as MemberBuilder,
+          setter: true);
     } else {
-      scope.addLocalMember(name, declaration, setter: false);
+      nameSpace.addLocalMember(name, declaration, setter: false);
     }
     if (declaration.isExtension) {
-      scope.addExtension(declaration as ExtensionBuilder);
+      nameSpace.addExtension(declaration as ExtensionBuilder);
     }
     if (!name.startsWith("_") && !name.contains('#')) {
       if (isSetter) {
@@ -497,14 +501,14 @@
   @override
   // Coverage-ignore(suite): Not run.
   Iterator<T> fullMemberIterator<T extends Builder>() {
-    return scope.filteredIterator<T>(
+    return nameSpace.filteredIterator<T>(
         includeDuplicates: false, includeAugmentations: false);
   }
 
   @override
   // Coverage-ignore(suite): Not run.
   NameIterator<T> fullMemberNameIterator<T extends Builder>() {
-    return scope.filteredNameIterator(
+    return nameSpace.filteredNameIterator(
         includeDuplicates: false, includeAugmentations: false);
   }
 
diff --git a/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart
index b98b4cc..f065b9b 100644
--- a/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/kernel/macro/annotation_parser.dart
@@ -28,7 +28,7 @@
     {required SourceLibraryBuilder enclosingLibrary,
     required List<MetadataBuilder>? metadataBuilders,
     required Uri fileUri,
-    required Scope scope,
+    required LookupScope scope,
     required Set<ClassBuilder> currentMacroDeclarations}) {
   if (metadataBuilders == null) return null;
   List<MacroApplication>? result;
@@ -154,7 +154,7 @@
   @override
   final Uri uri;
 
-  final Scope scope;
+  final LookupScope scope;
 
   final List<_Node> _stack = [];
 
diff --git a/pkg/front_end/lib/src/kernel/macro/introspectors.dart b/pkg/front_end/lib/src/kernel/macro/introspectors.dart
index a1aeba6..8a885f9 100644
--- a/pkg/front_end/lib/src/kernel/macro/introspectors.dart
+++ b/pkg/front_end/lib/src/kernel/macro/introspectors.dart
@@ -689,8 +689,8 @@
       memberName = name.substring(0, name.length - 1);
       isSetter = true;
     }
-    Builder? builder =
-        libraryBuilder.scope.lookupLocalMember(memberName, setter: isSetter);
+    Builder? builder = libraryBuilder.nameSpace
+        .lookupLocalMember(memberName, setter: isSetter);
     if (builder == null) {
       return new Future.error(
           new macro.MacroImplementationExceptionImpl(
diff --git a/pkg/front_end/lib/src/source/class_declaration.dart b/pkg/front_end/lib/src/source/class_declaration.dart
index 4fb9107..0489aef 100644
--- a/pkg/front_end/lib/src/source/class_declaration.dart
+++ b/pkg/front_end/lib/src/source/class_declaration.dart
@@ -247,7 +247,7 @@
   ClassDeclarationMemberIterator._(
       D classDeclaration, this.augmentationBuilders,
       {required this.includeDuplicates})
-      : _iterator = classDeclaration.scope.filteredIterator<T>(
+      : _iterator = classDeclaration.nameSpace.filteredIterator<T>(
             parent: classDeclaration,
             includeDuplicates: includeDuplicates,
             includeAugmentations: false);
@@ -261,7 +261,7 @@
     }
     if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
       D augmentationClassDeclaration = augmentationBuilders!.current;
-      _iterator = augmentationClassDeclaration.scope.filteredIterator<T>(
+      _iterator = augmentationClassDeclaration.nameSpace.filteredIterator<T>(
           parent: augmentationClassDeclaration,
           includeDuplicates: includeDuplicates,
           includeAugmentations: false);
@@ -299,7 +299,7 @@
   ClassDeclarationMemberNameIterator._(
       D classDeclaration, this.augmentationBuilders,
       {required this.includeDuplicates})
-      : _iterator = classDeclaration.scope.filteredNameIterator<T>(
+      : _iterator = classDeclaration.nameSpace.filteredNameIterator<T>(
             parent: classDeclaration,
             includeDuplicates: includeDuplicates,
             includeAugmentations: false);
@@ -313,10 +313,11 @@
     }
     if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
       D augmentationClassDeclaration = augmentationBuilders!.current;
-      _iterator = augmentationClassDeclaration.scope.filteredNameIterator<T>(
-          parent: augmentationClassDeclaration,
-          includeDuplicates: includeDuplicates,
-          includeAugmentations: false);
+      _iterator = augmentationClassDeclaration.nameSpace
+          .filteredNameIterator<T>(
+              parent: augmentationClassDeclaration,
+              includeDuplicates: includeDuplicates,
+              includeAugmentations: false);
     }
     if (_iterator != null) {
       if (_iterator!.moveNext()) {
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 7ed1776..48d01ec 100644
--- a/pkg/front_end/lib/src/source/source_builder_mixins.dart
+++ b/pkg/front_end/lib/src/source/source_builder_mixins.dart
@@ -48,7 +48,7 @@
   /// library.
   void buildInternal(LibraryBuilder coreLibrary,
       {required bool addMembersToLibrary}) {
-    SourceLibraryBuilder.checkMemberConflicts(libraryBuilder, scope,
+    SourceLibraryBuilder.checkMemberConflicts(libraryBuilder, nameSpace,
         checkForInstanceVsStaticConflict: true,
         checkForMethodVsSetterConflict: true);
 
@@ -94,13 +94,13 @@
       }
     }
 
-    scope.unfilteredNameIterator.forEach(buildBuilders);
+    nameSpace.unfilteredNameIterator.forEach(buildBuilders);
     constructorScope.unfilteredNameIterator.forEach(buildBuilders);
   }
 
   int buildBodyNodes({required bool addMembersToLibrary}) {
     int count = 0;
-    Iterator<SourceMemberBuilder> iterator = scope
+    Iterator<SourceMemberBuilder> iterator = nameSpace
         .filteredIterator<SourceMemberBuilder>(
             parent: this, includeDuplicates: false, includeAugmentations: true)
         .join(constructorScope.filteredIterator<SourceMemberBuilder>(
@@ -132,7 +132,7 @@
         libraryBuilder.checkTypesInFunctionBuilder(builder, typeEnvironment);
         if (builder.isGetter) {
           Builder? setterDeclaration =
-              scope.lookupLocalMember(builder.name, setter: true);
+              nameSpace.lookupLocalMember(builder.name, setter: true);
           if (setterDeclaration != null) {
             libraryBuilder.checkGetterSetterTypes(builder,
                 setterDeclaration as ProcedureBuilder, typeEnvironment);
@@ -181,7 +181,7 @@
       }
     }
 
-    Iterator<SourceMemberBuilder> iterator = scope.filteredIterator(
+    Iterator<SourceMemberBuilder> iterator = nameSpace.filteredIterator(
         parent: this, includeDuplicates: false, includeAugmentations: true);
     while (iterator.moveNext()) {
       iterator.current.buildOutlineExpressions(
@@ -296,7 +296,7 @@
     while (iterator.moveNext()) {
       String name = iterator.name;
       MemberBuilder constructor = iterator.current;
-      Builder? member = scope.lookupLocalMember(name, setter: false);
+      Builder? member = nameSpace.lookupLocalMember(name, setter: false);
       if (member == null) continue;
       if (!member.isStatic) continue;
       // TODO(ahe): Revisit these messages. It seems like the last two should
@@ -317,7 +317,7 @@
       }
     }
 
-    scope.forEachLocalSetter((String name, Builder setter) {
+    nameSpace.forEachLocalSetter((String name, Builder setter) {
       Builder? constructor = constructorScope.lookupLocalMember(name);
       if (constructor == null || !setter.isStatic) return;
       // Coverage-ignore-block(suite): Not run.
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 d6c5fa8..d1d0849 100644
--- a/pkg/front_end/lib/src/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/source/source_class_builder.dart
@@ -91,6 +91,12 @@
   final Class actualCls;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   List<NominalVariableBuilder>? typeVariables;
 
   /// The scope in which the [typeParameters] are declared.
@@ -166,8 +172,8 @@
       this.interfaceBuilders,
       this.onTypes,
       this.typeParameterScope,
-      Scope scope,
-      ConstructorScope constructors,
+      this.scope,
+      this.constructorScope,
       SourceLibraryBuilder parent,
       this.constructorReferences,
       int startCharOffset,
@@ -188,11 +194,13 @@
             startCharOffset, nameOffset, charEndOffset, indexedContainer,
             isAugmentation: isAugmentation),
         isAugmentation = isAugmentation,
-        super(metadata, modifiers, name, scope, constructors, parent,
-            nameOffset) {
+        super(metadata, modifiers, name, parent, nameOffset) {
     actualCls.hasConstConstructor = declaresConstConstructor;
   }
 
+  @override
+  NameSpace get nameSpace => scope;
+
   MergedClassMemberScope get mergedScope => _mergedScope ??= isAugmenting
       ?
       // Coverage-ignore(suite): Not run.
@@ -215,7 +223,7 @@
       super.libraryBuilder as SourceLibraryBuilder;
 
   Class build(LibraryBuilder coreLibrary) {
-    SourceLibraryBuilder.checkMemberConflicts(libraryBuilder, scope,
+    SourceLibraryBuilder.checkMemberConflicts(libraryBuilder, nameSpace,
         // These checks are performed as part of the class hierarchy
         // computation.
         checkForInstanceVsStaticConflict: false,
@@ -253,7 +261,7 @@
       }
     }
 
-    scope.unfilteredIterator.forEach(buildBuilders);
+    nameSpace.unfilteredIterator.forEach(buildBuilders);
     constructorScope.unfilteredIterator.forEach(buildBuilders);
     if (supertypeBuilder != null) {
       supertypeBuilder = _checkSupertype(supertypeBuilder!);
@@ -396,7 +404,7 @@
         .filteredIterator(
             parent: this, includeDuplicates: false, includeAugmentations: true)
         .forEach(build);
-    scope
+    nameSpace
         .filteredIterator(
             parent: this, includeDuplicates: false, includeAugmentations: true)
         .forEach(build);
@@ -652,14 +660,14 @@
               hierarchyBuilder.getNodeFromClass(interfaceClass);
           for (String restrictedMemberName in restrictedNames) {
             // TODO(johnniwinther): Handle injected members.
-            Builder? member = superclassHierarchyNode.classBuilder.scope
+            Builder? member = superclassHierarchyNode.classBuilder.nameSpace
                 .lookupLocalMember(restrictedMemberName, setter: false);
             if (member is MemberBuilder && !member.isAbstract) {
               restrictedMembersInSuperclasses[restrictedMemberName] ??=
                   superclassHierarchyNode.classBuilder;
             }
           }
-          Builder? member = superclassHierarchyNode.classBuilder.scope
+          Builder? member = superclassHierarchyNode.classBuilder.nameSpace
               .lookupLocalMember("values", setter: false);
           if (member is MemberBuilder && !member.isAbstract) {
             superclassDeclaringConcreteValues ??= member.classBuilder;
@@ -680,7 +688,7 @@
       if (hasEnumSuperinterface && cls != underscoreEnumClass) {
         // Instance members named `values` are restricted.
         Builder? customValuesDeclaration =
-            scope.lookupLocalMember("values", setter: false);
+            nameSpace.lookupLocalMember("values", setter: false);
         if (customValuesDeclaration != null &&
             !customValuesDeclaration.isStatic) {
           // Retrieve the earliest declaration for error reporting.
@@ -696,7 +704,7 @@
               fileUri);
         }
         customValuesDeclaration =
-            scope.lookupLocalMember("values", setter: true);
+            nameSpace.lookupLocalMember("values", setter: true);
         if (customValuesDeclaration != null &&
             !customValuesDeclaration.isStatic) {
           // Retrieve the earliest declaration for error reporting.
@@ -724,7 +732,7 @@
         // operator == are restricted.
         for (String restrictedMemberName in restrictedNames) {
           Builder? member =
-              scope.lookupLocalMember(restrictedMemberName, setter: false);
+              nameSpace.lookupLocalMember(restrictedMemberName, setter: false);
           if (member is MemberBuilder && !member.isAbstract) {
             libraryBuilder.addProblem(
                 templateEnumImplementerContainsRestrictedInstanceDeclaration
@@ -1165,7 +1173,7 @@
       }
     }
 
-    scope
+    nameSpace
         .filteredIterator(
             parent: this, includeDuplicates: true, includeAugmentations: true)
         .forEach(buildMembers);
diff --git a/pkg/front_end/lib/src/source/source_extension_builder.dart b/pkg/front_end/lib/src/source/source_extension_builder.dart
index 4e107b5..1dbe80f 100644
--- a/pkg/front_end/lib/src/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/source/source_extension_builder.dart
@@ -33,6 +33,12 @@
   MergedClassMemberScope? _mergedScope;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   final List<NominalVariableBuilder>? typeParameters;
 
   @override
@@ -50,7 +56,7 @@
       this.typeParameters,
       this.onType,
       this.typeParameterScope,
-      Scope scope,
+      this.scope,
       SourceLibraryBuilder parent,
       int startOffset,
       int nameOffset,
@@ -65,12 +71,15 @@
           ..isExtensionTypeDeclaration = false
           ..isUnnamedExtension = extensionName.isUnnamedExtension
           ..fileOffset = nameOffset,
-        super(metadata, modifiers, extensionName.name, parent, nameOffset,
-            scope) {
+        constructorScope = new ConstructorScope(extensionName.name, const {}),
+        super(metadata, modifiers, extensionName.name, parent, nameOffset) {
     extensionName.attachExtension(_extension);
   }
 
   @override
+  NameSpace get nameSpace => scope;
+
+  @override
   SourceLibraryBuilder get libraryBuilder =>
       super.libraryBuilder as SourceLibraryBuilder;
 
@@ -197,16 +206,16 @@
       // TODO(johnniwinther): Check that type parameters and on-type match
       // with origin declaration.
 
-      scope.forEachLocalMember((String name, Builder member) {
+      nameSpace.forEachLocalMember((String name, Builder member) {
         Builder? memberAugmentation =
-            augmentation.scope.lookupLocalMember(name, setter: false);
+            augmentation.nameSpace.lookupLocalMember(name, setter: false);
         if (memberAugmentation != null) {
           member.applyAugmentation(memberAugmentation);
         }
       });
-      scope.forEachLocalSetter((String name, Builder member) {
+      nameSpace.forEachLocalSetter((String name, Builder member) {
         Builder? memberAugmentation =
-            augmentation.scope.lookupLocalMember(name, setter: true);
+            augmentation.nameSpace.lookupLocalMember(name, setter: true);
         if (memberAugmentation != null) {
           member.applyAugmentation(memberAugmentation);
         }
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 81d9c42..e6512c9 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
@@ -56,6 +56,12 @@
   MergedClassMemberScope? _mergedScope;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   final List<NominalVariableBuilder>? typeParameters;
 
   @override
@@ -75,8 +81,8 @@
       this.typeParameters,
       this.interfaceBuilders,
       this.typeParameterScope,
-      Scope scope,
-      ConstructorScope constructorScope,
+      this.scope,
+      this.constructorScope,
       SourceLibraryBuilder parent,
       this.constructorReferences,
       int startOffset,
@@ -91,8 +97,10 @@
                 typeParameters),
             reference: indexedContainer?.reference)
           ..fileOffset = nameOffset,
-        super(metadata, modifiers, name, parent, nameOffset, scope,
-            constructorScope);
+        super(metadata, modifiers, name, parent, nameOffset);
+
+  @override
+  NameSpace get nameSpace => scope;
 
   @override
   SourceLibraryBuilder get libraryBuilder =>
@@ -686,16 +694,16 @@
   void applyAugmentation(Builder augmentation) {
     if (augmentation is SourceExtensionTypeDeclarationBuilder) {
       augmentation._origin = this;
-      scope.forEachLocalMember((String name, Builder member) {
+      nameSpace.forEachLocalMember((String name, Builder member) {
         Builder? memberAugmentation =
-            augmentation.scope.lookupLocalMember(name, setter: false);
+            augmentation.nameSpace.lookupLocalMember(name, setter: false);
         if (memberAugmentation != null) {
           member.applyAugmentation(memberAugmentation);
         }
       });
-      scope.forEachLocalSetter((String name, Builder member) {
+      nameSpace.forEachLocalSetter((String name, Builder member) {
         Builder? memberAugmentation =
-            augmentation.scope.lookupLocalMember(name, setter: true);
+            augmentation.nameSpace.lookupLocalMember(name, setter: true);
         if (memberAugmentation != null) {
           member.applyAugmentation(memberAugmentation);
         }
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 1ce347c3..317d20f5e 100644
--- a/pkg/front_end/lib/src/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/source/source_library_builder.dart
@@ -384,6 +384,10 @@
 
   @override
   Scope get scope => _scope;
+
+  @override
+  Scope get nameSpace => _scope;
+
   @override
   Scope get exportScope => _exportScope;
 
@@ -503,8 +507,8 @@
     return compilationUnit.addBuilder(name, declaration, charOffset);
   }
 
-  /// Checks [scope] for conflicts between setters and non-setters and reports
-  /// them in [sourceLibraryBuilder].
+  /// Checks [nameSpace] for conflicts between setters and non-setters and
+  /// reports them in [sourceLibraryBuilder].
   ///
   /// If [checkForInstanceVsStaticConflict] is `true`, conflicts between
   /// instance and static members of the same name are reported.
@@ -512,11 +516,11 @@
   /// If [checkForMethodVsSetterConflict] is `true`, conflicts between
   /// methods and setters of the same name are reported.
   static void checkMemberConflicts(
-      SourceLibraryBuilder sourceLibraryBuilder, Scope scope,
+      SourceLibraryBuilder sourceLibraryBuilder, NameSpace nameSpace,
       {required bool checkForInstanceVsStaticConflict,
       required bool checkForMethodVsSetterConflict}) {
-    scope.forEachLocalSetter((String name, MemberBuilder setter) {
-      Builder? getable = scope.lookupLocalMember(name, setter: false);
+    nameSpace.forEachLocalSetter((String name, MemberBuilder setter) {
+      Builder? getable = nameSpace.lookupLocalMember(name, setter: false);
       if (getable == null) {
         // Setter without getter.
         return;
@@ -646,7 +650,7 @@
   }
 
   void buildInitialScopes() {
-    NameIterator iterator = scope.filteredNameIterator(
+    NameIterator iterator = nameSpace.filteredNameIterator(
         includeDuplicates: false, includeAugmentations: false);
     UriOffset uriOffset = new UriOffset(fileUri, TreeNode.noOffset);
     while (iterator.moveNext()) {
@@ -876,7 +880,7 @@
         localMembersIteratorOfType();
     while (extensionIterator.moveNext()) {
       SourceExtensionBuilder extension_ = extensionIterator.current;
-      for (Builder member in extension_.scope.localMembers) {
+      for (Builder member in extension_.nameSpace.localMembers) {
         if (member is SourceProcedureBuilder &&
             !member.isStatic &&
             member.isGetter) {
@@ -899,7 +903,7 @@
         individualPropertyReasons[representationGetter] =
             PropertyNonPromotabilityReason.isNotPrivate;
       }
-      for (Builder member in extensionType.scope.localMembers) {
+      for (Builder member in extensionType.nameSpace.localMembers) {
         if (member is SourceProcedureBuilder &&
             !member.isStatic &&
             member.isGetter) {
@@ -948,18 +952,18 @@
   @override
   // Coverage-ignore(suite): Not run.
   void becomeCoreLibrary() {
-    if (scope.lookupLocalMember("dynamic", setter: false) == null) {
+    if (nameSpace.lookupLocalMember("dynamic", setter: false) == null) {
       addBuilder("dynamic",
           new DynamicTypeDeclarationBuilder(const DynamicType(), this, -1), -1);
     }
-    if (scope.lookupLocalMember("Never", setter: false) == null) {
+    if (nameSpace.lookupLocalMember("Never", setter: false) == null) {
       addBuilder(
           "Never",
           new NeverTypeDeclarationBuilder(
               const NeverType.nonNullable(), this, -1),
           -1);
     }
-    assert(scope.lookupLocalMember("Null", setter: false) != null,
+    assert(nameSpace.lookupLocalMember("Null", setter: false) != null,
         "No class 'Null' found in dart:core.");
   }
 
@@ -2158,7 +2162,7 @@
         declaration.checkTypes(this, typeEnvironment);
         if (declaration.isGetter) {
           Builder? setterDeclaration =
-              scope.lookupLocalMember(declaration.name, setter: true);
+              nameSpace.lookupLocalMember(declaration.name, setter: true);
           if (setterDeclaration != null) {
             checkGetterSetterTypes(declaration,
                 setterDeclaration as ProcedureBuilder, typeEnvironment);
@@ -2750,7 +2754,7 @@
   SourceLibraryBuilderMemberNameIterator._(
       SourceLibraryBuilder libraryBuilder, this.augmentationBuilders,
       {required this.includeDuplicates})
-      : _iterator = libraryBuilder.scope.filteredNameIterator<T>(
+      : _iterator = libraryBuilder.nameSpace.filteredNameIterator<T>(
             parent: libraryBuilder,
             includeDuplicates: includeDuplicates,
             includeAugmentations: false);
@@ -2765,7 +2769,7 @@
     if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
       SourceLibraryBuilder augmentationLibraryBuilder =
           augmentationBuilders!.current;
-      _iterator = augmentationLibraryBuilder.scope.filteredNameIterator<T>(
+      _iterator = augmentationLibraryBuilder.nameSpace.filteredNameIterator<T>(
           parent: augmentationLibraryBuilder,
           includeDuplicates: includeDuplicates,
           includeAugmentations: false);
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 a711e0d..f896aae 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -140,7 +140,7 @@
   LibraryBuilder libraryBuilder = lookupLibraryBuilder(
       compilerResult, cls.enclosingLibrary,
       required: required)!;
-  ClassBuilder? clsBuilder = libraryBuilder.scope
+  ClassBuilder? clsBuilder = libraryBuilder.nameSpace
       .lookupLocalMember(cls.name, setter: false) as ClassBuilder?;
   if (clsBuilder == null && required) {
     throw new ArgumentError("ClassBuilder for $cls not found.");
@@ -155,7 +155,7 @@
       compilerResult, extension.enclosingLibrary,
       required: required)!;
   ExtensionBuilder? extensionBuilder;
-  libraryBuilder.scope.forEachLocalExtension((ExtensionBuilder builder) {
+  libraryBuilder.nameSpace.forEachLocalExtension((ExtensionBuilder builder) {
     if (builder.extension == extension) {
       extensionBuilder = builder;
     }
@@ -179,7 +179,7 @@
       memberBuilder =
           classBuilder.constructorScope.lookupLocalMember(memberName);
     } else {
-      memberBuilder = classBuilder.scope.lookupLocalMember(memberName,
+      memberBuilder = classBuilder.nameSpace.lookupLocalMember(memberName,
           setter: member is Procedure && member.isSetter) as MemberBuilder?;
     }
   }
@@ -218,7 +218,7 @@
     LibraryBuilder libraryBuilder = lookupLibraryBuilder(
         compilerResult, member.enclosingLibrary,
         required: required)!;
-    memberBuilder = libraryBuilder.scope.lookupLocalMember(member.name.text,
+    memberBuilder = libraryBuilder.nameSpace.lookupLocalMember(member.name.text,
         setter: member is Procedure && member.isSetter) as MemberBuilder?;
   }
   if (memberBuilder == null && required) {
@@ -240,7 +240,7 @@
       lookupExtensionBuilder(compilerResult, extension, required: required);
   MemberBuilder? memberBuilder;
   if (extensionBuilder != null) {
-    memberBuilder = extensionBuilder.scope
+    memberBuilder = extensionBuilder.nameSpace
         .lookupLocalMember(memberName, setter: isSetter) as MemberBuilder?;
   }
   if (memberBuilder == null && required) {
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index 261dd04..e0fbba4 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -163,10 +163,10 @@
     hitCount: 25,
     missCount: 0,
   ),
-  // 84.0%.
+  // 86.0655737704918%.
   "package:front_end/src/base/local_scope.dart": (
     hitCount: 105,
-    missCount: 20,
+    missCount: 17,
   ),
   // 100.0%.
   "package:front_end/src/base/messages.dart": (
@@ -260,7 +260,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/extension_builder.dart": (
-    hitCount: 4,
+    hitCount: 3,
     missCount: 0,
   ),
   // 100.0%.
@@ -410,12 +410,12 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_class_builder.dart": (
-    hitCount: 169,
+    hitCount: 171,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_builder.dart": (
-    hitCount: 72,
+    hitCount: 76,
     missCount: 0,
   ),
   // 100.0%.
@@ -425,7 +425,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_type_declaration_builder.dart": (
-    hitCount: 146,
+    hitCount: 148,
     missCount: 0,
   ),
   // 100.0%.
@@ -435,7 +435,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_library_builder.dart": (
-    hitCount: 336,
+    hitCount: 338,
     missCount: 0,
   ),
   // 100.0%.
@@ -708,6 +708,11 @@
     hitCount: 0,
     missCount: 0,
   ),
+  // 0.0%.
+  "package:front_end/src/macros/macro_injected_impl.dart": (
+    hitCount: 0,
+    missCount: 1,
+  ),
   // 100.0%.
   "package:front_end/src/macros/macro_serializer.dart": (
     hitCount: 0,
@@ -780,7 +785,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_class_builder.dart": (
-    hitCount: 1211,
+    hitCount: 1213,
     missCount: 0,
   ),
   // 99.4729907773386%.
@@ -800,18 +805,18 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_extension_builder.dart": (
-    hitCount: 68,
+    hitCount: 72,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_extension_type_declaration_builder.dart":
       (
-    hitCount: 424,
+    hitCount: 426,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_factory_builder.dart": (
-    hitCount: 581,
+    hitCount: 570,
     missCount: 0,
   ),
   // 100.0%.
@@ -826,7 +831,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_library_builder.dart": (
-    hitCount: 1404,
+    hitCount: 1406,
     missCount: 0,
   ),
   // 100.0%.
@@ -891,7 +896,7 @@
   ),
   // 100.0%.
   "package:front_end/src/type_inference/inference_visitor.dart": (
-    hitCount: 7796,
+    hitCount: 7798,
     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 1b2b0bc..6081dd6 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,7 +39,7 @@
   ];
   for (LibraryBuilder builder in builders) {
     if (builder is! DillLibraryBuilder) continue;
-    builder.scope.forEachLocalMember((name, member) {
+    builder.nameSpace.forEachLocalMember((name, member) {
       if (member is! DillTypeAliasBuilder) return;
       try {
         member.type;