diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 77326fb..a3ae779 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -365,6 +365,8 @@
   CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY,
   CompileTimeErrorCode.PART_OF_NON_PART,
   CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY,
+  CompileTimeErrorCode
+      .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
   CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
   CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
   CompileTimeErrorCode.PREFIX_SHADOWED_BY_LOCAL_DECLARATION,
@@ -403,6 +405,8 @@
   CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
   CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
+  CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+  CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
   CompileTimeErrorCode.SUPER_IN_EXTENSION,
   CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
   CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0a2341a..eabe7ee 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -5482,14 +5482,17 @@
       if (superConstructor != null) {
         var superParameters = superConstructor.parameters;
         if (isNamed) {
-          return superParameters.firstWhereOrNull((e) => e.name == name);
+          return superParameters
+              .firstWhereOrNull((e) => e.isNamed && e.name == name);
         } else {
+          var positionalSuperParameters =
+              superParameters.where((e) => e.isPositional).toList();
           var index = enclosingElement.parameters
               .whereType<SuperFormalParameterElementImpl>()
               .toList()
               .indexOf(this);
-          if (index >= 0 && index < superParameters.length) {
-            return superParameters[index];
+          if (index >= 0 && index < positionalSuperParameters.length) {
+            return positionalSuperParameters[index];
           }
         }
       }
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 0f00d43..5f42ff2 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -11628,6 +11628,20 @@
   );
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode
+      POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT =
+      CompileTimeErrorCode(
+    'POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT',
+    "Positional super-formal parameters can't be used when the "
+        "super-constructor invocation has a positional argument.",
+    correctionMessage:
+        "Try removing the 'super' modifier, or changing the super-constructor "
+        "to use named parameters.",
+  );
+
+  /**
    * Parameters:
    * 0: the name of the prefix
    */
@@ -13078,6 +13092,30 @@
   );
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode
+      SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED = CompileTimeErrorCode(
+    'SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED',
+    "No associated named super-constructor parameter.",
+    correctionMessage: "Try changing the name to the name of an existing named "
+        "super-constructor parameter, or creating such named parameter.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode
+      SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL =
+      CompileTimeErrorCode(
+    'SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL',
+    "No associated positional super-constructor parameter.",
+    correctionMessage:
+        "Try using named parameters instead, or adding more positional "
+        "parameters to the super-constructor.",
+  );
+
+  /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
    * is a compile-time error if a generative constructor of class Object
    * includes a superinitializer.
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index c430007..344c5e7 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -406,7 +406,11 @@
       return;
     }
     var argumentList = node.argumentList;
-    var parameters = _resolveArgumentsToFunction(argumentList, element);
+    var parameters = _resolveArgumentsToFunction(
+      argumentList,
+      element,
+      enclosingConstructor: node.thisOrAncestorOfType<ConstructorDeclaration>(),
+    );
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -446,12 +450,19 @@
   /// cannot be matched to a parameter. Return the parameters that correspond to
   /// the arguments, or `null` if no correspondence could be computed.
   List<ParameterElement?>? _resolveArgumentsToFunction(
-      ArgumentList argumentList, ExecutableElement? executableElement) {
+    ArgumentList argumentList,
+    ExecutableElement? executableElement, {
+    ConstructorDeclaration? enclosingConstructor,
+  }) {
     if (executableElement == null) {
       return null;
     }
     List<ParameterElement> parameters = executableElement.parameters;
-    return _resolveArgumentsToParameters(argumentList, parameters);
+    return _resolveArgumentsToParameters(
+      argumentList,
+      parameters,
+      enclosingConstructor: enclosingConstructor,
+    );
   }
 
   /// Given an [argumentList] and the [parameters] related to the element that
@@ -460,9 +471,16 @@
   /// the arguments cannot be matched to a parameter. Return the parameters that
   /// correspond to the arguments.
   List<ParameterElement?> _resolveArgumentsToParameters(
-      ArgumentList argumentList, List<ParameterElement> parameters) {
+    ArgumentList argumentList,
+    List<ParameterElement> parameters, {
+    ConstructorDeclaration? enclosingConstructor,
+  }) {
     return ResolverVisitor.resolveArgumentsToParameters(
-        argumentList, parameters, _errorReporter.reportErrorForNode);
+      argumentList,
+      parameters,
+      _errorReporter.reportErrorForNode,
+      enclosingConstructor: enclosingConstructor,
+    );
   }
 
   /// Resolve the names in the given [combinators] in the scope of the given
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ddcbc07..ad495d9 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2331,11 +2331,12 @@
   /// Returns the parameters that correspond to the arguments. If no parameter
   /// matched an argument, that position will be `null` in the list.
   static List<ParameterElement?> resolveArgumentsToParameters(
-      ArgumentList argumentList,
-      List<ParameterElement> parameters,
-      void Function(ErrorCode errorCode, AstNode node,
-              [List<Object> arguments])?
-          onError) {
+    ArgumentList argumentList,
+    List<ParameterElement> parameters,
+    void Function(ErrorCode errorCode, AstNode node, [List<Object> arguments])?
+        onError, {
+    ConstructorDeclaration? enclosingConstructor,
+  }) {
     if (parameters.isEmpty && argumentList.arguments.isEmpty) {
       return const <ParameterElement>[];
     }
@@ -2401,6 +2402,45 @@
         }
       }
     }
