[cfe] Move parent, fileUri, and charOffset to MemberBuilder subclasses

Change-Id: I3bc30c2e12c52f6886260068f6d0f852985b7973
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/390220
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/builder/member_builder.dart b/pkg/front_end/lib/src/builder/member_builder.dart
index 6bbb6eb..9b2c2a9 100644
--- a/pkg/front_end/lib/src/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/builder/member_builder.dart
@@ -90,49 +90,12 @@
 
 abstract class MemberBuilderImpl extends BuilderImpl implements MemberBuilder {
   @override
-  String get name;
-
-  /// For top-level members, the parent is set correctly during
-  /// construction. However, for class members, the parent is initially the
-  /// library and updated later.
-  @override
-  Builder parent;
+  Uri get fileUri;
 
   @override
-  final int charOffset;
-
-  @override
-  final Uri fileUri;
-
-  MemberBuilderImpl(this.parent, this.fileUri, this.charOffset);
-
-  @override
-  DeclarationBuilder? get declarationBuilder =>
-      parent is DeclarationBuilder ? parent as DeclarationBuilder : null;
-
-  @override
-  ClassBuilder? get classBuilder =>
-      parent is ClassBuilder ? parent as ClassBuilder : null;
-
-  @override
-  LibraryBuilder get libraryBuilder {
-    if (parent is LibraryBuilder) {
-      LibraryBuilder library = parent as LibraryBuilder;
-      return library.partOfLibrary ?? library;
-    }
-    // Coverage-ignore(suite): Not run.
-    else if (parent is ExtensionBuilder) {
-      ExtensionBuilder extension = parent as ExtensionBuilder;
-      return extension.libraryBuilder;
-    } else if (parent is ExtensionTypeDeclarationBuilder) {
-      ExtensionTypeDeclarationBuilder extensionTypeDeclaration =
-          parent as ExtensionTypeDeclarationBuilder;
-      return extensionTypeDeclaration.libraryBuilder;
-    } else {
-      ClassBuilder cls = parent as ClassBuilder;
-      return cls.libraryBuilder;
-    }
-  }
+  ClassBuilder? get classBuilder => declarationBuilder is ClassBuilder
+      ? declarationBuilder as ClassBuilder
+      : null;
 
   @override
   bool get isDeclarationInstanceMember => isDeclarationMember && !isStatic;
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 828a7b7..b33e506 100644
--- a/pkg/front_end/lib/src/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_class_builder.dart
@@ -158,22 +158,23 @@
   List<TypeBuilder>? get onTypes => null;
 
   void addField(Field field) {
-    DillFieldBuilder builder = new DillFieldBuilder(field, this);
+    DillFieldBuilder builder =
+        new DillFieldBuilder(field, libraryBuilder, this);
     String name = field.name.text;
     nameSpace.addLocalMember(name, builder, setter: false);
   }
 
   void addConstructor(Constructor constructor, Procedure? constructorTearOff) {
-    DillConstructorBuilder builder =
-        new DillConstructorBuilder(constructor, constructorTearOff, this);
+    DillConstructorBuilder builder = new DillConstructorBuilder(
+        constructor, constructorTearOff, libraryBuilder, this);
     String name = constructor.name.text;
     nameSpace.addConstructor(name, builder);
   }
 
   void addFactory(Procedure factory, Procedure? factoryTearOff) {
     String name = factory.name.text;
-    nameSpace.addConstructor(
-        name, new DillFactoryBuilder(factory, factoryTearOff, this));
+    nameSpace.addConstructor(name,
+        new DillFactoryBuilder(factory, factoryTearOff, libraryBuilder, this));
   }
 
   void addProcedure(Procedure procedure) {
@@ -183,19 +184,23 @@
         // Coverage-ignore(suite): Not run.
         throw new UnsupportedError("Use addFactory for adding factories");
       case ProcedureKind.Setter:
-        nameSpace.addLocalMember(name, new DillSetterBuilder(procedure, this),
+        nameSpace.addLocalMember(
+            name, new DillSetterBuilder(procedure, libraryBuilder, this),
             setter: true);
         break;
       case ProcedureKind.Getter:
-        nameSpace.addLocalMember(name, new DillGetterBuilder(procedure, this),
+        nameSpace.addLocalMember(
+            name, new DillGetterBuilder(procedure, libraryBuilder, this),
             setter: false);
         break;
       case ProcedureKind.Operator:
-        nameSpace.addLocalMember(name, new DillOperatorBuilder(procedure, this),
+        nameSpace.addLocalMember(
+            name, new DillOperatorBuilder(procedure, libraryBuilder, this),
             setter: false);
         break;
       case ProcedureKind.Method:
-        nameSpace.addLocalMember(name, new DillMethodBuilder(procedure, this),
+        nameSpace.addLocalMember(
+            name, new DillMethodBuilder(procedure, libraryBuilder, 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 54ba740..87e0c4b 100644
--- a/pkg/front_end/lib/src/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_extension_builder.dart
@@ -16,7 +16,7 @@
 class DillExtensionBuilder extends ExtensionBuilderImpl
     with DillDeclarationBuilderMixin {
   @override
-  final DillLibraryBuilder parent;
+  final DillLibraryBuilder libraryBuilder;
 
   @override
   final Extension extension;
@@ -30,7 +30,7 @@
   List<NominalVariableBuilder>? _typeParameters;
   TypeBuilder? _onType;
 
-  DillExtensionBuilder(this.extension, this.parent)
+  DillExtensionBuilder(this.extension, this.libraryBuilder)
       : _nameSpace = new DeclarationNameSpaceImpl() {
     _scope = new NameSpaceLookupScope(
         _nameSpace, ScopeKind.declaration, "extension ${extension.name}",
@@ -46,7 +46,7 @@
             nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionStaticMethodBuilder(
-                    procedure, descriptor, this),
+                    procedure, descriptor, libraryBuilder, this),
                 setter: false);
           } else {
             Procedure procedure = descriptor.memberReference.asProcedure;
@@ -55,32 +55,40 @@
             nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionInstanceMethodBuilder(
-                    procedure, descriptor, this, tearOff!),
+                    procedure, descriptor, libraryBuilder, this, tearOff!),
                 setter: false);
           }
           break;
         case ExtensionMemberKind.Getter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionGetterBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionGetterBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: false);
           break;
         case ExtensionMemberKind.Field:
           Field field = descriptor.memberReference.asField;
           nameSpace.addLocalMember(
-              name.text, new DillExtensionFieldBuilder(field, descriptor, this),
+              name.text,
+              new DillExtensionFieldBuilder(
+                  field, descriptor, libraryBuilder, this),
               setter: false);
           break;
         case ExtensionMemberKind.Setter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionSetterBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionSetterBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: true);
           break;
         case ExtensionMemberKind.Operator:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionOperatorBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionOperatorBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: false);
           break;
       }
@@ -88,6 +96,9 @@
   }
 
   @override
+  DillLibraryBuilder get parent => libraryBuilder;
+
+  @override
   Reference get reference => extension.reference;
 
   @override
diff --git a/pkg/front_end/lib/src/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/dill/dill_extension_member_builder.dart
index 9b4dc9e..0bb8a1e 100644
--- a/pkg/front_end/lib/src/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_extension_member_builder.dart
@@ -4,14 +4,14 @@
 
 import 'package:kernel/ast.dart';
 
-import '../builder/builder.dart';
+import 'dill_extension_builder.dart';
 import 'dill_member_builder.dart';
 
 abstract class DillExtensionMemberBuilder extends DillMemberBuilder {
   final ExtensionMemberDescriptor _descriptor;
 
-  DillExtensionMemberBuilder(Member member, this._descriptor, Builder parent)
-      : super(member, parent);
+  DillExtensionMemberBuilder(this._descriptor, super.libraryBuilder,
+      DillExtensionBuilder super.declarationBuilder);
 
   @override
   bool get isStatic => _descriptor.isStatic;
@@ -44,9 +44,8 @@
 class DillExtensionFieldBuilder extends DillExtensionMemberBuilder {
   final Field field;
 
-  DillExtensionFieldBuilder(
-      this.field, ExtensionMemberDescriptor descriptor, Builder parent)
-      : super(field, descriptor, parent);
+  DillExtensionFieldBuilder(this.field, super.descriptor, super.libraryBuilder,
+      super.declarationBuilder);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -71,10 +70,9 @@
 class DillExtensionSetterBuilder extends DillExtensionMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionSetterBuilder(
-      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionMemberKind.Setter),
-        super(procedure, descriptor, parent);
+  DillExtensionSetterBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionMemberKind.Setter);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -94,10 +92,9 @@
 class DillExtensionGetterBuilder extends DillExtensionMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionGetterBuilder(
-      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionMemberKind.Getter),
-        super(procedure, descriptor, parent);
+  DillExtensionGetterBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionMemberKind.Getter);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -117,10 +114,9 @@
 class DillExtensionOperatorBuilder extends DillExtensionMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionOperatorBuilder(
-      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionMemberKind.Operator),
-        super(procedure, descriptor, parent);
+  DillExtensionOperatorBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionMemberKind.Operator);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -140,11 +136,10 @@
 class DillExtensionStaticMethodBuilder extends DillExtensionMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionStaticMethodBuilder(
-      this.procedure, ExtensionMemberDescriptor descriptor, Builder parent)
+  DillExtensionStaticMethodBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
       : assert(descriptor.kind == ExtensionMemberKind.Method),
