Version 3.6.0-68.0.dev

Merge 0b965a1ac8370935ccefa7ca11076b79a2a73037 into dev
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/local_scope.dart b/pkg/front_end/lib/src/base/local_scope.dart
index 7210c70..8db0333 100644
--- a/pkg/front_end/lib/src/base/local_scope.dart
+++ b/pkg/front_end/lib/src/base/local_scope.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../builder/builder.dart';
-import '../builder/member_builder.dart';
 import '../kernel/body_builder.dart' show JumpTarget;
 import 'scope.dart';
 
@@ -43,20 +42,17 @@
   void addLocalMember(String name, Builder member, {required bool setter});
 
   void declareLabel(String name, JumpTarget target);
+
   JumpTarget? lookupLabel(String name);
 
   @override
   Builder? lookup(String name, int charOffset, Uri fileUri);
+
   @override
   Builder? lookupSetter(String name, int charOffset, Uri uri);
 
   Map<String, List<int>>? get usedNames;
 
-  Iterator<T> filteredIterator<T extends Builder>(
-      {Builder? parent,
-      required bool includeDuplicates,
-      required bool includeAugmentations});
-
   SwitchScope get switchScope;
 }
 
@@ -85,24 +81,13 @@
   }
 }
 
-mixin LocalScopeMixin implements LocalScope {
-  LocalScope? get _parent;
+mixin LocalScopeMixin implements LookupScopeMixin, LocalScope {
+  LookupScope? get _parent;
 
   Map<String, Builder>? get _local;
 
-  String get classNameOrDebugName;
-
   @override
-  Iterator<T> filteredIterator<T extends Builder>(
-      {Builder? parent,
-      required bool includeDuplicates,
-      required bool includeAugmentations}) {
-    return new FilteredIterator<T>(
-        new ScopeIterator.fromIterators(_local?.values.iterator, null, null),
-        parent: parent,
-        includeDuplicates: includeDuplicates,
-        includeAugmentations: includeAugmentations);
-  }
+  String get classNameOrDebugName;
 
   @override
   Iterable<Builder> get localMembers => _local?.values ?? const {};
@@ -126,43 +111,15 @@
   @override
   Builder? lookupSetter(String name, int charOffset, Uri fileUri) {
     recordUse(name, charOffset);
-    Builder? builder;
-    if (_local != null) {
-      builder = lookupIn(name, charOffset, fileUri, _local!);
-      if (builder != null && !builder.hasProblem) {
-        return new AccessErrorBuilder(name, builder, charOffset, fileUri);
-      }
-    }
+    Builder? builder = lookupSetterIn(name, charOffset, fileUri, _local);
     return builder ?? _parent?.lookupSetter(name, charOffset, fileUri);
   }
 
   void recordUse(String name, int charOffset) {}
-
-  Builder? lookupIn(
-      String name, int charOffset, Uri fileUri, Map<String, Builder> map) {
-    Builder? builder = map[name];
-    if (builder == null) return null;
-    if (builder.next != null) {
-      return new AmbiguousBuilder(
-          name.isEmpty
-              ?
-              // Coverage-ignore(suite): Not run.
-              classNameOrDebugName
-              : name,
-          builder,
-          charOffset,
-          fileUri);
-    } else if (builder is MemberBuilder && builder.isConflictingSetter) {
-      // TODO(johnniwinther): Use a variant of [AmbiguousBuilder] for this case.
-      return null;
-    } else {
-      return builder;
-    }
-  }
 }
 
 final class LocalScopeImpl extends BaseLocalScope
-    with LocalScopeMixin, SwitchScopeMixin
+    with LookupScopeMixin, LocalScopeMixin, SwitchScopeMixin
     implements LocalScope, SwitchScope {
   @override
   final LocalScope? _parent;
@@ -304,7 +261,7 @@
 }
 
 final class FixedLocalScope extends BaseLocalScope
-    with ImmutableLocalScopeMixin, LocalScopeMixin {
+    with LookupScopeMixin, ImmutableLocalScopeMixin, LocalScopeMixin {
   @override
   final LocalScope? _parent;
   @override
@@ -334,28 +291,42 @@
       "$runtimeType(${kind}, $classNameOrDebugName, ${_local?.keys})";
 }
 
-final class EnclosingLocalScope extends BaseLocalScope
-    with ImmutableLocalScopeMixin {
-  final Scope _scope;
+final class FormalParameterScope extends BaseLocalScope
+    with LookupScopeMixin, ImmutableLocalScopeMixin, LocalScopeMixin {
+  @override
+  final LookupScope? _parent;
+  @override
+  final Map<String, Builder>? _local;
 
-  EnclosingLocalScope(this._scope);
+  FormalParameterScope({LookupScope? parent, Map<String, Builder>? local})
+      : _parent = parent,
+        _local = local;
 
   @override
-  Iterator<T> filteredIterator<T extends Builder>(
-      {Builder? parent,
-      required bool includeDuplicates,
-      required bool includeAugmentations}) {
-    return _scope.filteredIterator(
-        parent: parent,
-        includeDuplicates: includeDuplicates,
-        includeAugmentations: includeAugmentations);
-  }
+  ScopeKind get kind => ScopeKind.formals;
+
+  @override
+  JumpTarget? lookupLabel(String name) => null;
+
+  @override
+  String get classNameOrDebugName => "formal parameter";
+
+  @override
+  String toString() =>
+      "$runtimeType(${kind}, $classNameOrDebugName, ${_local?.keys})";
+}
+
+final class EnclosingLocalScope extends BaseLocalScope
+    with ImmutableLocalScopeMixin {
+  final LookupScope _scope;
+
+  EnclosingLocalScope(this._scope);
 
   @override
   ScopeKind get kind => _scope.kind;
 
   @override
-  Iterable<Builder> get localMembers => _scope.localMembers;
+  Iterable<Builder> get localMembers => const [];
 
   @override
   Builder? lookup(String name, int charOffset, Uri fileUri) {
@@ -366,9 +337,7 @@
   JumpTarget? lookupLabel(String name) => null;
 
   @override
-  Builder? lookupLocalMember(String name, {required bool setter}) {
-    return _scope.lookupLocalMember(name, setter: setter);
-  }
+  Builder? lookupLocalMember(String name, {required bool setter}) => null;
 
   @override
   Builder? lookupSetter(String name, int charOffset, Uri uri) {
diff --git a/pkg/front_end/lib/src/base/scope.dart b/pkg/front_end/lib/src/base/scope.dart
index 3ab8263..946a340 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';
@@ -27,7 +29,6 @@
 import '../source/source_library_builder.dart';
 import '../source/source_member_builder.dart';
 import '../util/helpers.dart' show DelayedActionPerformer;
-import 'local_scope.dart';
 import 'messages.dart';
 import 'uri_offset.dart';
 
@@ -112,7 +113,71 @@
 abstract class LookupScope {
   ScopeKind get kind;
   Builder? lookup(String name, int charOffset, Uri fileUri);
-  Builder? lookupSetter(String name, int charOffset, Uri uri);
+  Builder? lookupSetter(String name, int charOffset, Uri fileUri);
+}
+
+mixin LookupScopeMixin implements LookupScope {
+  String get classNameOrDebugName;
+
+  Builder? lookupIn(
+      String name, int charOffset, Uri fileUri, Map<String, Builder> map) {
+    Builder? builder = map[name];
+    if (builder == null) return null;
+    if (builder.next != null) {
+      return new AmbiguousBuilder(
+          name.isEmpty
+              ?
+              // Coverage-ignore(suite): Not run.
+              classNameOrDebugName
+              : name,
+          builder,
+          charOffset,
+          fileUri);
+    } else if (builder is MemberBuilder && builder.isConflictingSetter) {
+      // TODO(johnniwinther): Use a variant of [AmbiguousBuilder] for this case.
+      return null;
+    } else {
+      return builder;
+    }
+  }
+
+  Builder? lookupSetterIn(
+      String name, int charOffset, Uri fileUri, Map<String, Builder>? map) {
+    Builder? builder;
+    if (map != null) {
+      builder = lookupIn(name, charOffset, fileUri, map);
+      if (builder != null && !builder.hasProblem) {
+        return new AccessErrorBuilder(name, builder, charOffset, fileUri);
+      }
+    }
+    return builder;
+  }
+}
+
+class TypeParameterScope with LookupScopeMixin {
+  final LookupScope _parent;
+  final Map<String, Builder> _typeParameters;
+
+  TypeParameterScope(this._parent, this._typeParameters);
+
+  @override
+  ScopeKind get kind => ScopeKind.typeParameters;
+
+  @override
+  Builder? lookup(String name, int charOffset, Uri fileUri) {
+    return lookupIn(name, charOffset, fileUri, _typeParameters) ??
+        _parent.lookup(name, charOffset, fileUri);
+  }
+
+  @override
+  Builder? lookupSetter(String name, int charOffset, Uri fileUri) {
+    Builder? builder =
+        lookupSetterIn(name, charOffset, fileUri, _typeParameters);
+    return builder ?? _parent.lookupSetter(name, charOffset, fileUri);
+  }
+
+  @override
+  String get classNameOrDebugName => "type parameter";
 }
 
 abstract class ParentScope {
@@ -178,7 +243,64 @@
   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 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;
+
+  /// 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. 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 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. 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;
@@ -222,12 +344,6 @@
             isModifiable: isModifiable,
             local: local);
 
-  LocalScope toLocalScope() => new EnclosingLocalScope(this);
-
-  // TODO(johnniwinther): Remove this.
-  @override
-  Scope? get parent => _parent as Scope?;
-
   /// Returns an iterator of all members and setters mapped in this scope,
   /// including duplicate members mapped to the same name.
   ///
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/formal_parameter_builder.dart b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
index c1ffe2c..8128c30 100644
--- a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
@@ -13,7 +13,7 @@
 
 import '../base/constant_context.dart' show ConstantContext;
 import '../base/modifier.dart';
-import '../base/scope.dart' show Scope;
+import '../base/scope.dart' show LookupScope;
 import '../kernel/body_builder.dart' show BodyBuilder;
 import '../kernel/body_builder_context.dart';
 import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
@@ -279,7 +279,7 @@
       if (initializerToken != null) {
         final DeclarationBuilder declarationBuilder =
             parent!.parent as DeclarationBuilder;
-        Scope scope = declarationBuilder.scope;
+        LookupScope scope = declarationBuilder.scope;
         BodyBuilderContext bodyBuilderContext = new ParameterBodyBuilderContext(
             this,
             inOutlineBuildingPhase: true,
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/metadata_builder.dart b/pkg/front_end/lib/src/builder/metadata_builder.dart
index aef335d..2e7c2da 100644
--- a/pkg/front_end/lib/src/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/builder/metadata_builder.dart
@@ -8,7 +8,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/clone.dart';
 
-import '../base/scope.dart' show Scope;
+import '../base/scope.dart' show LookupScope;
 import '../kernel/body_builder.dart' show BodyBuilder;
 import '../kernel/body_builder_context.dart';
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
@@ -41,7 +41,7 @@
       BodyBuilderContext bodyBuilderContext,
       SourceLibraryBuilder library,
       Uri fileUri,
-      Scope scope,
+      LookupScope scope,
       {bool createFileUriExpression = false}) {
     if (metadata == null) return;
 
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/builder/type_variable_builder.dart b/pkg/front_end/lib/src/builder/type_variable_builder.dart
index 9694a88..eb4e364 100644
--- a/pkg/front_end/lib/src/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/builder/type_variable_builder.dart
@@ -401,7 +401,7 @@
       BodyBuilderContext bodyBuilderContext,
       ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
-      Scope scope) {
+      LookupScope scope) {
     MetadataBuilder.buildAnnotations(parameter, metadata, bodyBuilderContext,
         libraryBuilder, fileUri!, scope);
   }
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/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index 8fc1cd6..e68eb6a 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -446,12 +446,11 @@
             context.needsImplicitSuperInitializer(coreTypes),
         benchmarker = libraryBuilder.loader.target.benchmarker,
         _localScopes = new LocalStack([enclosingScope]) {
-    Iterator<VariableBuilder>? iterator =
-        formalParameterScope?.filteredIterator<VariableBuilder>(
-            includeDuplicates: false, includeAugmentations: false);
-    if (iterator != null) {
-      while (iterator.moveNext()) {
-        typeInferrer.assignedVariables.declare(iterator.current.variable!);
+    if (formalParameterScope != null) {
+      for (Builder builder in formalParameterScope!.localMembers) {
+        if (builder is VariableBuilder) {
+          typeInferrer.assignedVariables.declare(builder.variable!);
+        }
       }
     }
     if (thisVariable != null && context.isConstructor) {
@@ -464,13 +463,13 @@
   BodyBuilder.forField(
       SourceLibraryBuilder libraryBuilder,
       BodyBuilderContext bodyBuilderContext,
-      Scope enclosingScope,
+      LookupScope enclosingScope,
       TypeInferrer typeInferrer,
       Uri uri)
       : this(
             libraryBuilder: libraryBuilder,
             context: bodyBuilderContext,
-            enclosingScope: enclosingScope.toLocalScope(),
+            enclosingScope: new EnclosingLocalScope(enclosingScope),
             formalParameterScope: null,
             hierarchy: libraryBuilder.loader.hierarchy,
             coreTypes: libraryBuilder.loader.coreTypes,
@@ -479,12 +478,12 @@
             typeInferrer: typeInferrer);
 
   BodyBuilder.forOutlineExpression(SourceLibraryBuilder library,
-      BodyBuilderContext bodyBuilderContext, Scope scope, Uri fileUri,
+      BodyBuilderContext bodyBuilderContext, LookupScope scope, Uri fileUri,
       {LocalScope? formalParameterScope})
       : this(
             libraryBuilder: library,
             context: bodyBuilderContext,
-            enclosingScope: scope.toLocalScope(),
+            enclosingScope: new EnclosingLocalScope(scope),
             formalParameterScope: formalParameterScope,
             hierarchy: library.loader.hierarchy,
             coreTypes: library.loader.coreTypes,
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/diet_listener.dart b/pkg/front_end/lib/src/source/diet_listener.dart
index 8e35f74..6669d49 100644
--- a/pkg/front_end/lib/src/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/source/diet_listener.dart
@@ -27,6 +27,7 @@
 import '../base/identifiers.dart'
     show Identifier, OperatorIdentifier, QualifiedName, SimpleIdentifier;
 import '../base/ignored_parser_errors.dart' show isIgnoredParserError;
+import '../base/local_scope.dart';
 import '../base/problems.dart' show DebugAbort;
 import '../base/scope.dart';
 import '../builder/builder.dart';
@@ -826,10 +827,10 @@
   }
 
   BodyBuilder createListener(
-      BodyBuilderContext bodyBuilderContext, Scope memberScope,
+      BodyBuilderContext bodyBuilderContext, LookupScope memberScope,
       {VariableDeclaration? thisVariable,
       List<TypeParameter>? thisTypeParameters,
-      Scope? formalParameterScope,
+      LocalScope? formalParameterScope,
       InferenceDataForTesting? inferenceDataForTesting}) {
     _benchmarker
         // Coverage-ignore(suite): Not run.
@@ -859,8 +860,8 @@
 
   BodyBuilder createListenerInternal(
       BodyBuilderContext bodyBuilderContext,
-      Scope memberScope,
-      Scope? formalParameterScope,
+      LookupScope memberScope,
+      LocalScope? formalParameterScope,
       VariableDeclaration? thisVariable,
       List<TypeParameter>? thisTypeParameters,
       TypeInferrer typeInferrer,
@@ -868,8 +869,8 @@
     return new BodyBuilder(
         libraryBuilder: libraryBuilder,
         context: bodyBuilderContext,
-        enclosingScope: memberScope.toLocalScope(),
-        formalParameterScope: formalParameterScope?.toLocalScope(),
+        enclosingScope: new EnclosingLocalScope(memberScope),
+        formalParameterScope: formalParameterScope,
         hierarchy: hierarchy,
         coreTypes: coreTypes,
         thisVariable: thisVariable,
@@ -883,9 +884,9 @@
       {required bool inOutlineBuildingPhase,
       required bool inMetadata,
       required bool inConstFields}) {
-    final Scope typeParameterScope =
+    final LookupScope typeParameterScope =
         builder.computeTypeParameterScope(memberScope);
-    final Scope formalParameterScope =
+    final LocalScope formalParameterScope =
         builder.computeFormalParameterScope(typeParameterScope);
     return createListener(
         builder.createBodyBuilderContext(
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..a4312eb 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(
@@ -241,7 +241,7 @@
   List<NominalVariableBuilder>? get typeParameters;
 
   /// The scope in which the [typeParameters] are declared.
-  Scope get typeParameterScope;
+  LookupScope get typeParameterScope;
 
   @override
   List<DartType> buildAliasedTypeArguments(LibraryBuilder library,
@@ -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..582a4a7 100644
--- a/pkg/front_end/lib/src/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/source/source_class_builder.dart
@@ -91,10 +91,16 @@
   final Class actualCls;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   List<NominalVariableBuilder>? typeVariables;
 
   /// The scope in which the [typeParameters] are declared.
-  final Scope typeParameterScope;
+  final LookupScope typeParameterScope;
 
   @override
   TypeBuilder? supertypeBuilder;
@@ -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_constructor_builder.dart b/pkg/front_end/lib/src/source/source_constructor_builder.dart
index edfd577..f3f8bc9 100644
--- a/pkg/front_end/lib/src/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/source/source_constructor_builder.dart
@@ -303,15 +303,14 @@
   void _buildConstructorForOutline(
       Token? beginInitializers,
       List<DelayedActionPerformer> delayedActionPerformers,
-      Scope declarationScope) {
+      LookupScope declarationScope) {
     if (beginInitializers != null) {
       final LocalScope? formalParameterScope;
       if (isConst) {
         // We're going to fully build the constructor so we need scopes.
         formalParameterScope = computeFormalParameterInitializerScope(
             computeFormalParameterScope(
-                    computeTypeParameterScope(declarationBuilder.scope))
-                .toLocalScope());
+                computeTypeParameterScope(declarationBuilder.scope)));
       } else {
         formalParameterScope = null;
       }
@@ -1230,7 +1229,7 @@
     if (isConst) {
       // For modular compilation purposes we need to include initializers
       // for const constructors into the outline.
-      Scope typeParameterScope =
+      LookupScope typeParameterScope =
           computeTypeParameterScope(extensionTypeDeclarationBuilder.scope);
       _buildConstructorForOutline(
           beginInitializers, delayedActionPerformers, typeParameterScope);
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..b7e99cf 100644
--- a/pkg/front_end/lib/src/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/source/source_extension_builder.dart
@@ -33,10 +33,16 @@
   MergedClassMemberScope? _mergedScope;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   final List<NominalVariableBuilder>? typeParameters;
 
   @override
-  final Scope typeParameterScope;
+  final LookupScope typeParameterScope;
 
   @override
   final TypeBuilder onType;
@@ -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..1bcb965 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,10 +56,16 @@
   MergedClassMemberScope? _mergedScope;
 
   @override
+  final Scope scope;
+
+  @override
+  final ConstructorScope constructorScope;
+
+  @override
   final List<NominalVariableBuilder>? typeParameters;
 
   @override
-  final Scope typeParameterScope;
+  final LookupScope typeParameterScope;
 
   @override
   List<TypeBuilder>? interfaceBuilders;
@@ -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_function_builder.dart b/pkg/front_end/lib/src/source/source_function_builder.dart
index ab51332..b57062b 100644
--- a/pkg/front_end/lib/src/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/source/source_function_builder.dart
@@ -75,14 +75,14 @@
 
   /// This is the formal parameter scope as specified in the Dart Programming
   /// Language Specification, 4th ed, section 9.2.
-  Scope computeFormalParameterScope(Scope parent);
+  LocalScope computeFormalParameterScope(LookupScope parent);
 
   LocalScope computeFormalParameterInitializerScope(LocalScope parent);
 
   /// This scope doesn't correspond to any scope specified in the Dart
   /// Programming Language Specification, 4th ed. It's an unspecified extension
   /// to support generic methods.
-  Scope computeTypeParameterScope(Scope parent);
+  LookupScope computeTypeParameterScope(LookupScope parent);
 
   FormalParameterBuilder? getFormal(Identifier identifier);
 
@@ -206,8 +206,8 @@
   bool get isAugmented;
 
   @override
-  Scope computeFormalParameterScope(Scope parent) {
-    if (formals == null) return parent;
+  LocalScope computeFormalParameterScope(LookupScope parent) {
+    if (formals == null) return new FormalParameterScope(parent: parent);
     Map<String, Builder> local = <String, Builder>{};
     for (FormalParameterBuilder formal in formals!) {
       if (formal.isWildcard) {
@@ -218,12 +218,7 @@
         local[formal.name] = formal;
       }
     }
-    return new Scope(
-        kind: ScopeKind.formals,
-        local: local,
-        parent: parent,
-        debugName: "formal parameter",
-        isModifiable: false);
+    return new FormalParameterScope(local: local, parent: parent);
   }
 
   @override
@@ -259,19 +254,14 @@
   }
 
   @override
-  Scope computeTypeParameterScope(Scope parent) {
+  LookupScope computeTypeParameterScope(LookupScope parent) {
     if (typeVariables == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
     for (NominalVariableBuilder variable in typeVariables!) {
       if (variable.isWildcard) continue;
       local[variable.name] = variable;
     }
-    return new Scope(
-        kind: ScopeKind.typeParameters,
-        local: local,
-        parent: parent,
-        debugName: "type parameter",
-        isModifiable: false);
+    return new TypeParameterScope(parent, local);
   }
 
   @override
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/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index c67865d..963311e 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -871,7 +871,7 @@
   BodyBuilder createBodyBuilderForOutlineExpression(
       SourceLibraryBuilder library,
       BodyBuilderContext bodyBuilderContext,
-      Scope scope,
+      LookupScope scope,
       Uri fileUri,
       {LocalScope? formalParameterScope}) {
     return new BodyBuilder.forOutlineExpression(
@@ -3078,7 +3078,7 @@
   BodyBuilder createBodyBuilderForField(
       SourceLibraryBuilder libraryBuilder,
       BodyBuilderContext bodyBuilderContext,
-      Scope enclosingScope,
+      LookupScope enclosingScope,
       TypeInferrer typeInferrer,
       Uri uri) {
     return new BodyBuilder.forField(
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 cc5c617..0e1eadb 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
@@ -363,18 +363,13 @@
     });
   }
 
-  Scope computeTypeParameterScope(Scope parent) {
+  LookupScope computeTypeParameterScope(LookupScope parent) {
     if (typeVariables == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
     for (NominalVariableBuilder variable in typeVariables!) {
       local[variable.name] = variable;
     }
-    return new Scope(
-        kind: ScopeKind.typeParameters,
-        local: local,
-        parent: parent,
-        debugName: "type parameter",
-        isModifiable: false);
+    return new TypeParameterScope(parent, local);
   }
 
   Map<Procedure, Member>? _tearOffDependencies;
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/compiler_test_helper.dart b/pkg/front_end/test/compiler_test_helper.dart
index 5068e73..9076451 100644
--- a/pkg/front_end/test/compiler_test_helper.dart
+++ b/pkg/front_end/test/compiler_test_helper.dart
@@ -228,7 +228,7 @@
   BodyBuilder createBodyBuilderForOutlineExpression(
       SourceLibraryBuilder library,
       BodyBuilderContext bodyBuilderContext,
-      Scope scope,
+      LookupScope scope,
       Uri fileUri,
       {LocalScope? formalParameterScope}) {
     return bodyBuilderCreator.createForOutlineExpression(
@@ -240,7 +240,7 @@
   BodyBuilder createBodyBuilderForField(
       SourceLibraryBuilder libraryBuilder,
       BodyBuilderContext bodyBuilderContext,
-      Scope enclosingScope,
+      LookupScope enclosingScope,
       TypeInferrer typeInferrer,
       Uri uri) {
     return bodyBuilderCreator.createForField(
@@ -257,8 +257,8 @@
   @override
   BodyBuilder createListenerInternal(
       BodyBuilderContext bodyBuilderContext,
-      Scope memberScope,
-      Scope? formalParameterScope,
+      LookupScope memberScope,
+      LocalScope? formalParameterScope,
       VariableDeclaration? extensionThis,
       List<TypeParameter>? extensionTypeParameters,
       TypeInferrer typeInferrer,
@@ -281,8 +281,8 @@
 typedef BodyBuilderCreatorUnnamed = BodyBuilderTest Function(
     {required SourceLibraryBuilder libraryBuilder,
     required BodyBuilderContext context,
-    required Scope enclosingScope,
-    Scope? formalParameterScope,
+    required LookupScope enclosingScope,
+    LocalScope? formalParameterScope,
     required ClassHierarchy hierarchy,
     required CoreTypes coreTypes,
     VariableDeclaration? thisVariable,
@@ -293,14 +293,14 @@
 typedef BodyBuilderCreatorForField = BodyBuilderTest Function(
     SourceLibraryBuilder libraryBuilder,
     BodyBuilderContext bodyBuilderContext,
-    Scope enclosingScope,
+    LookupScope enclosingScope,
     TypeInferrer typeInferrer,
     Uri uri);
 
 typedef BodyBuilderCreatorForOutlineExpression = BodyBuilderTest Function(
     SourceLibraryBuilder library,
     BodyBuilderContext bodyBuilderContext,
-    Scope scope,
+    LookupScope scope,
     Uri fileUri,
     {LocalScope? formalParameterScope});
 
@@ -321,8 +321,8 @@
   BodyBuilderTest(
       {required SourceLibraryBuilder libraryBuilder,
       required BodyBuilderContext context,
-      required Scope enclosingScope,
-      Scope? formalParameterScope,
+      required LookupScope enclosingScope,
+      LocalScope? formalParameterScope,
       required ClassHierarchy hierarchy,
       required CoreTypes coreTypes,
       VariableDeclaration? thisVariable,
@@ -332,8 +332,8 @@
       : super(
             libraryBuilder: libraryBuilder,
             context: context,
-            enclosingScope: enclosingScope.toLocalScope(),
-            formalParameterScope: formalParameterScope?.toLocalScope(),
+            enclosingScope: new EnclosingLocalScope(enclosingScope),
+            formalParameterScope: formalParameterScope,
             hierarchy: hierarchy,
             coreTypes: coreTypes,
             thisVariable: thisVariable,
@@ -345,7 +345,7 @@
   BodyBuilderTest.forField(
       SourceLibraryBuilder libraryBuilder,
       BodyBuilderContext bodyBuilderContext,
-      Scope enclosingScope,
+      LookupScope enclosingScope,
       TypeInferrer typeInferrer,
       Uri uri)
       : super.forField(libraryBuilder, bodyBuilderContext, enclosingScope,
@@ -353,7 +353,7 @@
 
   @override
   BodyBuilderTest.forOutlineExpression(SourceLibraryBuilder library,
-      BodyBuilderContext bodyBuilderContext, Scope scope, Uri fileUri,
+      BodyBuilderContext bodyBuilderContext, LookupScope scope, Uri fileUri,
       {LocalScope? formalParameterScope})
       : super.forOutlineExpression(library, bodyBuilderContext, scope, fileUri,
             formalParameterScope: formalParameterScope);
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index 261dd04..89b7422 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%.
+  // 90.29126213592234%.
   "package:front_end/src/base/local_scope.dart": (
-    hitCount: 105,
-    missCount: 20,
+    hitCount: 93,
+    missCount: 10,
   ),
   // 100.0%.
   "package:front_end/src/base/messages.dart": (
@@ -193,10 +193,10 @@
     hitCount: 246,
     missCount: 0,
   ),
-  // 97.1141781681305%.
+  // 96.57282741738065%.
   "package:front_end/src/base/scope.dart": (
-    hitCount: 774,
-    missCount: 23,
+    hitCount: 789,
+    missCount: 28,
   ),
   // 100.0%.
   "package:front_end/src/base/ticker.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%.
@@ -468,9 +468,9 @@
     hitCount: 0,
     missCount: 0,
   ),
-  // 99.38501144164759%.
+  // 99.38509938509938%.
   "package:front_end/src/kernel/body_builder.dart": (
-    hitCount: 6949,
+    hitCount: 6950,
     missCount: 43,
   ),
   // 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,
@@ -740,7 +745,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/diet_listener.dart": (
-    hitCount: 651,
+    hitCount: 650,
     missCount: 0,
   ),
   // 100.0%.
@@ -780,7 +785,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_class_builder.dart": (
-    hitCount: 1211,
+    hitCount: 1213,
     missCount: 0,
   ),
   // 99.4729907773386%.
@@ -790,7 +795,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_constructor_builder.dart": (
-    hitCount: 859,
+    hitCount: 858,
     missCount: 0,
   ),
   // 100.0%.
@@ -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%.
@@ -821,12 +826,12 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_function_builder.dart": (
-    hitCount: 295,
+    hitCount: 296,
     missCount: 0,
   ),
   // 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;
diff --git a/tools/VERSION b/tools/VERSION
index 9e26780..1a35dfd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 6
 PATCH 0
-PRERELEASE 67
+PRERELEASE 68
 PRERELEASE_PATCH 0