+
+    if (enclosingConstructor != null) {
+      var hasExplicitPositionalArguments = positionalArgumentCount != 0;
+      for (var formalParameter in enclosingConstructor.parameters.parameters) {
+        formalParameter = formalParameter.notDefault;
+        if (formalParameter is SuperFormalParameter) {
+          var element = formalParameter.declaredElement
+              as SuperFormalParameterElementImpl;
+          if (formalParameter.isNamed) {
+            if (onError != null && element.superConstructorParameter == null) {
+              onError(
+                CompileTimeErrorCode
+                    .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+                formalParameter.identifier,
+              );
+            }
+          } else {
+            positionalArgumentCount++;
+            if (onError != null) {
+              if (hasExplicitPositionalArguments) {
+                onError(
+                  CompileTimeErrorCode
+                      .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
+                  formalParameter.identifier,
+                );
+              }
+              if (element.superConstructorParameter == null) {
+                onError(
+                  CompileTimeErrorCode
+                      .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+                  formalParameter.identifier,
+                );
+              }
+            }
+          }
+        }
+      }
+    }
+
     if (positionalArgumentCount < requiredParameterCount && noBlankArguments) {
       if (onError != null) {
         onError(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS,
@@ -2417,8 +2457,8 @@
       } else {
         errorCode = CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS;
       }
-      if (onError != null) {
-        onError(errorCode, firstUnresolvedArgument!,
+      if (onError != null && firstUnresolvedArgument != null) {
+        onError(errorCode, firstUnresolvedArgument,
             [unnamedParameterCount, positionalArgumentCount]);
       }
     }
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index fc0b1e9..0f6e2fe 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -9866,6 +9866,10 @@
       ```dart
       part of 'test.dart';
       ```
+  POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT:
+    problemMessage: Positional super-formal parameters can't be used when the super-constructor invocation has a positional argument.
+    comment: No parameters.
+    correctionMessage: Try removing the 'super' modifier, or changing the super-constructor to use named parameters.
   PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER:
     problemMessage: "The name '{0}' is already used as an import prefix and can't be used to name a top-level element."
     correctionMessage: Try renaming either the top-level element or the prefix.
@@ -11098,6 +11102,14 @@
 
       int f(C c) => c.b;
       ```
+  SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED:
+    problemMessage: No associated named super-constructor parameter.
+    comment: No parameters.
+    correctionMessage: Try changing the name to the name of an existing named super-constructor parameter, or creating such named parameter.
+  SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL:
+    problemMessage: No associated positional super-constructor parameter.
+    comment: No parameters.
+    correctionMessage: Try using named parameters instead, or adding more positional parameters to the super-constructor.
   IMPLEMENTS_DEFERRED_CLASS:
     sharedName: SUBTYPE_OF_DEFERRED_CLASS
     problemMessage: "Classes and mixins can't implement deferred classes."
diff --git a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
index e8e1418..dcb8a8f 100644
--- a/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_enough_positional_arguments_test.dart
@@ -86,4 +86,28 @@
       error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 65, 2),
     ]);
   }
+
+  test_superParameter_optional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int? a);
+}
+
+class B extends A {
+  B([super.a]) : super();
+}
+''');
+  }
+
+  test_superParameter_required() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(super.a) : super();
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/positional_super_formal_parameter_with_positional_argument_test.dart b/pkg/analyzer/test/src/diagnostics/positional_super_formal_parameter_with_positional_argument_test.dart
new file mode 100644
index 0000000..ddde7c2
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/positional_super_formal_parameter_with_positional_argument_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(
+        PositionalSuperFormalParameterWithPositionalArgumentTest);
+  });
+}
+
+@reflectiveTest
+class PositionalSuperFormalParameterWithPositionalArgumentTest
+    extends PubPackageResolutionTest {
+  test_notReported() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(super.a) : super();
+}
+''');
+  }
+
+  test_reported() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(int a, int b);
+}
+
+class B extends A {
+  B(super.b) : super(0);
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT,
+          62,
+          1)
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart
new file mode 100644
index 0000000..049858a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_named_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperFormalParameterWithoutAssociatedNamedTest);
+  });
+}
+
+@reflectiveTest
+class SuperFormalParameterWithoutAssociatedNamedTest
+    extends PubPackageResolutionTest {
+  test_optional() async {
+    await assertErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+
+class B extends A {
+  B({super.a}) : super();
+}
+''', [
+      error(
+          CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+          59,
+          1)
+    ]);
+  }
+
+  test_required() async {
+    await assertErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+
+class B extends A {
+  B({required super.a}) : super();
+}
+''', [
+      error(
+          CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED,
+          68,
+          1)
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart
new file mode 100644
index 0000000..47d5cde
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/super_formal_parameter_without_associated_positional_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperFormalParameterWithoutAssociatedPositionalTest);
+  });
+}
+
+@reflectiveTest
+class SuperFormalParameterWithoutAssociatedPositionalTest
+    extends PubPackageResolutionTest {
+  test_optional() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+
+class B extends A {
+  B([super.a]) : super();
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+          59,
+          1)
+    ]);
+  }
+
+  test_required() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+
+class B extends A {
+  B(super.a) : super();
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL,
+          58,
+          1)
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 8bed89d..445a54b 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -546,6 +546,8 @@
 import 'packed_nesting_non_packed_test.dart' as packed_nesting_non_packed;
 import 'part_of_different_library_test.dart' as part_of_different_library;
 import 'part_of_non_part_test.dart' as part_of_non_part;
+import 'positional_super_formal_parameter_with_positional_argument_test.dart'
+    as positional_super_formal_parameter_with_positional_argument;
 import 'prefix_collides_with_top_level_member_test.dart'
     as prefix_collides_with_top_level_member;
 import 'prefix_identifier_not_followed_by_dot_test.dart'
@@ -626,6 +628,10 @@
 import 'subtype_of_ffi_class_test.dart' as subtype_of_ffi_class;
 import 'subtype_of_sealed_class_test.dart' as subtype_of_sealed_class;
 import 'subtype_of_struct_class_test.dart' as subtype_of_struct_class;
+import 'super_formal_parameter_without_associated_named_test.dart'
+    as super_formal_parameter_without_associated_named;
+import 'super_formal_parameter_without_associated_positional_test.dart'
+    as super_formal_parameter_without_associated_positional;
 import 'super_in_extension_test.dart' as super_in_extension;
 import 'super_in_invalid_context_test.dart' as super_in_invalid_context;
 import 'super_in_redirecting_constructor_test.dart'
@@ -1089,6 +1095,7 @@
     packed_nesting_non_packed.main();
     part_of_different_library.main();
     part_of_non_part.main();
+    positional_super_formal_parameter_with_positional_argument.main();
     prefix_collides_with_top_level_member.main();
     prefix_identifier_not_followed_by_dot.main();
     prefix_shadowed_by_local_declaration.main();
@@ -1139,6 +1146,8 @@
     subtype_of_ffi_class.main();
     subtype_of_sealed_class.main();
     subtype_of_struct_class.main();
+    super_formal_parameter_without_associated_named.main();
+    super_formal_parameter_without_associated_positional.main();
     super_in_extension.main();
     super_in_invalid_context.main();
     super_in_redirecting_constructor.main();
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 9ab1bc5..b5fdd89 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -1615,6 +1615,38 @@
 ''');
   }
 
+  test_class_constructor_parameters_super_optionalNamed_unresolved2() async {
+    var library = await checkLibrary('''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B({super.a});
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @18
+                type: int
+      class B @31
+        supertype: A
+        constructors
+          @47
+            parameters
+              optionalNamed final super.a @56
+                type: dynamic
+                superConstructorParameter: <null>
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_parameters_super_optionalPositional() async {
     var library = await checkLibrary('''
 class A {
@@ -1770,6 +1802,38 @@
 ''');
   }
 
+  test_class_constructor_parameters_super_requiredPositional_unresolved2() async {
+    var library = await checkLibrary('''
+class A {
+  A({required int a})
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredNamed a @28
+                type: int
+      class B @41
+        supertype: A
+        constructors
+          @57
+            parameters
+              requiredPositional final super.a @65
+                type: dynamic
+                superConstructorParameter: <null>
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_params() async {
     var library = await checkLibrary('class C { C(x, int y); }');
     checkElementText(library, r'''
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 69e68ff..47a66ca 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -449,11 +449,12 @@
 
   @override
   void forEachDeclaredConstructor(
-      void Function(String name, SourceConstructorBuilder constructorBuilder)
+      void Function(
+              String name, DeclaredSourceConstructorBuilder constructorBuilder)
           callback) {
     Set<String> visitedConstructorNames = {};
     void callbackFilteringFieldBuilders(String name, Builder builder) {
-      if (builder is SourceConstructorBuilder &&
+      if (builder is DeclaredSourceConstructorBuilder &&
           visitedConstructorNames.add(builder.name)) {
         callback(name, builder);
       }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 18d8b6d..42d99a3 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -5,9 +5,10 @@
 library fasta.dill_member_builder;
 
 import 'package:kernel/ast.dart'
-    show Constructor, Field, Member, Procedure, ProcedureKind;
+    show Constructor, Field, FunctionNode, Member, Procedure, ProcedureKind;
 
 import '../builder/builder.dart';
+import '../builder/constructor_builder.dart';
 import '../builder/member_builder.dart';
 
 import '../kernel/hierarchy/class_member.dart' show ClassMember;
@@ -223,7 +224,9 @@
   Member get invokeTarget => procedure;
 }
 
-class DillConstructorBuilder extends DillMemberBuilder {
+class DillConstructorBuilder extends DillMemberBuilder
+    implements ConstructorBuilder {
+  @override
   final Constructor constructor;
   final Procedure? _constructorTearOff;
 
@@ -232,6 +235,9 @@
       : super(constructor, parent);
 
   @override
+  FunctionNode get function => constructor.function;
+
+  @override
   Constructor get member => constructor;
 
   @override
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 509bb49..7a00b4e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -922,7 +922,7 @@
   void prepareInitializers() {
     SourceFunctionBuilder member = this.member as SourceFunctionBuilder;
     scope = member.computeFormalParameterInitializerScope(scope);
-    if (member is SourceConstructorBuilder) {
+    if (member is DeclaredSourceConstructorBuilder) {
       member.prepareInitializers();
       if (member.formals != null) {
         for (FormalParameterBuilder formal in member.formals!) {
@@ -1106,7 +1106,7 @@
         }
       }
     }
-    if (builder is SourceConstructorBuilder) {
+    if (builder is DeclaredSourceConstructorBuilder) {
       finishConstructor(builder, asyncModifier, body);
     } else if (builder is SourceProcedureBuilder) {
       builder.asyncModifier = asyncModifier;
@@ -1614,7 +1614,7 @@
     }
     if (doFinishConstructor) {
       finishConstructor(
-          member as SourceConstructorBuilder, AsyncMarker.Sync, null);
+          member as DeclaredSourceConstructorBuilder, AsyncMarker.Sync, null);
     }
   }
 
@@ -1654,7 +1654,7 @@
     return arguments;
   }
 
-  void finishConstructor(SourceConstructorBuilder builder,
+  void finishConstructor(DeclaredSourceConstructorBuilder builder,
       AsyncMarker asyncModifier, Statement? body) {
     /// Quotes below are from [Dart Programming Language Specification, 4th
     /// Edition](
@@ -1773,7 +1773,7 @@
         positionalArguments = positionalSuperParametersAsArguments;
         namedArguments = namedSuperParametersAsArguments;
       }
-      if (classBuilder is EnumBuilder) {
+      if (classBuilder is SourceEnumBuilder) {
         assert(constructor.function.positionalParameters.length >= 2 &&
             constructor.function.positionalParameters[0].name == "index" &&
             constructor.function.positionalParameters[1].name == "name");
@@ -5315,7 +5315,7 @@
       }
     }
     if (type is ClassBuilder) {
-      if (type is EnumBuilder) {
+      if (type is SourceEnumBuilder) {
         return buildProblem(fasta.messageEnumInstantiation,
             nameToken.charOffset, nameToken.length);
       }
@@ -6895,8 +6895,8 @@
                 ]);
           }
         }
-        SourceConstructorBuilder constructorBuilder =
-            member as SourceConstructorBuilder;
+        DeclaredSourceConstructorBuilder constructorBuilder =
+            member as DeclaredSourceConstructorBuilder;
         constructorBuilder.registerInitializedField(builder);
         return builder.buildInitializer(assignmentOffset, expression,
             isSynthetic: formal != null);
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 ad571bc..3504c3a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -781,7 +781,7 @@
     }
   }
 
-  SyntheticConstructorBuilder _makeMixinApplicationConstructor(
+  SyntheticSourceConstructorBuilder _makeMixinApplicationConstructor(
       SourceClassBuilder classBuilder,
       Class mixin,
       MemberBuilder superConstructorBuilder,
@@ -885,7 +885,7 @@
       buildConstructorTearOffProcedure(constructorTearOff, constructor,
           classBuilder.cls, classBuilder.library);
     }
-    return new SyntheticConstructorBuilder(
+    return new SyntheticSourceConstructorBuilder(
         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
@@ -910,7 +910,7 @@
     ticker.logMs("Cloned default values of formals");
   }
 
-  SyntheticConstructorBuilder _makeDefaultConstructor(
+  SyntheticSourceConstructorBuilder _makeDefaultConstructor(
       SourceClassBuilder classBuilder,
       Reference? constructorReference,
       Reference? tearOffReference) {
@@ -940,7 +940,7 @@
       buildConstructorTearOffProcedure(constructorTearOff, constructor,
           classBuilder.cls, classBuilder.library);
     }
-    return new SyntheticConstructorBuilder(
+    return new SyntheticSourceConstructorBuilder(
         classBuilder, constructor, constructorTearOff);
   }
 
@@ -1162,17 +1162,17 @@
     Set<FieldBuilder>? initializedFields = null;
 
     builder.forEachDeclaredConstructor(
-        (String name, SourceConstructorBuilder constructorBuilder) {
+        (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.
-      SourceConstructorBuilder earliest = constructorBuilder;
+      DeclaredSourceConstructorBuilder earliest = constructorBuilder;
       Builder earliestBuilder = constructorBuilder;
       while (earliestBuilder.next != null) {
         earliestBuilder = earliestBuilder.next!;
-        if (earliestBuilder is SourceConstructorBuilder) {
+        if (earliestBuilder is DeclaredSourceConstructorBuilder) {
           earliest = earliestBuilder;
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index ab8d175..f24e48b 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -352,7 +352,7 @@
 
     final BodyBuilder listener = createFunctionListener(
         lookupBuilder(beginToken, getOrSet, name as String)
-            as FunctionBuilderImpl);
+            as SourceFunctionBuilderImpl);
     buildFunctionBody(listener, bodyToken, metadata, MemberKind.TopLevelMethod);
   }
 
@@ -599,8 +599,8 @@
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery || currentClassIsParserRecovery) return;
 
-    FunctionBuilderImpl builder =
-        lookupConstructor(beginToken, name!) as FunctionBuilderImpl;
+    SourceFunctionBuilderImpl builder =
+        lookupConstructor(beginToken, name!) as SourceFunctionBuilderImpl;
     if (_inRedirectingFactory) {
       buildRedirectingFactoryMethod(
           bodyToken, builder, MemberKind.Factory, metadata);
@@ -709,12 +709,13 @@
     Token? metadata = pop() as Token?;
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery || currentClassIsParserRecovery) return;
-    FunctionBuilderImpl builder;
+    SourceFunctionBuilderImpl builder;
     if (isConstructor) {
-      builder = lookupConstructor(beginToken, name!) as FunctionBuilderImpl;
+      builder =
+          lookupConstructor(beginToken, name!) as SourceFunctionBuilderImpl;
     } else {
       builder = lookupBuilder(beginToken, getOrSet, name as String)
-          as FunctionBuilderImpl;
+          as SourceFunctionBuilderImpl;
     }
     buildFunctionBody(
         createFunctionListener(builder),
@@ -778,7 +779,7 @@
       ..constantContext = constantContext;
   }
 
-  BodyBuilder createFunctionListener(FunctionBuilderImpl builder) {
+  BodyBuilder createFunctionListener(SourceFunctionBuilderImpl builder) {
     final Scope typeParameterScope =
         builder.computeTypeParameterScope(memberScope);
     final Scope formalParameterScope =
@@ -795,8 +796,8 @@
         inferenceDataForTesting: builder.dataForTesting?.inferenceData);
   }
 
-  void buildRedirectingFactoryMethod(Token token, FunctionBuilderImpl builder,
-      MemberKind kind, Token? metadata) {
+  void buildRedirectingFactoryMethod(Token token,
+      SourceFunctionBuilderImpl builder, MemberKind kind, Token? metadata) {
     final BodyBuilder listener = createFunctionListener(builder);
     try {
       Parser parser = new Parser(listener,
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 b623395..51311fb 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
@@ -559,7 +559,7 @@
     });
 
     forEachConstructor((String name, MemberBuilder builder) {
-      if (builder is SourceConstructorBuilder) {
+      if (builder is DeclaredSourceConstructorBuilder) {
         library.checkTypesInConstructorBuilder(builder, typeEnvironment);
       } else if (builder is RedirectingFactoryBuilder) {
         library.checkTypesInRedirectingFactoryBuilder(builder, typeEnvironment);
@@ -575,7 +575,8 @@
     }, includeInjectedConstructors: true);
   }
 
-  void addSyntheticConstructor(SyntheticConstructorBuilder constructorBuilder) {
+  void addSyntheticConstructor(
+      SyntheticSourceConstructorBuilder constructorBuilder) {
     String name = constructorBuilder.name;
     constructorBuilder.next = constructorScopeBuilder[name];
     constructorScopeBuilder.addMember(name, constructorBuilder);
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 8fbed56..36e33bc 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
@@ -48,8 +48,11 @@
 import '../util/helpers.dart' show DelayedActionPerformer;
 import 'source_function_builder.dart';
 
-class SourceConstructorBuilder extends FunctionBuilderImpl
-    implements ConstructorBuilder {
+abstract class SourceConstructorBuilder
+    implements ConstructorBuilder, SourceMemberBuilder {}
+
+class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
+    implements SourceConstructorBuilder {
   final Constructor _constructor;
   final Procedure? _constructorTearOff;
 
@@ -65,7 +68,7 @@
 
   Token? beginInitializers;
 
-  SourceConstructorBuilder? actualOrigin;
+  DeclaredSourceConstructorBuilder? actualOrigin;
 
   Constructor get actualConstructor => _constructor;
 
@@ -79,7 +82,7 @@
   @override
   List<FormalParameterBuilder>? formals;
 
-  SourceConstructorBuilder(
+  DeclaredSourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
       TypeBuilder? returnType,
@@ -138,7 +141,7 @@
   Iterable<Member> get exportedMembers => [constructor];
 
   @override
-  SourceConstructorBuilder get origin => actualOrigin ?? this;
+  DeclaredSourceConstructorBuilder get origin => actualOrigin ?? this;
 
   ConstructorBuilder? get patchForTesting =>
       dataForTesting?.patchForTesting as ConstructorBuilder?;
@@ -310,12 +313,12 @@
     Object? superTargetBuilder = _computeSuperTargetBuilder();
     Constructor superTarget;
     List<FormalParameterBuilder>? superFormals;
-    if (superTargetBuilder is SourceConstructorBuilder) {
+    if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
       superTarget = superTargetBuilder.constructor;
       superFormals = superTargetBuilder.formals!;
     } else if (superTargetBuilder is DillConstructorBuilder) {
       superTarget = superTargetBuilder.constructor;
-      if (superTargetBuilder is SyntheticConstructorBuilder) {
+      if (superTargetBuilder is SyntheticSourceConstructorBuilder) {
         superFormals = superTargetBuilder.formals;
       } else {
         // The error in this case should be reported elsewhere. Here we perform
@@ -334,11 +337,11 @@
       return performRecoveryForErroneousCase();
     }
 
-    if (superTargetBuilder is SourceConstructorBuilder) {
+    if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
       superTargetBuilder.inferFormalTypes(classHierarchy);
-    } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+    } else if (superTargetBuilder is SyntheticSourceConstructorBuilder) {
       MemberBuilder? superTargetOriginBuilder = superTargetBuilder.actualOrigin;
-      if (superTargetOriginBuilder is SourceConstructorBuilder) {
+      if (superTargetOriginBuilder is DeclaredSourceConstructorBuilder) {
         superTargetOriginBuilder.inferFormalTypes(classHierarchy);
       }
     }
@@ -457,10 +460,10 @@
   void addSuperParameterDefaultValueCloners(
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     Object? superTargetBuilder = _computeSuperTargetBuilder();
-    if (superTargetBuilder is SourceConstructorBuilder) {
+    if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
       superTargetBuilder
           .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
-    } else if (superTargetBuilder is SyntheticConstructorBuilder) {
+    } else if (superTargetBuilder is SyntheticSourceConstructorBuilder) {
       superTargetBuilder
           .addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
     }
@@ -621,7 +624,7 @@
 
   @override
   void applyPatch(Builder patch) {
-    if (patch is SourceConstructorBuilder) {
+    if (patch is DeclaredSourceConstructorBuilder) {
       if (checkPatch(patch)) {
         patch.actualOrigin = this;
         dataForTesting?.patchForTesting = patch;
@@ -683,7 +686,7 @@
   }
 }
 
-class SyntheticConstructorBuilder extends DillConstructorBuilder
+class SyntheticSourceConstructorBuilder extends DillConstructorBuilder
     with SourceMemberBuilderMixin {
   // TODO(johnniwinther,cstefantsova): Rename [_origin] to avoid the confusion
   // with patches.
@@ -693,7 +696,7 @@
   MemberBuilder? _origin;
   SynthesizedFunctionNode? _synthesizedFunctionNode;
 
-  SyntheticConstructorBuilder(SourceClassBuilder parent,
+  SyntheticSourceConstructorBuilder(SourceClassBuilder parent,
       Constructor constructor, Procedure? constructorTearOff,
       {MemberBuilder? origin, SynthesizedFunctionNode? synthesizedFunctionNode})
       : _origin = origin,
@@ -704,7 +707,7 @@
   //  confusion with patches.
   MemberBuilder? get actualOrigin {
     MemberBuilder? origin = _origin;
-    while (origin is SyntheticConstructorBuilder) {
+    while (origin is SyntheticSourceConstructorBuilder) {
       origin = origin._origin;
     }
     return origin;
@@ -712,7 +715,7 @@
 
   List<FormalParameterBuilder>? get formals {
     MemberBuilder? origin = actualOrigin;
-    return origin is SourceConstructorBuilder ? origin.formals : null;
+    return origin is DeclaredSourceConstructorBuilder ? origin.formals : null;
   }
 
   @override
@@ -728,10 +731,10 @@
         // If [_origin] is from a source library, we need to build the default
         // values and initializers first.
         MemberBuilder origin = _origin!;
-        if (origin is SourceConstructorBuilder) {
+        if (origin is DeclaredSourceConstructorBuilder) {
           origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
               delayedActionPerformers, synthesizedFunctionNodes);
-        } else if (origin is SyntheticConstructorBuilder) {
+        } else if (origin is SyntheticSourceConstructorBuilder) {
           origin.buildOutlineExpressions(originLibraryBuilder, classHierarchy,
               delayedActionPerformers, synthesizedFunctionNodes);
         }
@@ -744,9 +747,9 @@
   void addSuperParameterDefaultValueCloners(
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     MemberBuilder? origin = _origin;
-    if (origin is SourceConstructorBuilder) {
+    if (origin is DeclaredSourceConstructorBuilder) {
       origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
-    } else if (origin is SyntheticConstructorBuilder) {
+    } else if (origin is SyntheticSourceConstructorBuilder) {
       origin.addSuperParameterDefaultValueCloners(synthesizedFunctionNodes);
     }
     if (_synthesizedFunctionNode != null) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 9e13bbc..216861b 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -75,7 +75,7 @@
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 import 'source_procedure_builder.dart';
 
-class EnumBuilder extends SourceClassBuilder {
+class SourceEnumBuilder extends SourceClassBuilder {
   final List<EnumConstantInfo?>? enumConstantInfos;
 
   final NamedTypeBuilder intType;
@@ -86,9 +86,9 @@
 
   final NamedTypeBuilder listType;
 
-  SourceConstructorBuilder? _synthesizedDefaultConstructorBuilder;
+  DeclaredSourceConstructorBuilder? _synthesizedDefaultConstructorBuilder;
 
-  EnumBuilder.internal(
+  SourceEnumBuilder.internal(
       List<MetadataBuilder>? metadata,
       String name,
       List<TypeVariableBuilder>? typeVariables,
@@ -124,7 +124,7 @@
             referencesFromIndexed,
             cls: cls);
 
-  factory EnumBuilder(
+  factory SourceEnumBuilder(
       List<MetadataBuilder>? metadata,
       String name,
       List<TypeVariableBuilder>? typeVariables,
@@ -270,34 +270,35 @@
         fieldSetterReference: valuesSetterReference);
     members["values"] = valuesBuilder;
 
-    SourceConstructorBuilder? synthesizedDefaultConstructorBuilder;
+    DeclaredSourceConstructorBuilder? synthesizedDefaultConstructorBuilder;
     if (constructorScope.local.isEmpty) {
-      synthesizedDefaultConstructorBuilder = new SourceConstructorBuilder(
-          /* metadata = */ null,
-          constMask,
-          /* returnType = */ null,
-          "",
-          /* typeParameters = */ null,
-          <FormalParameterBuilder>[
-            new FormalParameterBuilder(
-                null, 0, intType, "index", parent, charOffset),
-            new FormalParameterBuilder(
-                null, 0, stringType, "name", parent, charOffset)
-          ],
-          parent,
-          charOffset,
-          charOffset,
-          charOffset,
-          charEndOffset,
-          constructorReference,
-          tearOffReference,
-          forAbstractClassOrEnum: true);
+      synthesizedDefaultConstructorBuilder =
+          new DeclaredSourceConstructorBuilder(
+              /* metadata = */ null,
+              constMask,
+              /* returnType = */ null,
+              "",
+              /* typeParameters = */ null,
+              <FormalParameterBuilder>[
+                new FormalParameterBuilder(
+                    null, 0, intType, "index", parent, charOffset),
+                new FormalParameterBuilder(
+                    null, 0, stringType, "name", parent, charOffset)
+              ],
+              parent,
+              charOffset,
+              charOffset,
+              charOffset,
+              charEndOffset,
+              constructorReference,
+              tearOffReference,
+              forAbstractClassOrEnum: true);
       synthesizedDefaultConstructorBuilder
           .registerInitializedField(valuesBuilder);
       constructors[""] = synthesizedDefaultConstructorBuilder;
     } else {
       constructorScope.forEach((name, member) {
-        if (member is SourceConstructorBuilder) {
+        if (member is DeclaredSourceConstructorBuilder) {
           member.ensureGrowableFormals();
           member.formals!.insert(
               0,
@@ -401,7 +402,7 @@
     scope.forEachLocalSetter((name, member) {
       setters[name] = member;
     });
-    EnumBuilder enumBuilder = new EnumBuilder.internal(
+    SourceEnumBuilder enumBuilder = new SourceEnumBuilder.internal(
         metadata,
         name,
         typeVariables,
@@ -539,7 +540,6 @@
         classHierarchy.coreTypes,
         new ListLiteral(values,
             typeArgument: rawType(library.nonNullable), isConst: true));
-
     int index = 0;
     if (enumConstantInfos != null) {
       for (EnumConstantInfo? enumConstantInfo in enumConstantInfos!) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
index 56e6800..5d02635 100644
--- a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
@@ -33,7 +33,7 @@
 import 'source_loader.dart' show SourceLoader;
 import 'source_member_builder.dart';
 
-class SourceFactoryBuilder extends FunctionBuilderImpl {
+class SourceFactoryBuilder extends SourceFunctionBuilderImpl {
   final int charOpenParenOffset;
 
   AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
diff --git a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
index c29ad33..52c156d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
@@ -126,7 +126,7 @@
 }
 
 /// Common base class for constructor and procedure builders.
-abstract class FunctionBuilderImpl extends SourceMemberBuilderImpl
+abstract class SourceFunctionBuilderImpl extends SourceMemberBuilderImpl
     implements SourceFunctionBuilder {
   @override
   final List<MetadataBuilder>? metadata;
@@ -155,7 +155,7 @@
   /// extension declaration.
   List<TypeParameter>? _extensionTypeParameters;
 
-  FunctionBuilderImpl(
+  SourceFunctionBuilderImpl(
       this.metadata,
       this.modifiers,
       this.returnType,
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 b60f0ec..4070f2c 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
@@ -2534,22 +2534,23 @@
           .lookupGetterReference(constructorTearOffName(
               constructorName, _currentClassReferencesFromIndexed!.library));
     }
-    SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
-        metadata,
-        modifiers & ~abstractMask,
-        returnType,
-        constructorName,
-        typeVariables,
-        formals,
-        this,
-        startCharOffset,
-        charOffset,
-        charOpenParenOffset,
-        charEndOffset,
-        constructorReference,
-        tearOffReference,
-        nativeMethodName: nativeMethodName,
-        forAbstractClassOrEnum: forAbstractClass);
+    DeclaredSourceConstructorBuilder constructorBuilder =
+        new DeclaredSourceConstructorBuilder(
+            metadata,
+            modifiers & ~abstractMask,
+            returnType,
+            constructorName,
+            typeVariables,
+            formals,
+            this,
+            startCharOffset,
+            charOffset,
+            charOpenParenOffset,
+            charEndOffset,
+            constructorReference,
+            tearOffReference,
+            nativeMethodName: nativeMethodName,
+            forAbstractClassOrEnum: forAbstractClass);
     checkTypeVariables(typeVariables, constructorBuilder);
     // TODO(johnniwinther): There is no way to pass the tear off reference here.
     addBuilder(constructorName, constructorBuilder, charOffset,
@@ -2816,7 +2817,7 @@
     Map<String, MemberBuilder> constructors = declaration.constructors!;
     Map<String, MemberBuilder> setters = declaration.setters!;
 
-    EnumBuilder enumBuilder = new EnumBuilder(
+    SourceEnumBuilder enumBuilder = new SourceEnumBuilder(
         metadata,
         name,
         typeVariables,
@@ -3046,7 +3047,7 @@
       if (!declaration.isPatch && !declaration.isDuplicate) {
         library.addTypedef(typedef);
       }
-    } else if (declaration is EnumBuilder) {
+    } else if (declaration is SourceEnumBuilder) {
       Class cls = declaration.build(this, coreLibrary);
       if (!declaration.isPatch) {
         cls.name += findDuplicateSuffix(declaration);
@@ -3661,9 +3662,9 @@
                   inErrorRecovery: issues.isNotEmpty);
               formals = member.formals;
             } else {
-              assert(member is SourceConstructorBuilder,
+              assert(member is DeclaredSourceConstructorBuilder,
                   "Unexpected constructor member (${member.runtimeType}).");
-              formals = (member as SourceConstructorBuilder).formals;
+              formals = (member as DeclaredSourceConstructorBuilder).formals;
             }
             if (formals != null && formals.isNotEmpty) {
               for (FormalParameterBuilder formal in formals) {
@@ -4228,7 +4229,7 @@
   }
 
   void checkTypesInConstructorBuilder(
-      SourceConstructorBuilder constructorBuilder,
+      DeclaredSourceConstructorBuilder constructorBuilder,
       TypeEnvironment typeEnvironment) {
     checkBoundsInFunctionNode(
         constructorBuilder.constructor.function, typeEnvironment, fileUri);
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 4d9a9f9..07b1207 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -912,7 +912,7 @@
   }
 
   void registerConstructorToBeInferred(
-      Constructor constructor, SourceConstructorBuilder builder) {
+      Constructor constructor, DeclaredSourceConstructorBuilder builder) {
     _typeInferenceEngine!.toBeInferred[constructor] = builder;
   }
 
@@ -1445,7 +1445,7 @@
             }
           });
           classBuilder.forEachConstructor((String name, Builder memberBuilder) {
-            if (memberBuilder is SourceConstructorBuilder) {
+            if (memberBuilder is DeclaredSourceConstructorBuilder) {
               MacroApplications? macroApplications = computeApplications(
                   libraryBuilder,
                   classBuilder.scope,
@@ -1684,7 +1684,7 @@
         directSupertypeMap.keys.toList();
     for (int i = 0; i < directSupertypes.length; i++) {
       TypeDeclarationBuilder? supertype = directSupertypes[i];
-      if (supertype is EnumBuilder) {
+      if (supertype is SourceEnumBuilder) {
         cls.addProblem(templateExtendingEnum.withArguments(supertype.name),
             cls.charOffset, noLength);
       } else if (!cls.library.mayImplementRestrictedTypes &&
diff --git a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
index a679d67..861506f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart
@@ -22,7 +22,7 @@
 import 'source_function_builder.dart';
 import 'source_member_builder.dart';
 
-class SourceProcedureBuilder extends FunctionBuilderImpl
+class SourceProcedureBuilder extends SourceFunctionBuilderImpl
     implements ProcedureBuilder {
   @override
   final int charOpenParenOffset;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 639f6b7..fcc9c8e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -112,14 +112,14 @@
   /// This is represented as a map from a constructor to its library
   /// builder because the builder is used to report errors due to cyclic
   /// inference dependencies.
-  final Map<Constructor, SourceConstructorBuilder> toBeInferred = {};
+  final Map<Constructor, DeclaredSourceConstructorBuilder> toBeInferred = {};
 
   /// A map containing constructors in the process of being inferred.
   ///
   /// This is used to detect cyclic inference dependencies.  It is represented
   /// as a map from a constructor to its library builder because the builder
   /// is used to report errors.
-  final Map<Constructor, SourceConstructorBuilder> beingInferred = {};
+  final Map<Constructor, DeclaredSourceConstructorBuilder> beingInferred = {};
 
   final Map<Member, TypeDependency> typeDependencies = {};
 
@@ -143,7 +143,7 @@
   void finishTopLevelInitializingFormals() {
     // Field types have all been inferred so we don't need to guard against
     // cyclic dependency.
-    for (SourceConstructorBuilder builder in toBeInferred.values) {
+    for (DeclaredSourceConstructorBuilder builder in toBeInferred.values) {
       builder.inferFormalTypes(classHierarchy);
     }
     toBeInferred.clear();
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index f30fc34..44a61a4 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -365,7 +365,8 @@
 
   @override
   void inferConstructorParameterTypes(Constructor target) {
-    SourceConstructorBuilder? constructor = engine.beingInferred[target];
+    DeclaredSourceConstructorBuilder? constructor =
+        engine.beingInferred[target];
     if (constructor != null) {
       // There is a cyclic dependency where inferring the types of the
       // initializing formals of a constructor required us to infer the
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 77a6a44..13b47b5 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -68,58 +68,53 @@
       this.targetFlags: const TestTargetFlags(),
       this.nnbdMode: NnbdMode.Weak});
 
-  void customizeCompilerOptions(CompilerOptions options, TestData testData) {}
+  /// Called before running test on [testData].
+  ///
+  /// This allows tests to customize the [options] based on the [testData].
+  ///
+  /// A custom object can be returned. This is passed to data computer.
+  dynamic customizeCompilerOptions(
+          CompilerOptions options, TestData testData) =>
+      null;
 }
 
-// TODO(johnniwinther): Support annotations for compile-time errors.
 abstract class DataComputer<T> {
   const DataComputer();
 
   /// Called before testing to setup flags needed for data collection.
   void setup() {}
 
-  // Called to allow for (awaited) inspection of the compilation result.
-  Future<void> inspectComponent(Component component) {
+  /// Called to allow for (awaited) inspection of the [testResultData] from
+  /// running the test.
+  Future<void> inspectTestResultData(TestResultData testResultData) {
     return new Future.value(null);
   }
 
   /// Function that computes a data mapping for [member].
   ///
   /// Fills [actualMap] with the data.
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<T>> actualMap,
       {bool? verbose}) {}
 
   /// Function that computes a data mapping for [cls].
   ///
   /// Fills [actualMap] with the data.
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<T>> actualMap,
       {bool? verbose}) {}
 
   /// Function that computes a data mapping for [extension].
   ///
   /// Fills [actualMap] with the data.
-  void computeExtensionData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Extension extension,
+  void computeExtensionData(TestResultData testResultData, Extension extension,
       Map<Id, ActualData<T>> actualMap,
       {bool? verbose}) {}
 
   /// Function that computes a data mapping for [library].
   ///
   /// Fills [actualMap] with the data.
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<T>> actualMap,
       {bool? verbose}) {}
 
@@ -131,7 +126,7 @@
   bool get supportsErrors => false;
 
   /// Returns data corresponding to [error].
-  T? computeErrorData(TestConfig config, InternalCompilerResult compiler, Id id,
+  T? computeErrorData(TestResultData testResultData, Id id,
           List<FormattedMessage> errors) =>
       null;
 
@@ -143,6 +138,21 @@
   bool get includeMemberSignatures => false;
 }
 
+/// Auxiliary data from running a test.
+class TestResultData {
+  /// The test config used to run the test.
+  final TestConfig config;
+
+  /// CustomData is passed from [TestConfig.customizeCompilerOptions].
+  final dynamic customData;
+
+  /// The compiler result from running the test, include access to the used
+  /// compiler.
+  final InternalCompilerResult compilerResult;
+
+  TestResultData(this.config, this.customData, this.compilerResult);
+}
+
 class CfeCompiledData<T> extends CompiledData<T> {
   final InternalCompilerResult compilerResult;
 
@@ -325,13 +335,16 @@
     }
   }
   options.packagesFileUri = config.packageConfigUri;
-  config.customizeCompilerOptions(options, testData);
+  dynamic customData = config.customizeCompilerOptions(options, testData);
   InternalCompilerResult compilerResult = await compileScript(
       testData.memorySourceFiles,
       options: options,
       retainDataForTesting: true,
       requireMain: false) as InternalCompilerResult;
 
+  TestResultData testResultData =
+      new TestResultData(config, customData, compilerResult);
+
   Component component = compilerResult.component!;
   Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
   Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
@@ -362,8 +375,7 @@
           offset = 0;
         }
         NodeId id = new NodeId(offset, IdKind.error);
-        T? data =
-            dataComputer.computeErrorData(config, compilerResult, id, list);
+        T? data = dataComputer.computeErrorData(testResultData, id, list);
         if (data != null) {
           Map<Id, ActualData<T>> actualMap = actualMapForUri(uri);
           actualMap[id] = new ActualData<T>(id, data, uri, offset, list);
@@ -398,18 +410,17 @@
         return;
       }
     }
-    dataComputer.computeMemberData(config, compilerResult, member, actualMap,
+    dataComputer.computeMemberData(testResultData, member, actualMap,
         verbose: verbose);
   }
 
   void processClass(Class cls, Map<Id, ActualData<T>> actualMap) {
-    dataComputer.computeClassData(config, compilerResult, cls, actualMap,
+    dataComputer.computeClassData(testResultData, cls, actualMap,
         verbose: verbose);
   }
 
   void processExtension(Extension extension, Map<Id, ActualData<T>> actualMap) {
-    dataComputer.computeExtensionData(
-        config, compilerResult, extension, actualMap,
+    dataComputer.computeExtensionData(testResultData, extension, actualMap,
         verbose: verbose);
   }
 
@@ -419,7 +430,7 @@
             library.importUri.scheme == 'package');
   }
 
-  await dataComputer.inspectComponent(component);
+  await dataComputer.inspectTestResultData(testResultData);
 
   for (Library library in component.libraries) {
     if (excludeLibrary(library) &&
@@ -427,7 +438,7 @@
       continue;
     }
     dataComputer.computeLibraryData(
-        config, compilerResult, library, actualMapFor(library));
+        testResultData, library, actualMapFor(library));
     for (Class cls in library.classes) {
       processClass(cls, actualMapFor(cls));
       for (Member member in cls.members) {
diff --git a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
index 76f3281..9110735 100644
--- a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
+++ b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
@@ -34,24 +34,18 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new InheritanceDataExtractor(compilerResult, actualMap)
+    new InheritanceDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new InheritanceDataExtractor(compilerResult, actualMap)
+    new InheritanceDataExtractor(testResultData.compilerResult, actualMap)
         .computeForClass(cls);
   }
 
@@ -59,8 +53,8 @@
   bool get supportsErrors => true;
 
   @override
-  Features? computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  Features? computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     return null; //errorsToText(errors, useCodes: true);
   }
 
diff --git a/pkg/front_end/test/covariance_check/covariance_check_test.dart b/pkg/front_end/test/covariance_check/covariance_check_test.dart
index c91c012..074088c 100644
--- a/pkg/front_end/test/covariance_check/covariance_check_test.dart
+++ b/pkg/front_end/test/covariance_check/covariance_check_test.dart
@@ -26,24 +26,19 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new CovarianceCheckDataExtractor(compilerResult, actualMap)
+    new CovarianceCheckDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    member.accept(new CovarianceCheckDataExtractor(compilerResult, actualMap));
+    member.accept(new CovarianceCheckDataExtractor(
+        testResultData.compilerResult, actualMap));
   }
 
   @override
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 83e5bbf..bb09833 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -38,44 +38,34 @@
   const ExtensionsDataComputer();
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    member.accept(new ExtensionsDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new ExtensionsDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new ExtensionsDataExtractor(compilerResult, actualMap).computeForClass(cls);
+    new ExtensionsDataExtractor(testResultData.compilerResult, actualMap)
+        .computeForClass(cls);
   }
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new ExtensionsDataExtractor(compilerResult, actualMap)
+    new ExtensionsDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeExtensionData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Extension extension,
+  void computeExtensionData(TestResultData testResultData, Extension extension,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new ExtensionsDataExtractor(compilerResult, actualMap)
+    new ExtensionsDataExtractor(testResultData.compilerResult, actualMap)
         .computeForExtension(extension);
   }
 
@@ -83,8 +73,8 @@
   bool get supportsErrors => true;
 
   @override
-  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  Features computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     for (FormattedMessage error in errors) {
       if (error.problemMessage.contains(',')) {
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
index e8f9f5f..676b6df 100644
--- a/pkg/front_end/test/id_testing/id_testing_test.dart
+++ b/pkg/front_end/test/id_testing/id_testing_test.dart
@@ -2,19 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io' show Directory, Platform;
+
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, StringDataInterpreter, runTests;
-import 'dart:io' show Directory, Platform;
 import 'package:front_end/src/fasta/messages.dart' show FormattedMessage;
 import 'package:front_end/src/testing/id_testing_helper.dart'
     show
         CfeDataExtractor,
-        InternalCompilerResult,
         DataComputer,
-        TestConfig,
-        defaultCfeConfig,
+        InternalCompilerResult,
+        TestResultData,
         createUriForFileName,
+        defaultCfeConfig,
         onFailure,
         runTestFor;
 import 'package:front_end/src/testing/id_testing_utils.dart';
@@ -40,33 +41,26 @@
   const IdTestingDataComputer();
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    member.accept(new IdTestingDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new IdTestingDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new IdTestingDataExtractor(compilerResult, actualMap).computeForClass(cls);
+    new IdTestingDataExtractor(testResultData.compilerResult, actualMap)
+        .computeForClass(cls);
   }
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new IdTestingDataExtractor(compilerResult, actualMap)
+    new IdTestingDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
@@ -74,8 +68,8 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  String computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     return errorsToText(errors);
   }
 
diff --git a/pkg/front_end/test/id_tests/assigned_variables_test.dart b/pkg/front_end/test/id_tests/assigned_variables_test.dart
index 1741638..23a5b09 100644
--- a/pkg/front_end/test/id_tests/assigned_variables_test.dart
+++ b/pkg/front_end/test/id_tests/assigned_variables_test.dart
@@ -38,20 +38,18 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<_Data>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
     AssignedVariablesForTesting<TreeNode, VariableDeclaration>?
         assignedVariables = memberBuilder
             .dataForTesting!.inferenceData.flowAnalysisResult.assignedVariables;
     if (assignedVariables == null) return;
     member.accept(new AssignedVariablesDataExtractor(
-        compilerResult, actualMap, assignedVariables));
+        testResultData.compilerResult, actualMap, assignedVariables));
   }
 }
 
diff --git a/pkg/front_end/test/id_tests/constant_test.dart b/pkg/front_end/test/id_tests/constant_test.dart
index bcee3af..2d48d62 100644
--- a/pkg/front_end/test/id_tests/constant_test.dart
+++ b/pkg/front_end/test/id_tests/constant_test.dart
@@ -9,10 +9,10 @@
 import 'package:front_end/src/testing/id_testing_helper.dart'
     show
         CfeDataExtractor,
-        InternalCompilerResult,
         DataComputer,
         FormattedMessage,
-        TestConfig,
+        InternalCompilerResult,
+        TestResultData,
         createUriForFileName,
         defaultCfeConfig,
         onFailure,
@@ -34,23 +34,19 @@
   const ConstantsDataComputer();
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    member.accept(new ConstantsDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new ConstantsDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new ConstantsDataExtractor(compilerResult, actualMap).computeForClass(cls);
+    new ConstantsDataExtractor(testResultData.compilerResult, actualMap)
+        .computeForClass(cls);
   }
 
   @override
@@ -58,8 +54,8 @@
 
   /// Returns data corresponding to [error].
   @override
-  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  String computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     return errorsToText(errors);
   }
 
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index b4112f5..bc19b2b 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -35,15 +35,15 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
-    member.accept(new DefiniteAssignmentDataExtractor(compilerResult, actualMap,
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
+    member.accept(new DefiniteAssignmentDataExtractor(
+        testResultData.compilerResult,
+        actualMap,
         memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index d51a02e..3a26b89 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
@@ -35,16 +35,14 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
     member.accept(new DefiniteUnassignmentDataExtractor(
-        compilerResult,
+        testResultData.compilerResult,
         actualMap,
         memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
diff --git a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart b/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
index ef7a1ca..7e8b426 100644
--- a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
@@ -39,16 +39,14 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<List<DartType>>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
     member.accept(new InferredTypeArgumentDataExtractor(
-        compilerResult,
+        testResultData.compilerResult,
         memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
diff --git a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart b/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
index 02c50fa..6882661 100644
--- a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
@@ -39,16 +39,14 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<DartType>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
     member.accept(new InferredTypeArgumentDataExtractor(
-        compilerResult,
+        testResultData.compilerResult,
         memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 78f9bf5..b618894 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -49,24 +49,18 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new InheritanceDataExtractor(config, compilerResult, actualMap)
+    new InheritanceDataExtractor(testResultData, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new InheritanceDataExtractor(config, compilerResult, actualMap)
+    new InheritanceDataExtractor(testResultData, actualMap)
         .computeForClass(cls);
   }
 
@@ -74,8 +68,8 @@
   bool get supportsErrors => true;
 
   @override
-  String computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  String computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     return errorsToText(errors, useCodes: true);
   }
 
@@ -84,12 +78,15 @@
 }
 
 class InheritanceDataExtractor extends CfeDataExtractor<String> {
-  final TestConfig _config;
-  final InternalCompilerResult _compilerResult;
+  final TestResultData _testResultData;
 
   InheritanceDataExtractor(
-      this._config, this._compilerResult, Map<Id, ActualData<String>> actualMap)
-      : super(_compilerResult, actualMap);
+      this._testResultData, Map<Id, ActualData<String>> actualMap)
+      : super(_testResultData.compilerResult, actualMap);
+
+  TestConfig get _config => _testResultData.config;
+
+  InternalCompilerResult get _compilerResult => _testResultData.compilerResult;
 
   ClassHierarchy get _hierarchy => _compilerResult.classHierarchy!;
 
diff --git a/pkg/front_end/test/id_tests/nullability_test.dart b/pkg/front_end/test/id_tests/nullability_test.dart
index 0ffa7f2..e563f8d 100644
--- a/pkg/front_end/test/id_tests/nullability_test.dart
+++ b/pkg/front_end/test/id_tests/nullability_test.dart
@@ -29,13 +29,11 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    member.accept(new NullabilityDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new NullabilityDataExtractor(testResultData.compilerResult, actualMap));
   }
 }
 
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index a2e6a1a..6a043b4 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_test.dart
@@ -37,15 +37,15 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
-    member.accept(new ReachabilityDataExtractor(compilerResult, actualMap,
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
+    member.accept(new ReachabilityDataExtractor(
+        testResultData.compilerResult,
+        actualMap,
         memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
diff --git a/pkg/front_end/test/id_tests/type_promotion_test.dart b/pkg/front_end/test/id_tests/type_promotion_test.dart
index 6aae1e8..59cc18e6 100644
--- a/pkg/front_end/test/id_tests/type_promotion_test.dart
+++ b/pkg/front_end/test/id_tests/type_promotion_test.dart
@@ -33,13 +33,11 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<DartType>> actualMap,
       {bool? verbose}) {
-    member.accept(new TypePromotionDataExtractor(compilerResult, actualMap));
+    member.accept(new TypePromotionDataExtractor(
+        testResultData.compilerResult, actualMap));
   }
 }
 
diff --git a/pkg/front_end/test/id_tests/why_not_promoted_test.dart b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
index 4362bf9..0d52a11 100644
--- a/pkg/front_end/test/id_tests/why_not_promoted_test.dart
+++ b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
@@ -41,15 +41,15 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
     SourceMemberBuilder memberBuilder =
-        lookupMemberBuilder(compilerResult, member) as SourceMemberBuilder;
-    member.accept(new WhyNotPromotedDataExtractor(compilerResult, actualMap,
+        lookupMemberBuilder(testResultData.compilerResult, member)
+            as SourceMemberBuilder;
+    member.accept(new WhyNotPromotedDataExtractor(
+        testResultData.compilerResult,
+        actualMap,
         memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 }
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 221ce79..5e88669 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -17,6 +17,7 @@
         DataComputer,
         InternalCompilerResult,
         TestConfig,
+        TestResultData,
         createUriForFileName,
         onFailure,
         runTestFor;
@@ -42,16 +43,13 @@
       ]);
 }
 
-// Ugly hack.
-late CompilerOptions stashedOptions;
-
 class TestConfigWithLanguageVersion extends TestConfig {
   TestConfigWithLanguageVersion(String marker, String name)
       : super(marker, name);
 
   @override
-  void customizeCompilerOptions(CompilerOptions options, TestData testData) {
-    stashedOptions = options;
+  CompilerOptions customizeCompilerOptions(
+      CompilerOptions options, TestData testData) {
     options.currentSdkVersion = "2.8";
 
     File f = new File.fromUri(testData.testFileUri.resolve("test.options"));
@@ -69,6 +67,7 @@
         }
       }
     }
+    return options;
   }
 }
 
@@ -82,15 +81,15 @@
   const LanguageVersioningDataComputer();
 
   @override
-  Future<void> inspectComponent(Component component) async {
+  Future<void> inspectTestResultData(TestResultData testResultData) async {
+    CompilerOptions options = testResultData.customData;
+    Component component = testResultData.compilerResult.component!;
     for (Library library in component.libraries) {
       if (library.importUri.scheme == "dart") continue;
       Version lvFile =
-          (await lv.languageVersionForUri(library.fileUri, stashedOptions))
-              .version;
+          (await lv.languageVersionForUri(library.fileUri, options)).version;
       Version lvImportUri =
-          (await lv.languageVersionForUri(library.importUri, stashedOptions))
-              .version;
+          (await lv.languageVersionForUri(library.importUri, options)).version;
       if ((lvFile != lvImportUri || lvFile != library.languageVersion)) {
         throw """
 Language version disagreement:
@@ -103,13 +102,11 @@
   }
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new LanguageVersioningDataExtractor(compilerResult, actualMap)
+    new LanguageVersioningDataExtractor(
+            testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
@@ -117,8 +114,8 @@
   bool get supportsErrors => true;
 
   @override
-  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  Features computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     features[Tags.errors] = errors.map((m) => m.code.name).join(',');
     return features;
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index ee92293..463b0cf 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -34,33 +34,24 @@
   const MacroDataComputer();
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    member.accept(new MacroDataExtractor(compilerResult, actualMap));
+    member.accept(new MacroDataExtractor(testResultData, actualMap));
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new MacroDataExtractor(compilerResult, actualMap).computeForClass(cls);
+    new MacroDataExtractor(testResultData, actualMap).computeForClass(cls);
   }
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new MacroDataExtractor(compilerResult, actualMap)
+    new MacroDataExtractor(testResultData, actualMap)
         .computeForLibrary(library);
   }
 
@@ -75,6 +66,8 @@
   static const String compilationSequence = 'compilationSequence';
   static const String declaredMacros = 'declaredMacros';
   static const String appliedMacros = 'appliedMacros';
+  static const String macroClassIds = 'macroClassIds';
+  static const String macroInstanceIds = 'macroInstanceIds';
 }
 
 String importUriToString(Uri importUri) {
@@ -96,16 +89,17 @@
 }
 
 class MacroDataExtractor extends CfeDataExtractor<Features> {
+  final TestResultData testResultData;
   late final MacroDeclarationData macroDeclarationData;
   late final MacroApplicationData macroApplicationData;
 
-  MacroDataExtractor(InternalCompilerResult compilerResult,
-      Map<Id, ActualData<Features>> actualMap)
-      : super(compilerResult, actualMap) {
-    macroDeclarationData = compilerResult
-        .kernelTargetForTesting!.loader.dataForTesting!.macroDeclarationData;
-    macroApplicationData = compilerResult
-        .kernelTargetForTesting!.loader.dataForTesting!.macroApplicationData;
+  MacroDataExtractor(
+      this.testResultData, Map<Id, ActualData<Features>> actualMap)
+      : super(testResultData.compilerResult, actualMap) {
+    macroDeclarationData = testResultData.compilerResult.kernelTargetForTesting!
+        .loader.dataForTesting!.macroDeclarationData;
+    macroApplicationData = testResultData.compilerResult.kernelTargetForTesting!
+        .loader.dataForTesting!.macroApplicationData;
   }
 
   LibraryMacroApplicationData? getLibraryMacroApplicationData(Library library) {
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 6f237db..a3b4829 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -65,33 +65,26 @@
   const PatchingDataComputer();
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    member.accept(new PatchingDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new PatchingDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
-  void computeClassData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Class cls,
+  void computeClassData(TestResultData testResultData, Class cls,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new PatchingDataExtractor(compilerResult, actualMap).computeForClass(cls);
+    new PatchingDataExtractor(testResultData.compilerResult, actualMap)
+        .computeForClass(cls);
   }
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new PatchingDataExtractor(compilerResult, actualMap)
+    new PatchingDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
@@ -99,8 +92,8 @@
   bool get supportsErrors => true;
 
   @override
-  Features computeErrorData(TestConfig config, InternalCompilerResult compiler,
-      Id id, List<FormattedMessage> errors) {
+  Features computeErrorData(
+      TestResultData testResultData, Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     features[Tags.error] = errorsToText(errors);
     return features;
diff --git a/pkg/front_end/test/predicates/predicate_test.dart b/pkg/front_end/test/predicates/predicate_test.dart
index 5866119..2ffdc45 100644
--- a/pkg/front_end/test/predicates/predicate_test.dart
+++ b/pkg/front_end/test/predicates/predicate_test.dart
@@ -78,24 +78,19 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    new PredicateDataExtractor(compilerResult, actualMap)
+    new PredicateDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<Features>> actualMap,
       {bool? verbose}) {
-    member.accept(new PredicateDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new PredicateDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index cf4d5c3..80a339d 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -39,24 +39,19 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new StaticTypeDataExtractor(compilerResult, actualMap)
+    new StaticTypeDataExtractor(testResultData.compilerResult, actualMap)
         .computeForLibrary(library);
   }
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    member.accept(new StaticTypeDataExtractor(compilerResult, actualMap));
+    member.accept(
+        new StaticTypeDataExtractor(testResultData.compilerResult, actualMap));
   }
 
   @override
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index b29f7ac..24e5246 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -96,26 +96,22 @@
   const TextRepresentationDataComputer();
 
   @override
-  void computeLibraryData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Library library,
+  void computeLibraryData(TestResultData testResultData, Library library,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
-    new TextRepresentationDataExtractor(
-            compilerResult, actualMap, getStrategy(config.marker))
+    new TextRepresentationDataExtractor(testResultData.compilerResult,
+            actualMap, getStrategy(testResultData.config.marker))
         .computeForLibrary(library);
   }
 
   @override
-  void computeMemberData(
-      TestConfig config,
-      InternalCompilerResult compilerResult,
-      Member member,
+  void computeMemberData(TestResultData testResultData, Member member,
       Map<Id, ActualData<String>> actualMap,
       {bool? verbose}) {
     member.accept(new TextRepresentationDataExtractor(
-        compilerResult, actualMap, getStrategy(config.marker)));
+        testResultData.compilerResult,
+        actualMap,
+        getStrategy(testResultData.config.marker)));
   }
 
   @override
diff --git a/tools/VERSION b/tools/VERSION
index e94eb46..f35e17b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 145
+PRERELEASE 146
 PRERELEASE_PATCH 0
\ No newline at end of file