-        assert(descriptor.isStatic),
-        super(procedure, descriptor, parent);
+        assert(descriptor.isStatic);
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -166,14 +161,10 @@
 
   final Procedure _extensionTearOff;
 
-  DillExtensionInstanceMethodBuilder(
-      this.procedure,
-      ExtensionMemberDescriptor descriptor,
-      Builder parent,
-      this._extensionTearOff)
+  DillExtensionInstanceMethodBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder, this._extensionTearOff)
       : assert(descriptor.kind == ExtensionMemberKind.Method),
-        assert(!descriptor.isStatic),
-        super(procedure, descriptor, parent);
+        assert(!descriptor.isStatic);
 
   @override
   // Coverage-ignore(suite): Not run.
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 8ec3113..d21a93f 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
@@ -18,7 +18,7 @@
     extends ExtensionTypeDeclarationBuilderImpl
     with DillClassMemberAccessMixin, DillDeclarationBuilderMixin {
   @override
-  final DillLibraryBuilder parent;
+  final DillLibraryBuilder libraryBuilder;
 
   final ExtensionTypeDeclaration _extensionTypeDeclaration;
 
@@ -35,7 +35,7 @@
   TypeBuilder? _declaredRepresentationTypeBuilder;
 
   DillExtensionTypeDeclarationBuilder(
-      this._extensionTypeDeclaration, this.parent)
+      this._extensionTypeDeclaration, this.libraryBuilder)
       : _nameSpace = new DeclarationNameSpaceImpl() {
     _scope = new NameSpaceLookupScope(_nameSpace, ScopeKind.declaration,
         "extension type ${_extensionTypeDeclaration.name}",
@@ -52,20 +52,23 @@
               "$procedure (${procedure.kind}).");
         case ProcedureKind.Setter:
           // Coverage-ignore(suite): Not run.
-          nameSpace.addLocalMember(name, new DillSetterBuilder(procedure, this),
+          nameSpace.addLocalMember(
+              name, new DillSetterBuilder(procedure, libraryBuilder, this),
               setter: true);
           break;
         case ProcedureKind.Getter:
-          nameSpace.addLocalMember(name, new DillGetterBuilder(procedure, this),
+          nameSpace.addLocalMember(
+              name, new DillGetterBuilder(procedure, libraryBuilder, this),
               setter: false);
           break;
         case ProcedureKind.Operator:
           nameSpace.addLocalMember(
-              name, new DillOperatorBuilder(procedure, this),
+              name, new DillOperatorBuilder(procedure, libraryBuilder, this),
               setter: false);
           break;
         case ProcedureKind.Method:
-          nameSpace.addLocalMember(name, new DillMethodBuilder(procedure, this),
+          nameSpace.addLocalMember(
+              name, new DillMethodBuilder(procedure, libraryBuilder, this),
               setter: false);
           break;
       }
@@ -80,7 +83,7 @@
             nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionTypeStaticMethodBuilder(
-                    procedure, descriptor, this),
+                    procedure, descriptor, libraryBuilder, this),
                 setter: false);
           } else {
             Procedure procedure = descriptor.memberReference.asProcedure;
@@ -89,32 +92,40 @@
             nameSpace.addLocalMember(
                 name.text,
                 new DillExtensionTypeInstanceMethodBuilder(
-                    procedure, descriptor, this, tearOff!),
+                    procedure, descriptor, libraryBuilder, this, tearOff!),
                 setter: false);
           }
           break;
         case ExtensionTypeMemberKind.Getter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionTypeGetterBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionTypeGetterBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: false);
           break;
         case ExtensionTypeMemberKind.Field:
           Field field = descriptor.memberReference.asField;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionTypeFieldBuilder(field, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionTypeFieldBuilder(
+                  field, descriptor, libraryBuilder, this),
               setter: false);
           break;
         case ExtensionTypeMemberKind.Setter:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionTypeSetterBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionTypeSetterBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: true);
           break;
         case ExtensionTypeMemberKind.Operator:
           Procedure procedure = descriptor.memberReference.asProcedure;
