[cfe] Replace Scope.forEach with iterators

Scope.forEach iterates through the builder immediately mapped in the
scope. For duplicate declarations, this means that it'll give direct access to the last defined declaration and not to the first defined
declaration, which is inconsistent with how we generally handle
duplications. It also doesn't skip builders that are not "owned" by
the scope but merely accessible, which means that we easily have
duplicate handling of patches and augmentations which are part of
both the scope in which the were declared and the scope of the origin.

To normalize the handle of scope, this CL removes Scope.forEach
with iterators that explicit filter what subset of the builder
that we want to have access to. This prepares for the more complex
scope introduced by the augmentation libraries in which all
scopes have access to all declarations from the origin library as
well as other augmentation libraries.

Change-Id: I88bdfb1068fbb4eb9dd6fa3881b86a61104e50e3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255240
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 4c75ebb..71d70e3 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -231,11 +231,6 @@
   }
 
   @override
-  void forEach(void f(String name, Builder builder)) {
-    scope.forEach(f);
-  }
-
-  @override
   Builder? lookupLocalMember(String name,
       {bool setter: false, bool required: false}) {
     Builder? builder = scope.lookupLocalMember(name, setter: setter);
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index ba6a2da..d26e994 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -160,7 +160,10 @@
 
   @override
   void forEach(void f(String name, Builder builder)) {
-    scope.forEach(f);
+    scope
+        .filteredNameIterator(
+            includeDuplicates: false, includeAugmentations: false)
+        .forEach(f);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 2c6f4b3..a2a3380 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -69,9 +69,17 @@
   /// used in conditional imports and `bool.fromEnvironment` constants.
   bool get isUnsupported;
 
-  Iterator<Builder> get iterator;
+  /// Returns an iterator of all members (typedefs, classes and members)
+  /// declared in this library, including duplicate declarations.
+  // TODO(johnniwinther): Should the only exist on [SourceLibraryBuilder]?
+  Iterator<Builder> get localMembersIterator;
 
-  NameIterator get nameIterator;
+  /// Returns an iterator of all members (typedefs, classes and members)
+  /// declared in this library, including duplicate declarations.
+  ///
+  /// Compared to [localMembersIterator] this also gives access to the name
+  /// that the builders are mapped to.
+  NameIterator<Builder> get localMembersNameIterator;
 
   void addExporter(LibraryBuilder exporter,
       List<CombinatorBuilder>? combinators, int charOffset);
@@ -194,13 +202,15 @@
   Uri get importUri;
 
   @override
-  Iterator<Builder> get iterator {
-    return new LibraryLocalDeclarationIterator(this);
+  Iterator<Builder> get localMembersIterator {
+    return scope.filteredIterator(
+        parent: this, includeDuplicates: true, includeAugmentations: true);
   }
 
   @override
-  NameIterator get nameIterator {
-    return new LibraryLocalDeclarationNameIterator(this);
+  NameIterator<Builder> get localMembersNameIterator {
+    return scope.filteredNameIterator(
+        parent: this, includeDuplicates: true, includeAugmentations: true);
   }
 
   @override
@@ -373,44 +383,3 @@
     return buffer..write(name ?? (isPart ? fileUri : importUri));
   }
 }
-
-class LibraryLocalDeclarationIterator implements Iterator<Builder> {
-  final LibraryBuilder library;
-  final Iterator<Builder> iterator;
-
-  LibraryLocalDeclarationIterator(this.library)
-      : iterator = library.scope.iterator;
-
-  @override
-  Builder get current => iterator.current;
-
-  @override
-  bool moveNext() {
-    while (iterator.moveNext()) {
-      if (current.parent == library) return true;
-    }
-    return false;
-  }
-}
-
-class LibraryLocalDeclarationNameIterator implements NameIterator {
-  final LibraryBuilder library;
-  final NameIterator iterator;
-
-  LibraryLocalDeclarationNameIterator(this.library)
-      : iterator = library.scope.nameIterator;
-
-  @override
-  Builder get current => iterator.current;
-
-  @override
-  String get name => iterator.name;
-
-  @override
-  bool moveNext() {
-    while (iterator.moveNext()) {
-      if (current.parent == library) return true;
-    }
-    return false;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/builder/name_iterator.dart b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
index 165dfb3..67e85f6 100644
--- a/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
+++ b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
@@ -6,6 +6,7 @@
 
 import 'builder.dart';
 
-abstract class NameIterator implements Iterator<Builder> {
+/// An iterator on [Builder]s that provide the name that they are mapped to.
+abstract class NameIterator<T extends Builder> implements Iterator<T> {
   String get name;
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index ec39485..57d337a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -7,6 +7,7 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 
+import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
@@ -183,6 +184,11 @@
   }
 
   @override
+  void forEach(void f(String name, Builder builder)) {
+    scope.unfilteredNameIterator.forEach(f);
+  }
+
+  @override
   void forEachConstructor(void Function(String, MemberBuilder) f,
       {bool includeInjectedConstructors: false}) {
     constructorScope.forEach(f);
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index b0a4816..b34f25b 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -18,6 +18,8 @@
 
 import 'source/source_library_builder.dart';
 
+import 'scope.dart' show NameIteratorExtension;
+
 class Import {
   /// The library that is importing [imported];
   final SourceLibraryBuilder importer;
@@ -74,7 +76,10 @@
         prefixBuilder!.addToExportScope(name, member, charOffset);
       };
     }
-    imported!.exportScope.forEach((String name, Builder member) {
+    imported!.exportScope
+        .filteredNameIterator(
+            includeDuplicates: false, includeAugmentations: false)
+        .forEach((String name, Builder member) {
       if (combinators != null) {
         for (CombinatorBuilder combinator in combinators!) {
           if (combinator.isShow && !combinator.names.contains(name)) return;
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 34059e2..0535dcc 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -817,7 +817,7 @@
       replacementMap[entry.key] = childReplacementMap;
       replacementSettersMap[entry.key] = childReplacementSettersMap;
       for (LibraryBuilder builder in builders) {
-        NameIterator iterator = builder.nameIterator;
+        NameIterator iterator = builder.localMembersNameIterator;
         while (iterator.moveNext()) {
           Builder childBuilder = iterator.current;
           String name = iterator.name;
@@ -927,7 +927,9 @@
           builder.importScope
               .patchUpScope(replacementMap, replacementSettersMap);
 
-          Iterator<Builder> iterator = builder.iterator;
+          // TODO(johnniwinther): Should this include non-local (i.e. injected)
+          // members?
+          Iterator<Builder> iterator = builder.localMembersIterator;
           while (iterator.moveNext()) {
             Builder childBuilder = iterator.current;
             if (childBuilder is SourceClassBuilder) {
@@ -1200,7 +1202,9 @@
     if (enableMacros) {
       /// TODO(johnniwinther): Add a [hasMacro] property to [LibraryBuilder].
       for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
-        Iterator<Builder> iterator = builder.iterator;
+        // TODO(johnniwinther): Should this include non-local (i.e. injected)
+        // members?
+        Iterator<Builder> iterator = builder.localMembersIterator;
         while (iterator.moveNext()) {
           Builder childBuilder = iterator.current;
           if (childBuilder is ClassBuilder && childBuilder.isMacro) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 261b444..0d30a96 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -381,10 +381,11 @@
                 coreTypes.objectClass != declarationBuilder.cls,
         benchmarker = libraryBuilder.loader.target.benchmarker,
         this.scope = enclosingScope {
-    formalParameterScope?.forEach((String name, Builder builder) {
-      if (builder is VariableBuilder) {
-        typeInferrer.assignedVariables.declare(builder.variable!);
-      }
+    formalParameterScope
+        ?.filteredIterator<VariableBuilder>(
+            includeDuplicates: false, includeAugmentations: false)
+        .forEach((VariableBuilder builder) {
+      typeInferrer.assignedVariables.declare(builder.variable!);
     });
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 6986604..befe20f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1411,33 +1411,13 @@
 
     builder.forEachDeclaredConstructor(
         (String name, DeclaredSourceConstructorBuilder constructorBuilder) {
-      if (constructorBuilder.isExternal) return;
-      // In case of duplicating constructors the earliest ones (those that
-      // declared towards the beginning of the file) come last in the list.
-      // To report errors on the first definition of a constructor, we need to
-      // iterate until that last element.
-      DeclaredSourceConstructorBuilder earliest = constructorBuilder;
-      Builder earliestBuilder = constructorBuilder;
-      while (earliestBuilder.next != null) {
-        earliestBuilder = earliestBuilder.next!;
-        if (earliestBuilder is DeclaredSourceConstructorBuilder) {
-          earliest = earliestBuilder;
-        }
-      }
-
-      bool isRedirecting = false;
-      for (Initializer initializer in earliest.constructor.initializers) {
-        if (initializer is RedirectingInitializer) {
-          isRedirecting = true;
-        }
-      }
-      if (!isRedirecting) {
-        Set<SourceFieldBuilder> fields =
-            earliest.takeInitializedFields() ?? const {};
-        constructorInitializedFields[earliest] = fields;
-        (initializedFields ??= new Set<SourceFieldBuilder>.identity())
-            .addAll(fields);
-      }
+      if (constructorBuilder.isEffectivelyExternal) return;
+      if (constructorBuilder.isEffectivelyRedirecting) return;
+      Set<SourceFieldBuilder> fields =
+          constructorBuilder.takeInitializedFields() ?? const {};
+      constructorInitializedFields[constructorBuilder] = fields;
+      (initializedFields ??= new Set<SourceFieldBuilder>.identity())
+          .addAll(fields);
     });
 
     // Run through all fields that aren't initialized by any constructor, and
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index 1248d20..a9cbb2b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -218,12 +218,6 @@
   return a.fileOffset.compareTo(b.fileOffset);
 }
 
-bool isRedirectingGenerativeConstructorImplementation(Constructor constructor) {
-  List<Initializer> initializers = constructor.initializers;
-  return initializers.length == 1 &&
-      initializers.single is RedirectingInitializer;
-}
-
 List<Combinator>? toKernelCombinators(
     List<CombinatorBuilder>? fastaCombinators) {
   if (fastaCombinators == null) {
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index 65a2fa5..f7b1b47 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -131,12 +131,64 @@
             debugName: debugName,
             isModifiable: isModifiable);
 
-  Iterator<Builder> get iterator {
-    return new ScopeLocalDeclarationIterator(this);
+  /// 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 {
+    return new ScopeIterator(this);
   }
 
-  NameIterator get nameIterator {
-    return new ScopeLocalDeclarationNameIterator(this);
+  /// 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 {
+    return new ScopeNameIterator(this);
+  }
+
+  /// 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}) {
+    return new FilteredIterator<T>(unfilteredIterator,
+        parent: parent,
+        includeDuplicates: includeDuplicates,
+        includeAugmentations: 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}) {
+    return new FilteredNameIterator<T>(unfilteredNameIterator,
+        parent: parent,
+        includeDuplicates: includeDuplicates,
+        includeAugmentations: includeAugmentations);
   }
 
   void debug() {
@@ -623,6 +675,58 @@
     local[name] = builder;
   }
 
+  /// Returns an iterator of all constructors mapped in this scope,
+  /// including duplicate constructors mapped to the same name.
+  Iterator<MemberBuilder> get unfilteredIterator =>
+      new ConstructorScopeIterator(this);
+
+  /// Returns an iterator of all constructors mapped in this scope,
+  /// including duplicate constructors mapped to the same name.
+  ///
+  /// Compared to [unfilteredIterator] this iterator also gives access to the
+  /// name that the builders are mapped to.
+  NameIterator<MemberBuilder> get unfilteredNameIterator =>
+      new ConstructorScopeNameIterator(this);
+
+  /// Returns a filtered iterator of constructors mapped in this scope.
+  ///
+  /// Only members of type [T] are included. If [parent] is provided, on members
+  /// declared in [parent] are included. If [includeDuplicates] is `true`, all
+  /// duplicates of the same name are included, otherwise, only the first
+  /// declared member is included. If [includeAugmentations] is `true`, both
+  /// original and augmenting/patching members are included, otherwise, only
+  /// original members are included.
+  Iterator<T> filteredIterator<T extends MemberBuilder>(
+      {Builder? parent,
+      required bool includeDuplicates,
+      required bool includeAugmentations}) {
+    return new FilteredIterator<T>(unfilteredIterator,
+        parent: parent,
+        includeDuplicates: includeDuplicates,
+        includeAugmentations: includeAugmentations);
+  }
+
+  /// Returns a filtered iterator of constructors mapped in this scope.
+  ///
+  /// Only members of type [T] are included. If [parent] is provided, on members
+  /// declared in [parent] are included. If [includeDuplicates] is `true`, all
+  /// duplicates of the same name are included, otherwise, only the first
+  /// declared member is included. 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 MemberBuilder>(
+      {Builder? parent,
+      required bool includeDuplicates,
+      required bool includeAugmentations}) {
+    return new FilteredNameIterator<T>(unfilteredNameIterator,
+        parent: parent,
+        includeDuplicates: includeDuplicates,
+        includeAugmentations: includeAugmentations);
+  }
+
   @override
   String toString() => "ConstructorScope($className, ${local.keys})";
 }
@@ -867,13 +971,15 @@
       : super(name, builder, charOffset, fileUri);
 }
 
-class ScopeLocalDeclarationIterator implements Iterator<Builder> {
+/// Iterator over builders mapped in a [Scope], including duplicates for each
+/// directly mapped builder.
+class ScopeIterator implements Iterator<Builder> {
   Iterator<Builder>? local;
   final Iterator<Builder> setters;
 
   Builder? _current;
 
-  ScopeLocalDeclarationIterator(Scope scope)
+  ScopeIterator(Scope scope)
       : local = scope._local.values.iterator,
         setters = scope._setters.values.iterator;
 
@@ -906,14 +1012,18 @@
   }
 }
 
-class ScopeLocalDeclarationNameIterator extends ScopeLocalDeclarationIterator
-    implements NameIterator {
+/// Iterator over builders mapped in a [Scope], including duplicates for each
+/// directly mapped builder.
+///
+/// Compared to [ScopeIterator] this iterator also gives
+/// access to the name that the builders are mapped to.
+class ScopeNameIterator extends ScopeIterator implements NameIterator<Builder> {
   Iterator<String>? localNames;
   final Iterator<String> setterNames;
 
   String? _name;
 
-  ScopeLocalDeclarationNameIterator(Scope scope)
+  ScopeNameIterator(Scope scope)
       : localNames = scope._local.keys.iterator,
         setterNames = scope._setters.keys.iterator,
         super(scope);
@@ -941,6 +1051,7 @@
       return true;
     } else {
       _current = null;
+      _name = null;
       return false;
     }
   }
@@ -950,3 +1061,162 @@
     return _name ?? (throw new StateError('No element'));
   }
 }
+
+/// Iterator over builders mapped in a [ConstructorScope], including duplicates
+/// for each directly mapped builder.
+class ConstructorScopeIterator implements Iterator<MemberBuilder> {
+  Iterator<MemberBuilder> local;
+
+  MemberBuilder? _current;
+
+  ConstructorScopeIterator(ConstructorScope scope)
+      : local = scope.local.values.iterator;
+
+  @override
+  bool moveNext() {
+    MemberBuilder? next = _current?.next as MemberBuilder?;
+    if (next != null) {
+      _current = next;
+      return true;
+    }
+    if (local.moveNext()) {
+      _current = local.current;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  MemberBuilder get current {
+    return _current ?? (throw new StateError('No element'));
+  }
+}
+
+/// Iterator over builders mapped in a [ConstructorScope], including duplicates
+/// for each directly mapped builder.
+///
+/// Compared to [ConstructorScopeIterator] this iterator also gives
+/// access to the name that the builders are mapped to.
+class ConstructorScopeNameIterator extends ConstructorScopeIterator
+    implements NameIterator<MemberBuilder> {
+  final Iterator<String> localNames;
+
+  String? _name;
+
+  ConstructorScopeNameIterator(ConstructorScope scope)
+      : localNames = scope.local.keys.iterator,
+        super(scope);
+
+  @override
+  bool moveNext() {
+    MemberBuilder? next = _current?.next as MemberBuilder?;
+    if (next != null) {
+      _current = next;
+      return true;
+    }
+    if (local.moveNext()) {
+      localNames.moveNext();
+      _current = local.current;
+      _name = localNames.current;
+      return true;
+    }
+    _current = null;
+    _name = null;
+    return false;
+  }
+
+  @override
+  String get name {
+    return _name ?? (throw new StateError('No element'));
+  }
+}
+
+/// Filtered builder [Iterator].
+class FilteredIterator<T extends Builder> implements Iterator<T> {
+  final Iterator<Builder> _iterator;
+  final Builder? parent;
+  final bool includeDuplicates;
+  final bool includeAugmentations;
+
+  FilteredIterator(this._iterator,
+      {required this.parent,
+      required this.includeDuplicates,
+      required this.includeAugmentations});
+
+  bool _include(Builder element) {
+    if (parent != null && element.parent != parent) return false;
+    if (!includeDuplicates && element.isDuplicate) return false;
+    if (!includeAugmentations && element.isPatch) return false;
+    return element is T;
+  }
+
+  @override
+  T get current => _iterator.current as T;
+
+  @override
+  bool moveNext() {
+    while (_iterator.moveNext()) {
+      Builder candidate = _iterator.current;
+      if (_include(candidate)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/// Filtered [NameIterator].
+///
+/// Compared to [FilteredIterator] this iterator also gives
+/// access to the name that the builders are mapped to.
+class FilteredNameIterator<T extends Builder> implements NameIterator<T> {
+  final NameIterator<Builder> _iterator;
+  final Builder? parent;
+  final bool includeDuplicates;
+  final bool includeAugmentations;
+
+  FilteredNameIterator(this._iterator,
+      {required this.parent,
+      required this.includeDuplicates,
+      required this.includeAugmentations});
+
+  bool _include(Builder element) {
+    if (parent != null && element.parent != parent) return false;
+    if (!includeDuplicates && element.isDuplicate) return false;
+    if (!includeAugmentations && element.isPatch) return false;
+    return element is T;
+  }
+
+  @override
+  T get current => _iterator.current as T;
+
+  @override
+  String get name => _iterator.name;
+
+  @override
+  bool moveNext() {
+    while (_iterator.moveNext()) {
+      Builder candidate = _iterator.current;
+      if (_include(candidate)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+extension IteratorExtension<T extends Builder> on Iterator<T> {
+  void forEach(void Function(T) f) {
+    while (moveNext()) {
+      f(current);
+    }
+  }
+}
+
+extension NameIteratorExtension<T extends Builder> on NameIterator<T> {
+  void forEach(void Function(String, T) f) {
+    while (moveNext()) {
+      f(name, current);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 593d7b2..b4694d6 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -29,6 +29,7 @@
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
+import '../builder/name_iterator.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
@@ -164,54 +165,51 @@
         checkForInstanceVsStaticConflict: false,
         checkForMethodVsSetterConflict: false);
 
-    void buildBuilders(String name, Builder? declaration) {
-      while (declaration != null) {
-        if (declaration.parent != this) {
-          if (declaration.parent?.origin != this) {
-            if (fileUri != declaration.parent?.fileUri) {
-              unexpected("$fileUri", "${declaration.parent?.fileUri}",
-                  charOffset, fileUri);
+    void buildBuilders(Builder declaration) {
+      if (declaration.parent != this) {
+        if (declaration.parent?.origin != this) {
+          if (fileUri != declaration.parent?.fileUri) {
+            unexpected("$fileUri", "${declaration.parent?.fileUri}", charOffset,
+                fileUri);
+          } else {
+            unexpected(
+                fullNameForErrors,
+                declaration.parent?.fullNameForErrors ?? '',
+                charOffset,
+                fileUri);
+          }
+        }
+      } else if (declaration is SourceMemberBuilder) {
+        SourceMemberBuilder memberBuilder = declaration;
+        memberBuilder
+            .buildOutlineNodes((Member member, BuiltMemberKind memberKind) {
+          member.parent = cls;
+          if (!memberBuilder.isPatch &&
+              !memberBuilder.isDuplicate &&
+              !memberBuilder.isConflictingSetter &&
+              !memberBuilder.isConflictingAugmentationMember) {
+            if (member is Procedure) {
+              cls.addProcedure(member);
+            } else if (member is Field) {
+              cls.addField(member);
+            } else if (member is Constructor) {
+              cls.addConstructor(member);
+            } else if (member is RedirectingFactory) {
+              cls.addRedirectingFactory(member);
             } else {
-              unexpected(
-                  fullNameForErrors,
-                  declaration.parent?.fullNameForErrors ?? '',
-                  charOffset,
-                  fileUri);
+              unhandled("${member.runtimeType}", "getMember", member.fileOffset,
+                  member.fileUri);
             }
           }
-        } else if (declaration is SourceMemberBuilder) {
-          SourceMemberBuilder memberBuilder = declaration;
-          memberBuilder
-              .buildOutlineNodes((Member member, BuiltMemberKind memberKind) {
-            member.parent = cls;
-            if (!memberBuilder.isPatch &&
-                !memberBuilder.isDuplicate &&
-                !memberBuilder.isConflictingSetter &&
-                !memberBuilder.isConflictingAugmentationMember) {
-              if (member is Procedure) {
-                cls.addProcedure(member);
-              } else if (member is Field) {
-                cls.addField(member);
-              } else if (member is Constructor) {
-                cls.addConstructor(member);
-              } else if (member is RedirectingFactory) {
-                cls.addRedirectingFactory(member);
-              } else {
-                unhandled("${member.runtimeType}", "getMember",
-                    member.fileOffset, member.fileUri);
-              }
-            }
-          });
-        } else {
-          unhandled("${declaration.runtimeType}", "buildBuilders",
-              declaration.charOffset, declaration.fileUri);
-        }
-        declaration = declaration.next;
+        });
+      } else {
+        unhandled("${declaration.runtimeType}", "buildBuilders",
+            declaration.charOffset, declaration.fileUri);
       }
     }
 
-    scope.forEach(buildBuilders);
-    constructorScope.forEach(buildBuilders);
+    scope.unfilteredIterator.forEach(buildBuilders);
+    constructorScope.unfilteredIterator.forEach(buildBuilders);
     if (supertypeBuilder != null) {
       supertypeBuilder = _checkSupertype(supertypeBuilder!);
     }
@@ -343,7 +341,7 @@
       ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
       List<DelayedDefaultValueCloner> delayedDefaultValueCloners) {
-    void build(String ignore, Builder declaration) {
+    void build(Builder declaration) {
       SourceMemberBuilder member = declaration as SourceMemberBuilder;
       member.buildOutlineExpressions(
           classHierarchy, delayedActionPerformers, delayedDefaultValueCloners);
@@ -358,57 +356,28 @@
       }
     }
 
-    constructorScope.forEach(build);
-    scope.forEach(build);
+    constructorScope
+        .filteredIterator(
+            parent: this, includeDuplicates: false, includeAugmentations: true)
+        .forEach(build);
+    scope
+        .filteredIterator(
+            parent: this, includeDuplicates: false, includeAugmentations: true)
+        .forEach(build);
   }
 
   @override
   void forEach(void f(String name, Builder builder)) {
-    if (isPatch) {
-      actualOrigin!.forEach(f);
-    } else {
-      scope.forEach(f);
-      List<SourceClassBuilder>? patchClasses = _patches;
-      if (patchClasses != null) {
-        for (SourceClassBuilder patchClass in patchClasses) {
-          patchClass.scope.forEach((String name, Builder builder) {
-            if (!builder.isPatch) {
-              f(name, builder);
-            }
-          });
-        }
-      }
-    }
+    new ClassMemberNameIterator(this, includeDuplicates: false).forEach(f);
   }
 
   @override
   void forEachConstructor(void Function(String, MemberBuilder) f) {
-    if (isPatch) {
-      actualOrigin!.forEachConstructor(f);
-    } else {
-      constructorScope.forEach(f);
-      List<SourceClassBuilder>? patchClasses = _patches;
-      if (patchClasses != null) {
-        for (SourceClassBuilder patchClass in patchClasses) {
-          patchClass.constructorScope
-              .forEach((String name, MemberBuilder builder) {
-            if (!builder.isPatch) {
-              f(name, builder);
-            }
-          });
-        }
-      }
-    }
+    new ClassConstructorNameIterator(this, includeDuplicates: false).forEach(f);
   }
 
   void forEachDeclaredField(
       void Function(String name, SourceFieldBuilder fieldBuilder) callback) {
-    void callbackFilteringFieldBuilders(String name, Builder builder) {
-      if (builder is SourceFieldBuilder) {
-        callback(name, builder);
-      }
-    }
-
     // Currently, fields can't be patched, but can be injected.  When the fields
     // will be made available for patching, the following code should iterate
     // first over the fields from the patch and then -- over the fields in the
@@ -427,37 +396,18 @@
                     .toSet())
                 .isEmpty),
         "Detected an attempt to patch a field.");
-    List<SourceClassBuilder>? patchClasses = _patches;
-    if (patchClasses != null) {
-      for (SourceClassBuilder patchClass in patchClasses) {
-        patchClass.scope.forEach(callbackFilteringFieldBuilders);
-      }
-    }
-    scope.forEach(callbackFilteringFieldBuilders);
+    new ClassMemberNameIterator<SourceFieldBuilder>(this,
+            includeDuplicates: false)
+        .forEach(callback);
   }
 
   void forEachDeclaredConstructor(
       void Function(
               String name, DeclaredSourceConstructorBuilder constructorBuilder)
           callback) {
-    Set<String> visitedConstructorNames = {};
-    void callbackFilteringFieldBuilders(String name, Builder builder) {
-      if (builder is DeclaredSourceConstructorBuilder &&
-          visitedConstructorNames.add(builder.name)) {
-        callback(name, builder);
-      }
-    }
-
-    // Constructors can be patched, so iterate first over constructors in the
-    // patch, and then over constructors in the original declaration skipping
-    // those with the names that are in the patch.
-    List<SourceClassBuilder>? patchClasses = _patches;
-    if (patchClasses != null) {
-      for (SourceClassBuilder patchClass in patchClasses) {
-        patchClass.constructorScope.forEach(callbackFilteringFieldBuilders);
-      }
-    }
-    constructorScope.forEach(callbackFilteringFieldBuilders);
+    new ClassConstructorNameIterator<DeclaredSourceConstructorBuilder>(this,
+            includeDuplicates: false)
+        .forEach(callback);
   }
 
   /// Looks up the constructor by [name] on the class built by this class
@@ -1399,24 +1349,25 @@
 
     int count = 0;
 
-    void buildMembers(String name, Builder builder) {
+    void buildMembers(Builder builder) {
       if (builder.parent != this) {
         return;
       }
-      Builder? current = builder;
-      while (current != null) {
-        if (current is SourceMemberBuilder) {
-          count +=
-              current.buildBodyNodes((Member member, BuiltMemberKind kind) {
-            _buildMember(current as SourceMemberBuilder, member, kind);
-          });
-        }
-        current = current.next;
+      if (builder is SourceMemberBuilder) {
+        count += builder.buildBodyNodes((Member member, BuiltMemberKind kind) {
+          _buildMember(builder, member, kind);
+        });
       }
     }
 
-    scope.forEach(buildMembers);
-    constructorScope.forEach(buildMembers);
+    scope
+        .filteredIterator(
+            parent: this, includeDuplicates: true, includeAugmentations: true)
+        .forEach(buildMembers);
+    constructorScope
+        .filteredIterator(
+            parent: this, includeDuplicates: true, includeAugmentations: true)
+        .forEach(buildMembers);
     return count;
   }
 
@@ -2856,3 +2807,103 @@
   void checkTypes(
       SourceLibraryBuilder library, TypeEnvironment typeEnvironment) {}
 }
+
+class ClassMemberNameIterator<T extends Builder> implements NameIterator<T> {
+  NameIterator<T>? _iterator;
+  Iterator<SourceClassBuilder>? augmentationBuilders;
+  final bool includeDuplicates;
+
+  factory ClassMemberNameIterator(SourceClassBuilder classBuilder,
+      {required bool includeDuplicates}) {
+    return new ClassMemberNameIterator._(classBuilder.origin,
+        includeDuplicates: includeDuplicates);
+  }
+
+  ClassMemberNameIterator._(SourceClassBuilder classBuilder,
+      {required this.includeDuplicates})
+      : _iterator = classBuilder.scope.filteredNameIterator<T>(
+            parent: classBuilder,
+            includeDuplicates: includeDuplicates,
+            includeAugmentations: false),
+        augmentationBuilders = classBuilder._patches?.iterator;
+
+  @override
+  bool moveNext() {
+    if (_iterator != null) {
+      if (_iterator!.moveNext()) {
+        return true;
+      }
+    }
+    if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+      SourceClassBuilder augmentationClassBuilder =
+          augmentationBuilders!.current;
+      _iterator = augmentationClassBuilder.scope.filteredNameIterator<T>(
+          parent: augmentationClassBuilder,
+          includeDuplicates: includeDuplicates,
+          includeAugmentations: false);
+    }
+    if (_iterator != null) {
+      if (_iterator!.moveNext()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  T get current => _iterator?.current ?? (throw new StateError('No element'));
+
+  @override
+  String get name => _iterator?.name ?? (throw new StateError('No element'));
+}
+
+class ClassConstructorNameIterator<T extends MemberBuilder>
+    implements NameIterator<T> {
+  NameIterator<T>? _iterator;
+  Iterator<SourceClassBuilder>? augmentationBuilders;
+  final bool includeDuplicates;
+
+  factory ClassConstructorNameIterator(SourceClassBuilder classBuilder,
+      {required bool includeDuplicates}) {
+    return new ClassConstructorNameIterator._(classBuilder.origin,
+        includeDuplicates: includeDuplicates);
+  }
+
+  ClassConstructorNameIterator._(SourceClassBuilder classBuilder,
+      {required this.includeDuplicates})
+      : _iterator = classBuilder.constructorScope.filteredNameIterator<T>(
+            parent: classBuilder,
+            includeDuplicates: includeDuplicates,
+            includeAugmentations: false),
+        augmentationBuilders = classBuilder._patches?.iterator;
+
+  @override
+  bool moveNext() {
+    if (_iterator != null) {
+      if (_iterator!.moveNext()) {
+        return true;
+      }
+    }
+    if (augmentationBuilders != null && augmentationBuilders!.moveNext()) {
+      SourceClassBuilder augmentationClassBuilder =
+          augmentationBuilders!.current;
+      _iterator = augmentationClassBuilder.constructorScope
+          .filteredNameIterator<T>(
+              parent: augmentationClassBuilder,
+              includeDuplicates: includeDuplicates,
+              includeAugmentations: false);
+    }
+    if (_iterator != null) {
+      if (_iterator!.moveNext()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  T get current => _iterator?.current ?? (throw new StateError('No element'));
+
+  @override
+  String get name => _iterator?.name ?? (throw new StateError('No element'));
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 731b63e..bec8ff9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -33,8 +33,6 @@
         TypeDependency,
         finishConstructorPatch,
         finishProcedurePatch;
-import '../kernel/utils.dart'
-    show isRedirectingGenerativeConstructorImplementation;
 import '../messages.dart'
     show
         LocatedMessage,
@@ -64,6 +62,13 @@
 
   void addSuperParameterDefaultValueCloners(
       List<DelayedDefaultValueCloner> delayedDefaultValueCloners);
+
+  /// Returns `true` if this constructor is an redirecting generative
+  /// constructor.
+  ///
+  /// It is considered redirecting if it has at least one redirecting
+  /// initializer.
+  bool get isRedirecting;
 }
 
 class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
@@ -194,8 +199,51 @@
   ProcedureKind? get kind => null;
 
   @override
-  bool get isRedirectingGenerativeConstructor {
-    return isRedirectingGenerativeConstructorImplementation(_constructor);
+  bool get isRedirecting {
+    for (Initializer initializer in _constructor.initializers) {
+      if (initializer is RedirectingInitializer) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Returns `true` if this constructor, including its augmentations, is
+  /// external.
+  ///
+  /// An augmented constructor is considered external if all of the origin
+  /// and augmentation constructors are external.
+  bool get isEffectivelyExternal {
+    bool isExternal = this.isExternal;
+    if (isExternal) {
+      List<SourceConstructorBuilder>? patches = _patches;
+      if (patches != null) {
+        for (SourceConstructorBuilder patch in patches) {
+          isExternal &= patch.isExternal;
+        }
+      }
+    }
+    return isExternal;
+  }
+
+  /// Returns `true` if this constructor or any of its augmentations are
+  /// redirecting.
+  ///
+  /// An augmented constructor is considered redirecting if any of the origin
+  /// or augmentation constructors is redirecting. Since it is an error if more
+  /// than one is redirecting, only one can be redirecting in the without
+  /// errors.
+  bool get isEffectivelyRedirecting {
+    bool isRedirecting = this.isRedirecting;
+    if (!isRedirecting) {
+      List<SourceConstructorBuilder>? patches = _patches;
+      if (patches != null) {
+        for (SourceConstructorBuilder patch in patches) {
+          isRedirecting |= patch.isRedirecting;
+        }
+      }
+    }
+    return isRedirecting;
   }
 
   @override
@@ -765,7 +813,11 @@
   /// The field can be initialized either via an initializing formal or via an
   /// entry in the constructor initializer list.
   void registerInitializedField(SourceFieldBuilder fieldBuilder) {
-    (_initializedFields ??= {}).add(fieldBuilder);
+    if (isPatch) {
+      origin.registerInitializedField(fieldBuilder);
+    } else {
+      (_initializedFields ??= {}).add(fieldBuilder);
+    }
   }
 
   /// Returns the fields registered as initialized by this constructor.
@@ -834,6 +886,16 @@
       super.libraryBuilder as SourceLibraryBuilder;
 
   @override
+  bool get isRedirecting {
+    for (Initializer initializer in constructor.initializers) {
+      if (initializer is RedirectingInitializer) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
   void inferFormalTypes(ClassHierarchyBase hierarchy) {
     if (_immediatelyDefiningConstructor is SourceConstructorBuilder) {
       (_immediatelyDefiningConstructor as SourceConstructorBuilder)
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 874a967..9ed08c9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -102,43 +102,40 @@
     ClassBuilder objectClassBuilder =
         coreLibrary.lookupLocalMember('Object', required: true) as ClassBuilder;
 
-    void buildBuilders(String name, Builder? declaration) {
-      while (declaration != null) {
-        Builder? objectGetter = objectClassBuilder.lookupLocalMember(name);
-        Builder? objectSetter =
-            objectClassBuilder.lookupLocalMember(name, setter: true);
-        if (objectGetter != null && !objectGetter.isStatic ||
-            objectSetter != null && !objectSetter.isStatic) {
-          addProblem(
-              templateExtensionMemberConflictsWithObjectMember
-                  .withArguments(name),
-              declaration.charOffset,
-              name.length);
-        }
-        if (declaration.parent != this) {
-          if (fileUri != declaration.parent!.fileUri) {
-            unexpected("$fileUri", "${declaration.parent!.fileUri}", charOffset,
-                fileUri);
-          } else {
-            unexpected(fullNameForErrors, declaration.parent!.fullNameForErrors,
-                charOffset, fileUri);
-          }
-        } else if (declaration is SourceMemberBuilder) {
-          SourceMemberBuilder memberBuilder = declaration;
-          memberBuilder
-              .buildOutlineNodes((Member member, BuiltMemberKind memberKind) {
-            _buildMember(memberBuilder, member, memberKind,
-                addMembersToLibrary: addMembersToLibrary);
-          });
+    void buildBuilders(String name, Builder declaration) {
+      Builder? objectGetter = objectClassBuilder.lookupLocalMember(name);
+      Builder? objectSetter =
+          objectClassBuilder.lookupLocalMember(name, setter: true);
+      if (objectGetter != null && !objectGetter.isStatic ||
+          objectSetter != null && !objectSetter.isStatic) {
+        addProblem(
+            templateExtensionMemberConflictsWithObjectMember
+                .withArguments(name),
+            declaration.charOffset,
+            name.length);
+      }
+      if (declaration.parent != this) {
+        if (fileUri != declaration.parent!.fileUri) {
+          unexpected("$fileUri", "${declaration.parent!.fileUri}", charOffset,
+              fileUri);
         } else {
-          unhandled("${declaration.runtimeType}", "buildBuilders",
-              declaration.charOffset, declaration.fileUri);
+          unexpected(fullNameForErrors, declaration.parent!.fullNameForErrors,
+              charOffset, fileUri);
         }
-        declaration = declaration.next;
+      } else if (declaration is SourceMemberBuilder) {
+        SourceMemberBuilder memberBuilder = declaration;
+        memberBuilder
+            .buildOutlineNodes((Member member, BuiltMemberKind memberKind) {
+          _buildMember(memberBuilder, member, memberKind,
+              addMembersToLibrary: addMembersToLibrary);
+        });
+      } else {
+        unhandled("${declaration.runtimeType}", "buildBuilders",
+            declaration.charOffset, declaration.fileUri);
       }
     }
 
-    scope.forEach(buildBuilders);
+    scope.unfilteredNameIterator.forEach(buildBuilders);
 
     return _extension;
   }
@@ -237,17 +234,15 @@
 
   int buildBodyNodes({required bool addMembersToLibrary}) {
     int count = 0;
-    scope.forEach((String name, Builder? declaration) {
-      while (declaration != null) {
-        if (declaration is SourceMemberBuilder) {
-          count +=
-              declaration.buildBodyNodes((Member member, BuiltMemberKind kind) {
-            _buildMember(declaration as SourceMemberBuilder, member, kind,
-                addMembersToLibrary: addMembersToLibrary);
-          });
-        }
-        declaration = declaration.next;
-      }
+    scope
+        .filteredIterator<SourceMemberBuilder>(
+            parent: this, includeDuplicates: false, includeAugmentations: true)
+        .forEach((SourceMemberBuilder declaration) {
+      count +=
+          declaration.buildBodyNodes((Member member, BuiltMemberKind kind) {
+        _buildMember(declaration, member, kind,
+            addMembersToLibrary: addMembersToLibrary);
+      });
     });
     return count;
   }
@@ -287,13 +282,15 @@
       }
     }
 
-    void build(String ignore, Builder declaration) {
-      SourceMemberBuilder member = declaration as SourceMemberBuilder;
+    void build(SourceMemberBuilder member) {
       member.buildOutlineExpressions(
           classHierarchy, delayedActionPerformers, delayedDefaultValueCloners);
     }
 
-    scope.forEach(build);
+    scope
+        .filteredIterator<SourceMemberBuilder>(
+            parent: this, includeDuplicates: false, includeAugmentations: true)
+        .forEach(build);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 599f467..25cc5e7 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -1064,7 +1064,7 @@
         checkForInstanceVsStaticConflict: false,
         checkForMethodVsSetterConflict: true);
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       _buildOutlineNodes(iterator.current, coreLibrary);
     }
@@ -1242,7 +1242,7 @@
       }
 
       part.validatePart(this, usedParts);
-      NameIterator partDeclarations = part.nameIterator;
+      NameIterator partDeclarations = part.localMembersNameIterator;
       while (partDeclarations.moveNext()) {
         String name = partDeclarations.name;
         Builder declaration = partDeclarations.current;
@@ -1340,7 +1340,7 @@
       }
     }
 
-    NameIterator iterator = nameIterator;
+    NameIterator iterator = localMembersNameIterator;
     while (iterator.moveNext()) {
       addToExportScope(iterator.name, iterator.current);
     }
@@ -1375,12 +1375,18 @@
       import.finalizeImports(this);
     }
     if (!explicitCoreImport) {
-      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
+      loader.coreLibrary.exportScope
+          .filteredNameIterator(
+              includeDuplicates: false, includeAugmentations: false)
+          .forEach((String name, Builder member) {
         addToScope(name, member, -1, true);
       });
     }
 
-    exportScope.forEach((String name, Builder member) {
+    exportScope
+        .filteredNameIterator(
+            includeDuplicates: false, includeAugmentations: false)
+        .forEach((String name, Builder member) {
       if (member.parent != this) {
         if (member is DynamicTypeDeclarationBuilder) {
           assert(name == 'dynamic',
@@ -1483,7 +1489,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder declaration = iterator.current;
       if (declaration is SourceClassBuilder) {
@@ -1512,7 +1518,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder member = iterator.current;
       if (member is SourceClassBuilder && !member.isPatch) {
@@ -1533,7 +1539,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder builder = iterator.current;
       if (builder is SourceClassBuilder) {
@@ -3031,7 +3037,7 @@
     MetadataBuilder.buildAnnotations(
         library, metadata, this, null, null, fileUri, scope);
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder declaration = iterator.current;
       if (declaration is SourceClassBuilder) {
@@ -3908,7 +3914,7 @@
       }
     }
 
-    NameIterator originDeclarations = origin.nameIterator;
+    NameIterator originDeclarations = origin.localMembersNameIterator;
     while (originDeclarations.moveNext()) {
       String name = originDeclarations.name;
       Builder member = originDeclarations.current;
@@ -3930,7 +3936,7 @@
         }
       }
     }
-    NameIterator patchDeclarations = nameIterator;
+    NameIterator patchDeclarations = localMembersNameIterator;
     while (patchDeclarations.moveNext()) {
       String name = patchDeclarations.name;
       Builder member = patchDeclarations.current;
@@ -3961,7 +3967,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder builder = iterator.current;
       if (builder is SourceMemberBuilder) {
@@ -4461,7 +4467,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder declaration = iterator.current;
       if (declaration is SourceFieldBuilder) {
@@ -4892,7 +4898,7 @@
       }
     }
 
-    Iterator<Builder> iterator = this.iterator;
+    Iterator<Builder> iterator = localMembersIterator;
     while (iterator.moveNext()) {
       Builder? declaration = iterator.current;
       while (declaration != null) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 3de16c3..ff9e1ae 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1351,7 +1351,10 @@
         both.add(exported as SourceLibraryBuilder);
       }
       for (Export export in exported.exporters) {
-        exported.exportScope.forEach(export.addToExportScope);
+        exported.exportScope
+            .filteredNameIterator(
+                includeDuplicates: false, includeAugmentations: false)
+            .forEach(export.addToExportScope);
       }
     }
     bool wasChanged = false;
@@ -1359,7 +1362,10 @@
       wasChanged = false;
       for (SourceLibraryBuilder exported in both) {
         for (Export export in exported.exporters) {
-          exported.exportScope.forEach((String name, Builder member) {
+          exported.exportScope
+              .filteredNameIterator(
+                  includeDuplicates: false, includeAugmentations: false)
+              .forEach((String name, Builder member) {
             if (export.addToExportScope(name, member)) {
               wasChanged = true;
             }
@@ -1389,17 +1395,17 @@
     _builders.forEach((Uri uri, dynamic l) {
       SourceLibraryBuilder library = l;
       Set<Builder> members = new Set<Builder>();
-      Iterator<Builder> iterator = library.iterator;
+      Iterator<Builder> iterator = library.localMembersIterator;
       while (iterator.moveNext()) {
         members.add(iterator.current);
       }
       List<String> exports = <String>[];
-      library.exportScope.forEach((String name, Builder? member) {
-        while (member != null) {
-          if (!members.contains(member)) {
-            exports.add(name);
-          }
-          member = member.next;
+      library.exportScope
+          .filteredNameIterator(
+              includeDuplicates: true, includeAugmentations: false)
+          .forEach((String name, Builder member) {
+        if (!members.contains(member)) {
+          exports.add(name);
         }
       });
       if (exports.isNotEmpty) {
@@ -1445,7 +1451,7 @@
     Map<Uri, List<ClassBuilder>> macroLibraries = {};
 
     for (LibraryBuilder libraryBuilder in libraryBuilders) {
-      Iterator<Builder> iterator = libraryBuilder.iterator;
+      Iterator<Builder> iterator = libraryBuilder.localMembersIterator;
       while (iterator.moveNext()) {
         Builder builder = iterator.current;
         if (builder is ClassBuilder && builder.isMacro) {
@@ -1598,7 +1604,7 @@
       // TODO(johnniwinther): Handle patch libraries.
       LibraryMacroApplicationData libraryMacroApplicationData =
           new LibraryMacroApplicationData();
-      Iterator<Builder> iterator = libraryBuilder.iterator;
+      Iterator<Builder> iterator = libraryBuilder.localMembersIterator;
       while (iterator.moveNext()) {
         Builder builder = iterator.current;
         if (builder is SourceClassBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_member_builder.dart b/pkg/front_end/lib/src/fasta/source/source_member_builder.dart
index af7e756..725eae1 100644
--- a/pkg/front_end/lib/src/fasta/source/source_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_member_builder.dart
@@ -108,8 +108,6 @@
   SourceLibraryBuilder get libraryBuilder =>
       super.libraryBuilder as SourceLibraryBuilder;
 
-  bool get isRedirectingGenerativeConstructor => false;
-
   @override
   bool get isAugmentation => modifiers & augmentMask != 0;
 
diff --git a/pkg/front_end/test/macros/application/data/tests/declarations.dart b/pkg/front_end/test/macros/application/data/tests/declarations.dart
index 77b616e..1229ca9 100644
--- a/pkg/front_end/test/macros/application/data/tests/declarations.dart
+++ b/pkg/front_end/test/macros/application/data/tests/declarations.dart
@@ -111,7 +111,7 @@
 void Class1Introspection() {
   print("constructors='','redirect','fact'");
   print("fields='instanceField1','instanceField2','instanceField3'");
-  print("methods='instanceMethod1','instanceGetter1','[]','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
+  print("methods='instanceMethod1','instanceGetter1','[]','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
 }
 
 
diff --git a/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect b/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
index 5c344e0..7f55d9f 100644
--- a/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
+++ b/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
@@ -81,7 +81,7 @@
 static method /* from org-dartlang-augmentation:/a/b/c/main.dart-10 */ Class1Introspection() → void {
   core::print("constructors='','redirect','fact'");
   core::print("fields='instanceField1','instanceField2','instanceField3'");
-  core::print("methods='instanceMethod1','instanceGetter1','[]','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
+  core::print("methods='instanceMethod1','instanceGetter1','[]','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
 }
 static method /* from org-dartlang-augmentation:/a/b/c/main.dart-11 */ Class1GeneratedMethod_() → void {}
 static method /* from org-dartlang-augmentation:/a/b/c/main.dart-12 */ Class2_instanceMethod1GeneratedMethod_a() → void {}
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index e49039c..c020b195 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -16,6 +16,7 @@
 import 'package:front_end/src/fasta/source/source_factory_builder.dart';
 import 'package:front_end/src/fasta/source/source_member_builder.dart';
 import 'package:front_end/src/fasta/source/source_procedure_builder.dart';
+import 'package:front_end/src/fasta/scope.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
 import 'package:kernel/ast.dart';
@@ -138,7 +139,10 @@
     if (cls.isAbstract) {
       features.add(Tags.isAbstract);
     }
-    clsBuilder.scope.forEach((String name, Builder builder) {
+    clsBuilder.scope
+        .filteredNameIterator(
+            includeDuplicates: false, includeAugmentations: false)
+        .forEach((String name, Builder builder) {
       features.addElement(Tags.scope, name);
     });
 
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 8c0102f..4ca7632 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1457,6 +1457,7 @@
 unescape
 unexact
 unexpectedly
+unfiltered
 unfinalized
 unfold
 unfolds
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect
index b451599..8c1f6e6 100644
--- a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect
@@ -28,6 +28,14 @@
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
 }
+@#C3
+class Class2 extends core::Object {
+  final field core::int injectedField /* from org-dartlang-testcase:///patch_lib.dart */;
+  field core::int field;
+  constructor •(core::int field) → test::Class2
+    : test::Class2::field = field, test::Class2::injectedField = field, super core::Object::•()
+    ;
+}
 
 constants  {
   #C1 = true
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect
index b451599..8c1f6e6 100644
--- a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect
@@ -28,6 +28,14 @@
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
 }
+@#C3
+class Class2 extends core::Object {
+  final field core::int injectedField /* from org-dartlang-testcase:///patch_lib.dart */;
+  field core::int field;
+  constructor •(core::int field) → test::Class2
+    : test::Class2::field = field, test::Class2::injectedField = field, super core::Object::•()
+    ;
+}
 
 constants  {
   #C1 = true
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
index ef6d09e..e8e0e75 100644
--- a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
@@ -24,10 +24,18 @@
     : self2::Class::defaultValue = defaultValue, super core::Object::•()
     ;
 }
+@_in::patch
+class Class2 extends core::Object {
+  final field core::int injectedField /* from org-dartlang-testcase:///patch_lib.dart */;
+  field core::int field;
+  external constructor •(core::int field) → self2::Class2
+    ;
+}
 
 
 Extra constant evaluation status:
 Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:6:49 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:7:44 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:16:9 -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 4, effectively constant: 3
+Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Extra constant evaluation: evaluated: 5, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect
index b451599..8c1f6e6 100644
--- a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect
@@ -28,6 +28,14 @@
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
 }
+@#C3
+class Class2 extends core::Object {
+  final field core::int injectedField /* from org-dartlang-testcase:///patch_lib.dart */;
+  field core::int field;
+  constructor •(core::int field) → test::Class2
+    : test::Class2::field = field, test::Class2::injectedField = field, super core::Object::•()
+    ;
+}
 
 constants  {
   #C1 = true
diff --git a/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart b/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart
index 2906fbf..927aabf 100644
--- a/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart
+++ b/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart
@@ -6,3 +6,9 @@
   external Class.generative({bool defaultValue: true});
   external const Class.constGenerative({bool defaultValue: true});
 }
+
+class Class2 {
+  int field;
+
+  external Class2(int field);
+}
diff --git a/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart b/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart
index 0c4899c..2d8f750 100644
--- a/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart
+++ b/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart
@@ -15,3 +15,10 @@
   @patch
   const Class.constGenerative({this.defaultValue: true});
 }
+
+@patch
+class Class2 {
+  final int injectedField;
+
+  Class2(this.field) : injectedField = field;
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.expect
index 17c2eb1..1a322d0 100644
--- a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.expect
@@ -334,10 +334,6 @@
 //     return 0;
 //     ^
 //
-// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Field 'Foo' should be initialized because its type 'int' doesn't allow null.
-//   int Foo;
-//       ^^^
-//
 // pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:7: Error: Field 'A' should be initialized because its type 'int' doesn't allow null.
 //   int A, Foo, B;
 //       ^
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect
index 17c2eb1..1a322d0 100644
--- a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect
@@ -334,10 +334,6 @@
 //     return 0;
 //     ^
 //
-// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Field 'Foo' should be initialized because its type 'int' doesn't allow null.
-//   int Foo;
-//       ^^^
-//
 // pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:7: Error: Field 'A' should be initialized because its type 'int' doesn't allow null.
 //   int A, Foo, B;
 //       ^
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.transformed.expect
index 17c2eb1..1a322d0 100644
--- a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.transformed.expect
@@ -334,10 +334,6 @@
 //     return 0;
 //     ^
 //
-// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Field 'Foo' should be initialized because its type 'int' doesn't allow null.
-//   int Foo;
-//       ^^^
-//
 // pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:7: Error: Field 'A' should be initialized because its type 'int' doesn't allow null.
 //   int A, Foo, B;
 //       ^
diff --git a/pkg/front_end/testcases/general/issue43363.dart.weak.expect b/pkg/front_end/testcases/general/issue43363.dart.weak.expect
index 42b4c7d..a2af944 100644
--- a/pkg/front_end/testcases/general/issue43363.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue43363.dart.weak.expect
@@ -30,6 +30,11 @@
 //               this.y = 6;
 //                    ^
 //
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Error: Final field 'y' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int y;
+//             ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect
index 42b4c7d..a2af944 100644
--- a/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect
@@ -30,6 +30,11 @@
 //               this.y = 6;
 //                    ^
 //
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Error: Final field 'y' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int y;
+//             ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue43363.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue43363.dart.weak.transformed.expect
index 42b4c7d..a2af944 100644
--- a/pkg/front_end/testcases/general/issue43363.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue43363.dart.weak.transformed.expect
@@ -30,6 +30,11 @@
 //               this.y = 6;
 //                    ^
 //
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Error: Final field 'y' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int y;
+//             ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
index 6e42cfb..cc62f70 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.expect
@@ -1051,26 +1051,6 @@
 //   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
index 6e42cfb..cc62f70 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.strong.transformed.expect
@@ -1051,26 +1051,6 @@
 //   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
index 6e42cfb..cc62f70 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.expect
@@ -1051,26 +1051,6 @@
 //   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect
index 6e42cfb..cc62f70 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect
@@ -1051,26 +1051,6 @@
 //   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
index 6e42cfb..cc62f70 100644
--- a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.transformed.expect
@@ -1051,26 +1051,6 @@
 //   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
-//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.expect
index 7e8a8f2..1c0cc98 100644
--- a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.expect
@@ -488,16 +488,6 @@
 //   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter2 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter4 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.transformed.expect
index 46e1b34..3256d38 100644
--- a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.strong.transformed.expect
@@ -488,16 +488,6 @@
 //   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter2 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter4 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.expect
index 7e8a8f2..1c0cc98 100644
--- a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.expect
@@ -488,16 +488,6 @@
 //   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter2 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter4 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect
index 7e8a8f2..1c0cc98 100644
--- a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect
@@ -488,16 +488,6 @@
 //   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter2 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter4 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.transformed.expect
index 46e1b34..3256d38 100644
--- a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.transformed.expect
@@ -488,16 +488,6 @@
 //   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
 //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter2 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final int? fieldAndFinalFieldAndSetter4 = 0;
-//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;