-          nameSpace.addLocalMember(name.text,
-              new DillExtensionTypeOperatorBuilder(procedure, descriptor, this),
+          nameSpace.addLocalMember(
+              name.text,
+              new DillExtensionTypeOperatorBuilder(
+                  procedure, descriptor, libraryBuilder, this),
               setter: false);
           break;
         case ExtensionTypeMemberKind.Constructor:
@@ -123,7 +134,7 @@
           nameSpace.addConstructor(
               name.text,
               new DillExtensionTypeConstructorBuilder(
-                  procedure, tearOff, descriptor, this));
+                  procedure, tearOff, descriptor, libraryBuilder, this));
           break;
         case ExtensionTypeMemberKind.Factory:
         case ExtensionTypeMemberKind.RedirectingFactory:
@@ -132,7 +143,7 @@
           nameSpace.addConstructor(
               name.text,
               new DillExtensionTypeFactoryBuilder(
-                  procedure, tearOff, descriptor, this));
+                  procedure, tearOff, descriptor, libraryBuilder, this));
           break;
       }
     }
@@ -150,7 +161,7 @@
   Uri get fileUri => _extensionTypeDeclaration.fileUri;
 
   @override
-  DillLibraryBuilder get libraryBuilder => parent;
+  DillLibraryBuilder get parent => libraryBuilder;
 
   @override
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/lib/src/dill/dill_extension_type_member_builder.dart b/pkg/front_end/lib/src/dill/dill_extension_type_member_builder.dart
index 8b1b1aa..3d3bab1 100644
--- a/pkg/front_end/lib/src/dill/dill_extension_type_member_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_extension_type_member_builder.dart
@@ -4,16 +4,15 @@
 
 import 'package:kernel/ast.dart';
 
-import '../builder/builder.dart';
 import '../builder/constructor_builder.dart';
+import 'dill_extension_type_declaration_builder.dart';
 import 'dill_member_builder.dart';
 
 abstract class DillExtensionTypeMemberBuilder extends DillMemberBuilder {
   final ExtensionTypeMemberDescriptor _descriptor;
 
-  DillExtensionTypeMemberBuilder(
-      Member member, this._descriptor, Builder parent)
-      : super(member, parent);
+  DillExtensionTypeMemberBuilder(this._descriptor, super.libraryBuilder,
+      DillExtensionTypeDeclarationBuilder super.declarationBuilder);
 
   @override
   bool get isStatic => _descriptor.isStatic;
@@ -88,9 +87,8 @@
 class DillExtensionTypeFieldBuilder extends DillExtensionTypeMemberBuilder {
   final Field field;
 
-  DillExtensionTypeFieldBuilder(
-      this.field, ExtensionTypeMemberDescriptor descriptor, Builder parent)
-      : super(field, descriptor, parent);
+  DillExtensionTypeFieldBuilder(this.field, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder);
 
   @override
   Member get member => field;
@@ -114,10 +112,9 @@
 class DillExtensionTypeSetterBuilder extends DillExtensionTypeMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionTypeSetterBuilder(
-      this.procedure, ExtensionTypeMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionTypeMemberKind.Setter),
-        super(procedure, descriptor, parent);
+  DillExtensionTypeSetterBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionTypeMemberKind.Setter);
 
   @override
   Member get member => procedure;
@@ -135,10 +132,9 @@
 class DillExtensionTypeGetterBuilder extends DillExtensionTypeMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionTypeGetterBuilder(
-      this.procedure, ExtensionTypeMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionTypeMemberKind.Getter),
-        super(procedure, descriptor, parent);
+  DillExtensionTypeGetterBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionTypeMemberKind.Getter);
 
   @override
   Member get member => procedure;
@@ -157,10 +153,9 @@
 class DillExtensionTypeOperatorBuilder extends DillExtensionTypeMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionTypeOperatorBuilder(
-      this.procedure, ExtensionTypeMemberDescriptor descriptor, Builder parent)
-      : assert(descriptor.kind == ExtensionTypeMemberKind.Operator),
-        super(procedure, descriptor, parent);
+  DillExtensionTypeOperatorBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
+      : assert(descriptor.kind == ExtensionTypeMemberKind.Operator);
 
   @override
   Member get member => procedure;
@@ -180,11 +175,10 @@
     extends DillExtensionTypeMemberBuilder {
   final Procedure procedure;
 
-  DillExtensionTypeStaticMethodBuilder(
-      this.procedure, ExtensionTypeMemberDescriptor descriptor, Builder parent)
+  DillExtensionTypeStaticMethodBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder)
       : assert(descriptor.kind == ExtensionTypeMemberKind.Method),
-        assert(descriptor.isStatic),
-        super(procedure, descriptor, parent);
+        assert(descriptor.isStatic);
 
   @override
   Member get member => procedure;
@@ -206,14 +200,10 @@
 
   final Procedure _extensionTearOff;
 
-  DillExtensionTypeInstanceMethodBuilder(
-      this.procedure,
-      ExtensionTypeMemberDescriptor descriptor,
-      Builder parent,
-      this._extensionTearOff)
+  DillExtensionTypeInstanceMethodBuilder(this.procedure, super.descriptor,
+      super.libraryBuilder, super.declarationBuilder, this._extensionTearOff)
       : assert(descriptor.kind == ExtensionTypeMemberKind.Method),
-        assert(!descriptor.isStatic),
-        super(procedure, descriptor, parent);
+        assert(!descriptor.isStatic);
 
   @override
   Member get member => procedure;
@@ -241,9 +231,9 @@
   DillExtensionTypeConstructorBuilder(
       this.constructor,
       this._constructorTearOff,
-      ExtensionTypeMemberDescriptor descriptor,
-      Builder parent)
-      : super(constructor, descriptor, parent);
+      super.descriptor,
+      super.libraryBuilder,
+      super.declarationBuilder);
 
   @override
   FunctionNode get function => constructor.function;
@@ -270,8 +260,7 @@
   final Procedure? _factoryTearOff;
 
   DillExtensionTypeFactoryBuilder(this._procedure, this._factoryTearOff,
-      ExtensionTypeMemberDescriptor descriptor, Builder parent)
-      : super(_procedure, descriptor, parent);
+      super.descriptor, super.libraryBuilder, super.declarationBuilder);
 
   @override
   Member get member => _procedure;
diff --git a/pkg/front_end/lib/src/dill/dill_member_builder.dart b/pkg/front_end/lib/src/dill/dill_member_builder.dart
index 838a6ab..07c999d 100644
--- a/pkg/front_end/lib/src/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/dill/dill_member_builder.dart
@@ -18,20 +18,37 @@
 
 import '../builder/builder.dart';
 import '../builder/constructor_builder.dart';
+import '../builder/declaration_builders.dart';
 import '../builder/field_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../kernel/hierarchy/class_member.dart';
 import '../kernel/hierarchy/members_builder.dart' show ClassMembersBuilder;
 import '../kernel/member_covariance.dart';
+import 'dill_class_builder.dart';
+import 'dill_library_builder.dart';
 
 abstract class DillMemberBuilder extends MemberBuilderImpl {
-  DillMemberBuilder(Member member, Builder parent)
-      : super(parent, member.fileUri, member.fileOffset);
+  @override
+  final DillLibraryBuilder libraryBuilder;
+
+  @override
+  final DeclarationBuilder? declarationBuilder;
+
+  DillMemberBuilder(this.libraryBuilder, this.declarationBuilder);
 
   Member get member;
 
   @override
+  int get charOffset => member.fileOffset;
+
+  @override
+  Uri get fileUri => member.fileUri;
+
+  @override
+  Builder get parent => declarationBuilder ?? libraryBuilder;
+
+  @override
   Iterable<Member> get exportedMembers => [member];
 
   @override
@@ -114,7 +131,8 @@
   @override
   final Field field;
 
-  DillFieldBuilder(this.field, Builder parent) : super(field, parent);
+  DillFieldBuilder(this.field, super.libraryBuilder,
+      [super.declarationBuilder]);
 
   @override
   Member get member => field;
@@ -151,8 +169,8 @@
   @override
   final Procedure procedure;
 
-  DillProcedureBuilder(this.procedure, Builder parent)
-      : super(procedure, parent);
+  DillProcedureBuilder(this.procedure, super.libraryBuilder,
+      [super.declarationBuilder]);
 
   @override
   ProcedureKind get kind => procedure.kind;
@@ -169,9 +187,9 @@
 }
 
 class DillGetterBuilder extends DillProcedureBuilder {
-  DillGetterBuilder(Procedure procedure, Builder parent)
-      : assert(procedure.kind == ProcedureKind.Getter),
-        super(procedure, parent);
+  DillGetterBuilder(super.procedure, super.libraryBuilder,
+      [super.declarationBuilder])
+      : assert(procedure.kind == ProcedureKind.Getter);
 
   @override
   Member get member => procedure;
@@ -188,9 +206,9 @@
 }
 
 class DillSetterBuilder extends DillProcedureBuilder {
-  DillSetterBuilder(Procedure procedure, Builder parent)
-      : assert(procedure.kind == ProcedureKind.Setter),
-        super(procedure, parent);
+  DillSetterBuilder(super.procedure, super.libraryBuilder,
+      [super.declarationBuilder])
+      : assert(procedure.kind == ProcedureKind.Setter);
 
   @override
   Member get member => procedure;
@@ -206,9 +224,9 @@
 }
 
 class DillMethodBuilder extends DillProcedureBuilder {
-  DillMethodBuilder(Procedure procedure, Builder parent)
-      : assert(procedure.kind == ProcedureKind.Method),
-        super(procedure, parent);
+  DillMethodBuilder(super.procedure, super.libraryBuilder,
+      [super.declarationBuilder])
+      : assert(procedure.kind == ProcedureKind.Method);
 
   @override
   Member get member => procedure;
@@ -224,9 +242,9 @@
 }
 
 class DillOperatorBuilder extends DillProcedureBuilder {
-  DillOperatorBuilder(Procedure procedure, Builder parent)
-      : assert(procedure.kind == ProcedureKind.Operator),
-        super(procedure, parent);
+  DillOperatorBuilder(super.procedure, super.libraryBuilder,
+      [super.declarationBuilder])
+      : assert(procedure.kind == ProcedureKind.Operator);
 
   @override
   Member get member => procedure;
@@ -247,8 +265,8 @@
 class DillFactoryBuilder extends DillProcedureBuilder {
   final Procedure? _factoryTearOff;
 
-  DillFactoryBuilder(Procedure procedure, this._factoryTearOff, Builder parent)
-      : super(procedure, parent);
+  DillFactoryBuilder(super.procedure, this._factoryTearOff,
+      super.libraryBuilder, DillClassBuilder super.declarationBuilder);
 
   @override
   Member get member => procedure;
@@ -269,9 +287,8 @@
   final Constructor constructor;
   final Procedure? _constructorTearOff;
 
-  DillConstructorBuilder(
-      this.constructor, this._constructorTearOff, Builder parent)
-      : super(constructor, parent);
+  DillConstructorBuilder(this.constructor, this._constructorTearOff,
+      super.libraryBuilder, ClassBuilder super.declarationBuilder);
 
   @override
   FunctionNode get function => constructor.function;
@@ -290,6 +307,7 @@
   Constructor get invokeTarget => constructor;
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool get isConst => constructor.isConst;
 }
 
diff --git a/pkg/front_end/lib/src/kernel/kernel_target.dart b/pkg/front_end/lib/src/kernel/kernel_target.dart
index 0bba11d..acf8007 100644
--- a/pkg/front_end/lib/src/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/kernel/kernel_target.dart
@@ -1269,7 +1269,7 @@
     }
     SyntheticSourceConstructorBuilder constructorBuilder =
         new SyntheticSourceConstructorBuilder(
-            classBuilder, constructor, constructorTearOff,
+            libraryBuilder, classBuilder, constructor, constructorTearOff,
             // We pass on the original constructor and the cloned function nodes
             // to ensure that the default values are computed and cloned for the
             // outline. It is needed to make the default values a part of the
@@ -1351,7 +1351,7 @@
       registerDelayedDefaultValueCloner(delayedDefaultValueCloner);
     }
     return new SyntheticSourceConstructorBuilder(
-        classBuilder, constructor, constructorTearOff);
+        libraryBuilder, classBuilder, constructor, constructorTearOff);
   }
 
   DartType makeConstructorReturnType(Class enclosingClass) {
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 82f7424..da5c2e5 100644
--- a/pkg/front_end/lib/src/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/source/source_constructor_builder.dart
@@ -30,7 +30,6 @@
 import '../builder/metadata_builder.dart';
 import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
-import '../dill/dill_member_builder.dart';
 import '../kernel/body_builder.dart' show BodyBuilder;
 import '../kernel/body_builder_context.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
@@ -80,12 +79,6 @@
     extends SourceFunctionBuilderImpl
     implements SourceConstructorBuilder, Inferable, ConstructorDeclaration {
   @override
-  final SourceLibraryBuilder libraryBuilder;
-
-  @override
-  final DeclarationBuilder declarationBuilder;
-
-  @override
   final OmittedTypeBuilder returnType;
 
   final int charOpenParenOffset;
@@ -101,15 +94,11 @@
       String name,
       List<NominalVariableBuilder>? typeVariables,
       List<FormalParameterBuilder>? formals,
-      this.libraryBuilder,
-      this.declarationBuilder,
-      Uri fileUri,
-      int charOffset,
       this.charOpenParenOffset,
       String? nativeMethodName,
       this.beginInitializers)
       : super(metadata, modifiers, name, typeVariables, formals,
-            declarationBuilder, fileUri, charOffset, nativeMethodName) {
+            nativeMethodName) {
     if (formals != null) {
       for (FormalParameterBuilder formal in formals) {
         if (formal.isInitializingFormal || formal.isSuperInitializingFormal) {
@@ -409,6 +398,18 @@
         "${name.isEmpty ? '' : '.$name'}";
   }
 
+  @override
+  final int charOffset;
+
+  @override
+  final Uri fileUri;
+
+  @override
+  final SourceLibraryBuilder libraryBuilder;
+
+  @override
+  final DeclarationBuilder declarationBuilder;
+
   DeclaredSourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       Modifiers modifiers,
@@ -416,11 +417,11 @@
       String name,
       List<NominalVariableBuilder>? typeVariables,
       this.formals,
-      SourceLibraryBuilder libraryBuilder,
-      DeclarationBuilder declarationBuilder,
-      Uri fileUri,
+      this.libraryBuilder,
+      this.declarationBuilder,
+      this.fileUri,
       int startCharOffset,
-      int charOffset,
+      this.charOffset,
       int charOpenParenOffset,
       int charEndOffset,
       Reference? constructorReference,
@@ -433,20 +434,8 @@
       : _hasSuperInitializingFormals =
             formals?.any((formal) => formal.isSuperInitializingFormal) ?? false,
         _memberName = nameScheme.getDeclaredName(name),
-        super(
-            metadata,
-            modifiers,
-            returnType,
-            name,
-            typeVariables,
-            formals,
-            libraryBuilder,
-            declarationBuilder,
-            fileUri,
-            charOffset,
-            charOpenParenOffset,
-            nativeMethodName,
-            beginInitializers) {
+        super(metadata, modifiers, returnType, name, typeVariables, formals,
+            charOpenParenOffset, nativeMethodName, beginInitializers) {
     _constructor = new Constructor(new FunctionNode(null),
         name: dummyName,
         fileUri: fileUri,
@@ -468,6 +457,9 @@
   }
 
   @override
+  Builder get parent => declarationBuilder;
+
+  @override
   // Coverage-ignore(suite): Not run.
   Name get memberName => _memberName.name;
 
@@ -1034,9 +1026,18 @@
   }
 }
 
-class SyntheticSourceConstructorBuilder extends DillConstructorBuilder
+class SyntheticSourceConstructorBuilder extends MemberBuilderImpl
     with SourceMemberBuilderMixin
     implements SourceConstructorBuilder {
+  @override
+  final SourceLibraryBuilder libraryBuilder;
+
+  @override
+  final SourceClassBuilder classBuilder;
+
+  final Constructor _constructor;
+  final Procedure? _constructorTearOff;
+
   /// The constructor from which this synthesized constructor is defined.
   ///
   /// This defines the parameter structure and the default values of this
@@ -1049,7 +1050,7 @@
   DelayedDefaultValueCloner? _delayedDefaultValueCloner;
   TypeDependency? _typeDependency;
 
-  SyntheticSourceConstructorBuilder(SourceClassBuilder parent,
+  SyntheticSourceConstructorBuilder(this.libraryBuilder, this.classBuilder,
       Constructor constructor, Procedure? constructorTearOff,
       {MemberBuilder? definingConstructor,
       DelayedDefaultValueCloner? delayedDefaultValueCloner,
@@ -1057,21 +1058,91 @@
       : _immediatelyDefiningConstructor = definingConstructor,
         _delayedDefaultValueCloner = delayedDefaultValueCloner,
         _typeDependency = typeDependency,
-        super(constructor, constructorTearOff, parent);
+        _constructor = constructor,
+        _constructorTearOff = constructorTearOff;
 
   @override
   // Coverage-ignore(suite): Not run.
-  SourceLibraryBuilder get libraryBuilder =>
-      super.libraryBuilder as SourceLibraryBuilder;
+  int get charOffset => _constructor.fileOffset;
 
   @override
   // Coverage-ignore(suite): Not run.
-  DeclarationBuilder get declarationBuilder => classBuilder!;
+  Uri get fileUri => _constructor.fileUri;
+
+  @override
+  Builder get parent => declarationBuilder;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Iterable<Member> get exportedMembers => [_constructor];
+
+  @override
+  String get name => _constructor.name.text;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Name get memberName => _constructor.name;
+
+  @override
+  bool get isConstructor => true;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  ProcedureKind? get kind => null;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isAbstract => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isExternal => _constructor.isExternal;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isSynthetic => _constructor.isSynthetic;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isAssignable => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  List<ClassMember> get localMembers =>
+      throw new UnsupportedError('${runtimeType}.localMembers');
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  List<ClassMember> get localSetters =>
+      throw new UnsupportedError('${runtimeType}.localSetters');
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Iterable<Annotatable> get annotatables => [_constructor];
+
+  @override
+  FunctionNode get function => _constructor.function;
+
+  @override
+  Member get readTarget => _constructorTearOff ?? _constructor;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Member? get writeTarget => null;
+
+  @override
+  Constructor get invokeTarget => _constructor;
+
+  @override
+  bool get isConst => _constructor.isConst;
+
+  @override
+  DeclarationBuilder get declarationBuilder => classBuilder;
 
   @override
   // Coverage-ignore(suite): Not run.
   bool get isRedirecting {
-    for (Initializer initializer in constructor.initializers) {
+    for (Initializer initializer in _constructor.initializers) {
       if (initializer is RedirectingInitializer) {
         return true;
       }
@@ -1140,6 +1211,12 @@
 
 class SourceExtensionTypeConstructorBuilder
     extends AbstractSourceConstructorBuilder {
+  @override
+  final SourceLibraryBuilder libraryBuilder;
+
+  @override
+  final SourceExtensionTypeDeclarationBuilder declarationBuilder;
+
   late final Procedure _constructor;
 
   @override
@@ -1154,6 +1231,12 @@
 
   DelayedDefaultValueCloner? _delayedDefaultValueCloner;
 
+  @override
+  final int charOffset;
+
+  @override
+  final Uri fileUri;
+
   SourceExtensionTypeConstructorBuilder(
       List<MetadataBuilder>? metadata,
       Modifiers modifiers,
@@ -1161,11 +1244,11 @@
       String name,
       List<NominalVariableBuilder>? typeVariables,
       List<FormalParameterBuilder>? formals,
-      SourceLibraryBuilder libraryBuilder,
-      SourceExtensionTypeDeclarationBuilder declarationBuilder,
-      Uri fileUri,
+      this.libraryBuilder,
+      this.declarationBuilder,
+      this.fileUri,
       int startCharOffset,
-      int charOffset,
+      this.charOffset,
       int charOpenParenOffset,
       int charEndOffset,
       Reference? constructorReference,
@@ -1175,20 +1258,8 @@
       required bool forAbstractClassOrEnumOrMixin,
       required Token? beginInitializers})
       : _memberName = nameScheme.getDeclaredName(name),
-        super(
-            metadata,
-            modifiers,
-            returnType,
-            name,
-            typeVariables,
-            formals,
-            libraryBuilder,
-            declarationBuilder,
-            fileUri,
-            charOffset,
-            charOpenParenOffset,
-            nativeMethodName,
-            beginInitializers) {
+        super(metadata, modifiers, returnType, name, typeVariables, formals,
+            charOpenParenOffset, nativeMethodName, beginInitializers) {
     _constructor = new Procedure(
         dummyName, ProcedureKind.Method, new FunctionNode(null),
         fileUri: fileUri, reference: constructorReference)
@@ -1209,6 +1280,9 @@
   }
 
   @override
+  Builder get parent => declarationBuilder;
+
+  @override
   // Coverage-ignore(suite): Not run.
   Name get memberName => _memberName.name;
 
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart
index 81d48cc..0a29f4d 100644
--- a/pkg/front_end/lib/src/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -331,12 +331,10 @@
       customValuesDeclaration.next = valuesBuilder;
       nameSpaceBuilder.checkTypeVariableConflict(libraryBuilder,
           valuesBuilder.name, valuesBuilder, valuesBuilder.fileUri);
-      valuesBuilder.parent = this;
     } else {
       nameSpace.addLocalMember("values", valuesBuilder, setter: false);
       nameSpaceBuilder.checkTypeVariableConflict(libraryBuilder,
           valuesBuilder.name, valuesBuilder, valuesBuilder.fileUri);
-      valuesBuilder.parent = this;
     }
 
     // The default constructor is added if no generative or unnamed factory
@@ -388,7 +386,6 @@
           synthesizedDefaultConstructorBuilder!.name,
           synthesizedDefaultConstructorBuilder!,
           synthesizedDefaultConstructorBuilder!.fileUri);
-      synthesizedDefaultConstructorBuilder!.parent = this;
     }
 
     ProcedureBuilder toStringBuilder = new SourceProcedureBuilder(
@@ -501,7 +498,6 @@
             setter: false);
         nameSpaceBuilder.checkTypeVariableConflict(libraryBuilder,
             fieldBuilder.name, fieldBuilder, fieldBuilder.fileUri);
-        fieldBuilder.parent = this;
         elementBuilders.add(fieldBuilder);
       }
     }
diff --git a/pkg/front_end/lib/src/source/source_factory_builder.dart b/pkg/front_end/lib/src/source/source_factory_builder.dart
index 19ade46..cdd8522 100644
--- a/pkg/front_end/lib/src/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/source/source_factory_builder.dart
@@ -49,6 +49,9 @@
   @override
   final SourceLibraryBuilder libraryBuilder;
 
+  @override
+  final DeclarationBuilder declarationBuilder;
+
   final int charOpenParenOffset;
 
   AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
@@ -70,6 +73,12 @@
 
   DelayedDefaultValueCloner? _delayedDefaultValueCloner;
 
+  @override
+  final int charOffset;
+
+  @override
+  final Uri fileUri;
+
   SourceFactoryBuilder(
       List<MetadataBuilder>? metadata,
       Modifiers modifiers,
@@ -78,10 +87,10 @@
       List<NominalVariableBuilder>? typeVariables,
       List<FormalParameterBuilder>? formals,
       this.libraryBuilder,
-      DeclarationBuilder declarationBuilder,
-      Uri fileUri,
+      this.declarationBuilder,
+      this.fileUri,
       int startCharOffset,
-      int charOffset,
+      this.charOffset,
       this.charOpenParenOffset,
       int charEndOffset,
       Reference? procedureReference,
@@ -91,7 +100,7 @@
       {String? nativeMethodName})
       : _memberName = nameScheme.getDeclaredName(name),
         super(metadata, modifiers, name, typeVariables, formals,
-            declarationBuilder, fileUri, charOffset, nativeMethodName) {
+            nativeMethodName) {
     _procedureInternal = new Procedure(
         dummyName,
         nameScheme.isExtensionTypeMember
@@ -119,11 +128,11 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  Name get memberName => _memberName.name;
+  Builder get parent => declarationBuilder;
 
   @override
-  DeclarationBuilder get declarationBuilder => super.declarationBuilder!;
+  // Coverage-ignore(suite): Not run.
+  Name get memberName => _memberName.name;
 
   // Coverage-ignore(suite): Not run.
   List<SourceFactoryBuilder>? get augmentationsForTesting => _augmentations;
diff --git a/pkg/front_end/lib/src/source/source_field_builder.dart b/pkg/front_end/lib/src/source/source_field_builder.dart
index 3ecc32a..e36621b 100644
--- a/pkg/front_end/lib/src/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/source/source_field_builder.dart
@@ -16,6 +16,7 @@
 import '../base/modifiers.dart' show Modifiers;
 import '../base/problems.dart' show internalProblem;
 import '../base/scope.dart' show LookupScope;
+import '../builder/builder.dart';
 import '../builder/declaration_builders.dart';
 import '../builder/field_builder.dart';
 import '../builder/member_builder.dart';
@@ -81,6 +82,15 @@
   /// element.
   final bool isEnumElement;
 
+  @override
+  final DeclarationBuilder? declarationBuilder;
+
+  @override
+  final int charOffset;
+
+  @override
+  final Uri fileUri;
+
   SourceFieldBuilder(
       this.metadata,
       this.type,
@@ -88,9 +98,9 @@
       this.modifiers,
       this.isTopLevel,
       this.libraryBuilder,
-      DeclarationBuilder? declarationBuilder,
-      Uri fileUri,
-      int charOffset,
+      this.declarationBuilder,
+      this.fileUri,
+      this.charOffset,
       int charEndOffset,
       NameScheme fieldNameScheme,
       {Reference? fieldReference,
@@ -106,8 +116,7 @@
       this.isSynthesized = false,
       this.isEnumElement = false})
       : _constInitializerToken = constInitializerToken,
-        _memberName = fieldNameScheme.getDeclaredName(name),
-        super(declarationBuilder ?? libraryBuilder, fileUri, charOffset) {
+        _memberName = fieldNameScheme.getDeclaredName(name) {
     type.registerInferredTypeListener(this);
 
     bool isInstanceMember = fieldNameScheme.isInstanceMember;
@@ -308,6 +317,9 @@
   }
 
   @override
+  Builder get parent => declarationBuilder ?? libraryBuilder;
+
+  @override
   Name get memberName => _memberName.name;
 
   bool _typeEnsured = false;
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 09dd1bd..51065ea 100644
--- a/pkg/front_end/lib/src/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/source/source_function_builder.dart
@@ -148,17 +148,8 @@
   /// from the extension/extension type declaration.
   List<TypeParameter>? _thisTypeParameters;
 
-  SourceFunctionBuilderImpl(
-      this.metadata,
-      this.modifiers,
-      this.name,
-      this.typeVariables,
-      this.formals,
-      Builder parent,
-      Uri fileUri,
-      int charOffset,
-      this.nativeMethodName)
-      : super(parent, fileUri, charOffset) {
+  SourceFunctionBuilderImpl(this.metadata, this.modifiers, this.name,
+      this.typeVariables, this.formals, this.nativeMethodName) {
     returnType.registerInferredTypeListener(this);
     if (formals != null) {
       for (int i = 0; i < formals!.length; i++) {
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index ce1a435..0d339cd 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -1317,14 +1317,14 @@
         // support members from source, so we provide an empty [DeclarationMap].
         new OffsetMap(libraryBuilder.fileUri));
 
-    Builder parent = libraryBuilder;
+    DeclarationBuilder? declarationBuilder;
     if (enclosingClassOrExtension != null) {
       Builder? builder = dietListener.memberScope
           .lookupGetable(enclosingClassOrExtension, -1, libraryBuilder.fileUri);
       if (builder is TypeDeclarationBuilder) {
         switch (builder) {
           case ClassBuilder():
-            parent = builder;
+            declarationBuilder = builder;
             dietListener
               ..currentDeclaration = builder
               ..memberScope = new NameSpaceLookupScope(
@@ -1334,7 +1334,7 @@
                   parent: TypeParameterScope.fromList(
                       dietListener.memberScope, builder.typeVariables));
           case ExtensionBuilder():
-            parent = builder;
+            declarationBuilder = builder;
             dietListener
               ..currentDeclaration = builder
               ..memberScope = new NameSpaceLookupScope(
@@ -1364,7 +1364,7 @@
         /* formals = */ null,
         ProcedureKind.Method,
         libraryBuilder,
-        null,
+        declarationBuilder,
         libraryBuilder.fileUri,
         /* start char offset = */ 0,
         /* char offset = */ 0,
@@ -1377,8 +1377,7 @@
             containerName: null,
             containerType: ContainerType.Library,
             isInstanceMember: false,
-            libraryName: libraryBuilder.libraryName))
-      ..parent = parent;
+            libraryName: libraryBuilder.libraryName));
     BodyBuilder listener = dietListener.createListener(
         new ExpressionCompilerProcedureBodyBuildContext(
             dietListener, builder, builder.invokeTarget!,
diff --git a/pkg/front_end/lib/src/source/source_member_builder.dart b/pkg/front_end/lib/src/source/source_member_builder.dart
index d9802ff..707ff32 100644
--- a/pkg/front_end/lib/src/source/source_member_builder.dart
+++ b/pkg/front_end/lib/src/source/source_member_builder.dart
@@ -11,8 +11,6 @@
 import '../base/common.dart';
 import '../base/modifiers.dart';
 import '../base/problems.dart' show unsupported;
-import '../builder/builder.dart';
-import '../builder/declaration_builders.dart';
 import '../builder/member_builder.dart';
 import '../kernel/body_builder_context.dart';
 import '../kernel/kernel_helper.dart';
@@ -115,13 +113,12 @@
   @override
   MemberDataForTesting? dataForTesting;
 
-  SourceMemberBuilderImpl(Builder parent, Uri fileUri, int charOffset)
+  SourceMemberBuilderImpl()
       : dataForTesting = retainDataForTesting
             ?
             // Coverage-ignore(suite): Not run.
             new MemberDataForTesting()
-            : null,
-        super(parent, fileUri, charOffset);
+            : null;
 
   Modifiers get modifiers;
 
@@ -200,11 +197,6 @@
     return sb.toString();
   }
 
-  /// The builder for the enclosing class or extension, if any.
-  @override
-  DeclarationBuilder? get declarationBuilder =>
-      parent is DeclarationBuilder ? parent as DeclarationBuilder : null;
-
   @override
   AugmentSuperTarget? get augmentSuperTarget {
     throw new UnimplementedError('$runtimeType.augmentSuperTarget}');
diff --git a/pkg/front_end/lib/src/source/source_procedure_builder.dart b/pkg/front_end/lib/src/source/source_procedure_builder.dart
index b8f2879..6c1ce14 100644
--- a/pkg/front_end/lib/src/source/source_procedure_builder.dart
+++ b/pkg/front_end/lib/src/source/source_procedure_builder.dart
@@ -35,6 +35,9 @@
   @override
   final SourceLibraryBuilder libraryBuilder;
 
+  @override
+  final DeclarationBuilder? declarationBuilder;
+
   final int charOpenParenOffset;
 
   AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
@@ -80,6 +83,12 @@
 
   final MemberName _memberName;
 
+  @override
+  final int charOffset;
+
+  @override
+  final Uri fileUri;
+
   SourceProcedureBuilder(
       List<MetadataBuilder>? metadata,
       Modifiers modifiers,
@@ -89,10 +98,10 @@
       List<FormalParameterBuilder>? formals,
       this.kind,
       this.libraryBuilder,
-      DeclarationBuilder? declarationBuilder,
-      Uri fileUri,
+      this.declarationBuilder,
+      this.fileUri,
       int startCharOffset,
-      int charOffset,
+      this.charOffset,
       this.charOpenParenOffset,
       int charEndOffset,
       Reference? procedureReference,
@@ -107,15 +116,7 @@
         this.isExtensionTypeInstanceMember =
             nameScheme.isInstanceMember && nameScheme.isExtensionTypeMember,
         _memberName = nameScheme.getDeclaredName(name),
-        super(
-            metadata,
-            modifiers,
-            name,
-            typeVariables,
-            formals,
-            declarationBuilder ?? libraryBuilder,
-            fileUri,
-            charOffset,
+        super(metadata, modifiers, name, typeVariables, formals,
             nativeMethodName) {
     _procedure = new Procedure(
         dummyName,
@@ -147,6 +148,9 @@
   }
 
   @override
+  Builder get parent => declarationBuilder ?? libraryBuilder;
+
+  @override
   Name get memberName => _memberName.name;
 
   // Coverage-ignore(suite): Not run.
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index 983a61367c..4bdcd96 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -325,7 +325,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/member_builder.dart": (
-    hitCount: 128,
+    hitCount: 118,
     missCount: 0,
   ),
   // 100.0%.
@@ -425,27 +425,27 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_class_builder.dart": (
-    hitCount: 181,
+    hitCount: 188,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_builder.dart": (
-    hitCount: 91,
+    hitCount: 99,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_member_builder.dart": (
-    hitCount: 73,
+    hitCount: 66,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_type_declaration_builder.dart": (
-    hitCount: 158,
+    hitCount: 169,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_extension_type_member_builder.dart": (
-    hitCount: 131,
+    hitCount: 122,
     missCount: 0,
   ),
   // 100.0%.
@@ -460,7 +460,7 @@
   ),
   // 100.0%.
   "package:front_end/src/dill/dill_member_builder.dart": (
-    hitCount: 198,
+    hitCount: 193,
     missCount: 0,
   ),
   // 100.0%.
@@ -820,12 +820,12 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_constructor_builder.dart": (
-    hitCount: 856,
+    hitCount: 889,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_enum_builder.dart": (
-    hitCount: 522,
+    hitCount: 517,
     missCount: 0,
   ),
   // 100.0%.
@@ -841,17 +841,17 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_factory_builder.dart": (
-    hitCount: 582,
+    hitCount: 586,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_field_builder.dart": (
-    hitCount: 1189,
+    hitCount: 1209,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_function_builder.dart": (
-    hitCount: 303,
+    hitCount: 302,
     missCount: 0,
   ),
   // 100.0%.
@@ -866,12 +866,12 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_member_builder.dart": (
-    hitCount: 40,
+    hitCount: 35,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_procedure_builder.dart": (
-    hitCount: 518,
+    hitCount: 524,
     missCount: 0,
   ),
   // 100.0%.