diff --git a/pkg/front_end/lib/src/fragment/constructor/declaration.dart b/pkg/front_end/lib/src/fragment/constructor/declaration.dart
index 9639a2d..a3c02d2 100644
--- a/pkg/front_end/lib/src/fragment/constructor/declaration.dart
+++ b/pkg/front_end/lib/src/fragment/constructor/declaration.dart
@@ -11,6 +11,7 @@
 import '../../base/constant_context.dart';
 import '../../base/identifiers.dart';
 import '../../base/local_scope.dart';
+import '../../base/messages.dart';
 import '../../base/name_space.dart';
 import '../../base/scope.dart';
 import '../../builder/constructor_builder.dart';
@@ -23,19 +24,18 @@
 import '../../builder/variable_builder.dart';
 import '../../kernel/body_builder.dart';
 import '../../kernel/body_builder_context.dart';
-import '../../kernel/internal_ast.dart';
 import '../../kernel/kernel_helper.dart';
 import '../../kernel/type_algorithms.dart';
 import '../../source/name_scheme.dart';
 import '../../source/source_class_builder.dart';
 import '../../source/source_constructor_builder.dart';
-import '../../source/source_extension_builder.dart';
 import '../../source/source_extension_type_declaration_builder.dart';
 import '../../source/source_function_builder.dart';
 import '../../source/source_library_builder.dart';
 import '../../source/source_loader.dart';
 import '../../source/source_member_builder.dart';
 import '../../source/source_type_parameter_builder.dart';
+import '../../source/type_parameter_scope_builder.dart';
 import '../fragment.dart';
 import 'encoding.dart';
 
@@ -55,9 +55,14 @@
 
   List<Initializer> get initializers;
 
-  void createEncoding(SourceConstructorBuilder builder);
-
-  void registerInferable(Inferable inferable);
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  });
 
   void buildOutlineNodes(
     BuildNodesCallback f, {
@@ -593,9 +598,18 @@
 }
 
 mixin _ConstructorEncodingMixin
-    implements ConstructorDeclaration, ConstructorFragmentDeclaration {
+    implements
+        ConstructorDeclaration,
+        _ConstructorDeclarationMixin,
+        ConstructorFragmentDeclaration {
   ConstructorEncoding get _encoding;
 
+  String? get _nativeMethodName;
+
+  @override
+  late final bool _hasSuperInitializingFormals =
+      formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
+
   @override
   FunctionNode get function => _encoding.function;
 
@@ -603,6 +617,9 @@
   List<Initializer> get initializers => _encoding.initializers;
 
   @override
+  bool get isRedirecting => _encoding.isRedirecting;
+
+  @override
   void prepareInitializers() {
     _encoding.prepareInitializers();
   }
@@ -626,15 +643,12 @@
   void markAsErroneous() {
     _encoding.markAsErroneous();
   }
-}
 
-mixin _RegularConstructorDeclarationMixin
-    implements
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        InferredTypeListener {
   @override
-  RegularConstructorEncoding get _encoding;
+  VariableDeclaration? get thisVariable => _encoding.thisVariable;
+
+  @override
+  List<TypeParameter>? get thisTypeParameters => _encoding.thisTypeParameters;
 
   @override
   void registerFunctionBody(Statement value) {
@@ -647,37 +661,11 @@
   }
 
   @override
-  VariableDeclaration? get thisVariable => null;
-
-  @override
-  List<TypeParameter>? get thisTypeParameters => null;
-
-  @override
-  Substitution computeFieldTypeSubstitution(
-      DeclarationBuilder declarationBuilder) {
-    // Nothing to substitute. Regular generative constructors don't have their
-    // own type parameters.
-    return Substitution.empty;
+  void buildBody() {
+    _encoding.buildBody();
   }
 
   @override
-  void buildBody() {}
-
-  @override
-  bool get isRedirecting {
-    for (Initializer initializer in initializers) {
-      if (initializer is RedirectingInitializer) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  late final bool _hasSuperInitializingFormals =
-      formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
-
-  @override
   void _addSuperParameterDefaultValueCloners(
       {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
       required Member superTarget,
@@ -692,6 +680,24 @@
         libraryBuilder: libraryBuilder);
   }
 
+  @override
+  Substitution computeFieldTypeSubstitution(
+      DeclarationBuilder declarationBuilder) {
+    return _encoding.computeFieldTypeSubstitution(
+        declarationBuilder, _typeParameters);
+  }
+
+  @override
+  void becomeNative(SourceLoader loader) {
+    _encoding.becomeNative(loader, _nativeMethodName!);
+  }
+}
+
+mixin _RegularConstructorDeclarationMixin
+    implements
+        _ConstructorDeclarationMixin,
+        _ConstructorEncodingMixin,
+        InferredTypeListener {
   void _buildTypeParametersAndFormals({
     required SourceLibraryBuilder libraryBuilder,
     required DeclarationBuilder declarationBuilder,
@@ -729,8 +735,7 @@
     function.returnType = type;
   }
 
-  @override
-  void registerInferable(Inferable inferable) {
+  void _registerInferable(Inferable inferable) {
     returnType.registerInferredTypeListener(this);
     if (formals != null) {
       for (FormalParameterBuilder formal in formals!) {
@@ -749,41 +754,25 @@
         _RegularConstructorDeclarationMixin
     implements ConstructorDeclaration, ConstructorFragmentDeclaration {
   final ConstructorFragment _fragment;
-  final List<FormalParameterBuilder>? _syntheticFormals;
 
   @override
-  final RegularConstructorEncoding _encoding;
+  late final ConstructorEncoding _encoding;
+
+  late final List<FormalParameterBuilder>? _formals;
 
   @override
-  final List<SourceNominalParameterBuilder>? _typeParameters;
+  late final List<SourceNominalParameterBuilder>? _typeParameters;
 
   @override
   Token? _beginInitializers;
 
-  RegularConstructorDeclaration(this._fragment,
-      {required List<FormalParameterBuilder>? syntheticFormals,
-      required List<SourceNominalParameterBuilder>? typeParameters,
-      // TODO(johnniwinther): Create a separate [ConstructorDeclaration] for
-      // enum constructors.
-      required bool isEnumConstructor})
-      : _typeParameters = typeParameters,
-        _syntheticFormals = syntheticFormals,
-        _beginInitializers = _fragment.beginInitializers,
-        _encoding = new RegularConstructorEncoding(
-            isExternal: _fragment.modifiers.isExternal,
-            isEnumConstructor: isEnumConstructor) {
+  RegularConstructorDeclaration(this._fragment)
+      : _beginInitializers = _fragment.beginInitializers {
     _fragment.declaration = this;
   }
 
   @override
-  void createEncoding(SourceConstructorBuilder builder) {
-    _fragment.builder = builder;
-  }
-
-  @override
-  void becomeNative(SourceLoader loader) {
-    _encoding.becomeNative(loader, _fragment.nativeMethodName!);
-  }
+  String? get _nativeMethodName => _fragment.nativeMethodName;
 
   @override
   LookupScope get _typeParameterScope => _fragment.typeParameterScope;
@@ -796,17 +785,51 @@
   OmittedTypeBuilder get returnType => _fragment.returnType;
 
   @override
-  late final List<FormalParameterBuilder>? formals = _syntheticFormals != null
-      ? [..._syntheticFormals, ...?_fragment.formals]
-      : _fragment.formals;
-
-  @override
   bool get isConst => _fragment.modifiers.isConst;
 
   @override
   bool get isExternal => _fragment.modifiers.isExternal;
 
   @override
+  int get fileOffset => _fragment.fullNameOffset;
+
+  @override
+  Uri get fileUri => _fragment.fileUri;
+
+  @override
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  }) {
+    _fragment.builder = constructorBuilder;
+    _typeParameters = encodingStrategy.createTypeParameters(
+        declarationBuilder: declarationBuilder,
+        declarationTypeParameterFragments:
+            _fragment.enclosingDeclaration.typeParameters,
+        typeParameters: createNominalParameterBuilders(
+            _fragment.typeParameters, unboundNominalParameters),
+        unboundNominalParameters: unboundNominalParameters);
+    _fragment.typeParameterNameSpace.addTypeParameters(
+        problemReporting, _typeParameters,
+        ownerName: _fragment.name, allowNameConflict: true);
+    _formals = encodingStrategy.createFormals(
+        loader: loader,
+        formals: _fragment.formals,
+        fileUri: _fragment.fileUri,
+        fileOffset: _fragment.fullNameOffset);
+    _encoding = encodingStrategy.createEncoding(
+        isExternal: _fragment.modifiers.isExternal);
+    _registerInferable(constructorBuilder);
+  }
+
+  @override
+  List<FormalParameterBuilder>? get formals => _formals;
+
+  @override
   void buildOutlineNodes(BuildNodesCallback f,
       {required SourceConstructorBuilder constructorBuilder,
       required SourceLibraryBuilder libraryBuilder,
@@ -816,8 +839,7 @@
     _encoding.buildOutlineNodes(f,
         constructorBuilder: constructorBuilder,
         libraryBuilder: libraryBuilder,
-        declarationBuilder:
-            constructorBuilder.declarationBuilder as SourceClassBuilder,
+        declarationBuilder: constructorBuilder.declarationBuilder,
         name: _fragment.name,
         nameScheme: nameScheme,
         constructorReferences: constructorReferences,
@@ -868,129 +890,6 @@
         classHierarchy: classHierarchy,
         typeParameterScope: _fragment.typeParameterScope);
   }
-
-  @override
-  int get fileOffset => _fragment.fullNameOffset;
-
-  @override
-  Uri get fileUri => _fragment.fileUri;
-}
-
-// Coverage-ignore(suite): Not run.
-class PrimaryConstructorDeclaration
-    with
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        _RegularConstructorDeclarationMixin
-    implements ConstructorDeclaration, ConstructorFragmentDeclaration {
-  final PrimaryConstructorFragment _fragment;
-
-  @override
-  final RegularConstructorEncoding _encoding;
-
-  @override
-  Token? _beginInitializers;
-
-  PrimaryConstructorDeclaration(this._fragment)
-      : _beginInitializers = _fragment.beginInitializers,
-        _encoding = new RegularConstructorEncoding(
-            isExternal: _fragment.modifiers.isExternal,
-            isEnumConstructor: false) {
-    _fragment.declaration = this;
-  }
-
-  @override
-  void createEncoding(SourceConstructorBuilder builder) {
-    _fragment.builder = builder;
-  }
-
-  @override
-  void becomeNative(SourceLoader loader) {
-    throw new UnsupportedError("$runtimeType.becomeNative()");
-  }
-
-  @override
-  LookupScope get _typeParameterScope => _fragment.typeParameterScope;
-
-  @override
-  OmittedTypeBuilder get returnType => _fragment.returnType;
-
-  @override
-  List<MetadataBuilder>? get metadata => null;
-
-  @override
-  List<FormalParameterBuilder>? get formals => _fragment.formals;
-
-  @override
-  List<SourceNominalParameterBuilder>? get _typeParameters => null;
-
-  @override
-  bool get isConst => _fragment.modifiers.isConst;
-
-  @override
-  bool get isExternal => _fragment.modifiers.isExternal;
-
-  @override
-  void buildOutlineNodes(BuildNodesCallback f,
-      {required SourceConstructorBuilder constructorBuilder,
-      required SourceLibraryBuilder libraryBuilder,
-      required NameScheme nameScheme,
-      required ConstructorReferences? constructorReferences,
-      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
-    _encoding.buildOutlineNodes(f,
-        constructorBuilder: constructorBuilder,
-        libraryBuilder: libraryBuilder,
-        declarationBuilder:
-            constructorBuilder.declarationBuilder as SourceClassBuilder,
-        name: _fragment.name,
-        nameScheme: nameScheme,
-        constructorReferences: constructorReferences,
-        fileUri: _fragment.fileUri,
-        startOffset: _fragment.startOffset,
-        fileOffset: _fragment.fileOffset,
-        formalsOffset: _fragment.formalsOffset,
-        // TODO(johnniwinther): Provide `endOffset`.
-        endOffset: _fragment.formalsOffset,
-        isSynthetic: false,
-        forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin,
-        isConst: _fragment.modifiers.isConst,
-        returnType: returnType,
-        typeParameters: _typeParameters,
-        formals: formals,
-        delayedDefaultValueCloners: delayedDefaultValueCloners);
-  }
-
-  @override
-  void _buildMetadataForOutlineExpressions(
-      {required Iterable<Annotatable> annotatables,
-      required Uri annotatablesFileUri,
-      required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required SourceConstructorBuilder constructorBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    // There is no metadata on a primary constructor.
-  }
-
-  @override
-  void _buildTypeParametersAndFormalsForOutlineExpressions(
-      {required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    _buildTypeParametersAndFormals(
-        libraryBuilder: libraryBuilder,
-        declarationBuilder: declarationBuilder,
-        bodyBuilderContext: bodyBuilderContext,
-        classHierarchy: classHierarchy,
-        typeParameterScope: _fragment.typeParameterScope);
-  }
-
-  @override
-  int get fileOffset => _fragment.fileOffset;
-
-  @override
-  Uri get fileUri => _fragment.fileUri;
 }
 
 class DefaultEnumConstructorDeclaration
@@ -1012,8 +911,7 @@
   final List<FormalParameterBuilder> formals;
 
   @override
-  final RegularConstructorEncoding _encoding = new RegularConstructorEncoding(
-      isExternal: false, isEnumConstructor: true);
+  late final ConstructorEncoding _encoding;
 
   /// The scope in which to build the formal parameters.
   final LookupScope _lookupScope;
@@ -1036,8 +934,17 @@
         _beginInitializers = new Token.eof(-1);
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void createEncoding(SourceConstructorBuilder builder) {}
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  }) {
+    _encoding = encodingStrategy.createEncoding(isExternal: false);
+    _registerInferable(constructorBuilder);
+  }
 
   @override
   void becomeNative(SourceLoader loader) {
@@ -1070,8 +977,7 @@
     _encoding.buildOutlineNodes(f,
         constructorBuilder: constructorBuilder,
         libraryBuilder: libraryBuilder,
-        declarationBuilder:
-            constructorBuilder.declarationBuilder as SourceClassBuilder,
+        declarationBuilder: constructorBuilder.declarationBuilder,
         name: '',
         nameScheme: nameScheme,
         constructorReferences: constructorReferences,
@@ -1114,84 +1020,67 @@
         classHierarchy: classHierarchy,
         typeParameterScope: _lookupScope);
   }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  String? get _nativeMethodName => null;
 }
 
-mixin _ExtensionTypeConstructorDeclarationMixin
+class PrimaryConstructorDeclaration
+    with _ConstructorDeclarationMixin, _ConstructorEncodingMixin
     implements
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
+        ConstructorDeclaration,
+        ConstructorFragmentDeclaration,
         InferredTypeListener {
-  @override
-  ExtensionTypeConstructorEncoding get _encoding;
+  final PrimaryConstructorFragment _fragment;
+
+  late final List<FormalParameterBuilder>? _formals;
 
   @override
-  void registerFunctionBody(Statement value) {
-    _encoding.registerFunctionBody(value);
+  late final List<SourceNominalParameterBuilder>? _typeParameters;
+
+  @override
+  late final ConstructorEncoding _encoding;
+
+  @override
+  Token? _beginInitializers;
+
+  PrimaryConstructorDeclaration(this._fragment)
+      : _beginInitializers = _fragment.beginInitializers {
+    _fragment.declaration = this;
   }
 
   @override
-  void registerNoBodyConstructor() {
-    _encoding.registerNoBodyConstructor();
-  }
+  // Coverage-ignore(suite): Not run.
+  String? get _nativeMethodName => null;
 
   @override
-  VariableDeclaration? get thisVariable => _encoding.thisVariable;
-
-  @override
-  List<TypeParameter>? get thisTypeParameters => _encoding.thisTypeParameters;
-
-  @override
-  void becomeNative(SourceLoader loader) {
-    throw new UnsupportedError("$runtimeType.becomeNative()");
-  }
-
-  @override
-  Substitution computeFieldTypeSubstitution(
-      DeclarationBuilder declarationBuilder) {
-    if (_typeParameters != null) {
-      assert(
-          declarationBuilder.typeParameters!.length == _typeParameters?.length);
-      return Substitution.fromPairs(
-          (declarationBuilder as SourceExtensionTypeDeclarationBuilder)
-              .extensionTypeDeclaration
-              .typeParameters,
-          new List<DartType>.generate(
-              declarationBuilder.typeParameters!.length,
-              (int index) => new TypeParameterType.withDefaultNullability(
-                  function.typeParameters[index])));
-    } else {
-      return Substitution.empty;
-    }
-  }
-
-  @override
-  void buildBody() {
-    _encoding.buildBody();
-  }
-
-  @override
-  bool get isRedirecting {
-    for (Initializer initializer in initializers) {
-      if (initializer is ExtensionTypeRedirectingInitializer) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  late final bool _hasSuperInitializingFormals =
-      formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
-
-  @override
-  void _addSuperParameterDefaultValueCloners(
-      {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
-      required Member superTarget,
-      required List<int?>? positionalSuperParameters,
-      required List<String>? namedSuperParameters,
-      required SourceLibraryBuilder libraryBuilder}) {
-    throw new UnsupportedError(
-        '$runtimeType.addSuperParameterDefaultValueCloners');
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  }) {
+    _fragment.builder = constructorBuilder;
+    _typeParameters = encodingStrategy.createTypeParameters(
+        declarationBuilder: declarationBuilder,
+        declarationTypeParameterFragments:
+            _fragment.enclosingDeclaration.typeParameters,
+        typeParameters: null,
+        unboundNominalParameters: unboundNominalParameters);
+    _fragment.typeParameterNameSpace.addTypeParameters(
+        problemReporting, _typeParameters,
+        ownerName: _fragment.name, allowNameConflict: true);
+    _formals = encodingStrategy.createFormals(
+        loader: loader,
+        formals: _fragment.formals,
+        fileUri: _fragment.fileUri,
+        fileOffset: _fragment.fileOffset);
+    _encoding = encodingStrategy.createEncoding(
+        isExternal: _fragment.modifiers.isExternal);
+    _registerInferable(constructorBuilder);
   }
 
   void _buildTypeParametersAndFormals({
@@ -1231,167 +1120,18 @@
     function.returnType = type;
   }
 
-  @override
-  void registerInferable(Inferable inferable) {
+  void _registerInferable(Inferable inferable) {
     returnType.registerInferredTypeListener(this);
     if (formals != null) {
       for (FormalParameterBuilder formal in formals!) {
-        if (formal.isInitializingFormal || formal.isSuperInitializingFormal) {
+        if (formal.isInitializingFormal ||
+            // Coverage-ignore(suite): Not run.
+            formal.isSuperInitializingFormal) {
           formal.type.registerInferable(inferable);
         }
       }
     }
   }
-}
-
-class ExtensionTypeConstructorDeclaration
-    with
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        _ExtensionTypeConstructorDeclarationMixin
-    implements ConstructorDeclaration, ConstructorFragmentDeclaration {
-  final ConstructorFragment _fragment;
-
-  @override
-  final List<SourceNominalParameterBuilder>? _typeParameters;
-
-  @override
-  final ExtensionTypeConstructorEncoding _encoding;
-
-  @override
-  Token? _beginInitializers;
-
-  ExtensionTypeConstructorDeclaration(this._fragment,
-      {required List<SourceNominalParameterBuilder>? typeParameters})
-      : _typeParameters = typeParameters,
-        _beginInitializers = _fragment.beginInitializers,
-        _encoding = new ExtensionTypeConstructorEncoding(
-            isExternal: _fragment.modifiers.isExternal) {
-    _fragment.declaration = this;
-  }
-
-  @override
-  void createEncoding(SourceConstructorBuilder builder) {
-    _fragment.builder = builder;
-  }
-
-  @override
-  LookupScope get _typeParameterScope => _fragment.typeParameterScope;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  List<MetadataBuilder>? get metadata => _fragment.metadata;
-
-  @override
-  OmittedTypeBuilder get returnType => _fragment.returnType;
-
-  @override
-  List<FormalParameterBuilder>? get formals => _fragment.formals;
-
-  @override
-  bool get isConst => _fragment.modifiers.isConst;
-
-  @override
-  bool get isExternal => _fragment.modifiers.isExternal;
-
-  @override
-  void buildOutlineNodes(BuildNodesCallback f,
-      {required SourceConstructorBuilder constructorBuilder,
-      required SourceLibraryBuilder libraryBuilder,
-      required NameScheme nameScheme,
-      required ConstructorReferences? constructorReferences,
-      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
-    _encoding.buildOutlineNodes(f,
-        constructorBuilder: constructorBuilder,
-        libraryBuilder: libraryBuilder,
-        declarationBuilder: constructorBuilder.declarationBuilder
-            as SourceExtensionTypeDeclarationBuilder,
-        name: _fragment.name,
-        nameScheme: nameScheme,
-        constructorReferences: constructorReferences,
-        fileUri: _fragment.fileUri,
-        fileOffset: _fragment.fullNameOffset,
-        formalsOffset: _fragment.formalsOffset,
-        endOffset: _fragment.endOffset,
-        forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin,
-        isConst: _fragment.modifiers.isConst,
-        returnType: returnType,
-        typeParameters: _typeParameters,
-        formals: formals,
-        delayedDefaultValueCloners: delayedDefaultValueCloners);
-  }
-
-  @override
-  void _buildMetadataForOutlineExpressions(
-      {required Iterable<Annotatable> annotatables,
-      required Uri annotatablesFileUri,
-      required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required SourceConstructorBuilder constructorBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    for (Annotatable annotatable in annotatables) {
-      MetadataBuilder.buildAnnotations(
-          annotatable: annotatable,
-          annotatableFileUri: annotatablesFileUri,
-          metadata: _fragment.metadata,
-          bodyBuilderContext: bodyBuilderContext,
-          libraryBuilder: libraryBuilder,
-          scope: _fragment.enclosingScope);
-    }
-  }
-
-  @override
-  void _buildTypeParametersAndFormalsForOutlineExpressions(
-      {required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    _buildTypeParametersAndFormals(
-        libraryBuilder: libraryBuilder,
-        declarationBuilder: declarationBuilder,
-        bodyBuilderContext: bodyBuilderContext,
-        classHierarchy: classHierarchy,
-        typeParameterScope: _fragment.typeParameterScope);
-  }
-
-  @override
-  int get fileOffset => _fragment.fullNameOffset;
-
-  @override
-  Uri get fileUri => _fragment.fileUri;
-}
-
-class ExtensionTypePrimaryConstructorDeclaration
-    with
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        _ExtensionTypeConstructorDeclarationMixin
-    implements ConstructorDeclaration, ConstructorFragmentDeclaration {
-  final PrimaryConstructorFragment _fragment;
-
-  @override
-  final List<SourceNominalParameterBuilder>? _typeParameters;
-
-  @override
-  final ExtensionTypeConstructorEncoding _encoding;
-
-  @override
-  Token? _beginInitializers;
-
-  ExtensionTypePrimaryConstructorDeclaration(this._fragment,
-      {required List<SourceNominalParameterBuilder>? typeParameters})
-      : _typeParameters = typeParameters,
-        _beginInitializers = _fragment.beginInitializers,
-        _encoding = new ExtensionTypeConstructorEncoding(
-            isExternal: _fragment.modifiers.isExternal) {
-    _fragment.declaration = this;
-  }
-
-  @override
-  void createEncoding(SourceConstructorBuilder builder) {
-    _fragment.builder = builder;
-  }
 
   @override
   LookupScope get _typeParameterScope => _fragment.typeParameterScope;
@@ -1404,7 +1144,7 @@
   OmittedTypeBuilder get returnType => _fragment.returnType;
 
   @override
-  List<FormalParameterBuilder>? get formals => _fragment.formals;
+  List<FormalParameterBuilder>? get formals => _formals;
 
   @override
   bool get isConst => _fragment.modifiers.isConst;
@@ -1429,11 +1169,13 @@
         constructorReferences: constructorReferences,
         fileUri: _fragment.fileUri,
         fileOffset: _fragment.fileOffset,
+        startOffset: _fragment.startOffset,
         formalsOffset: _fragment.formalsOffset,
         // TODO(johnniwinther): Provide `endOffset`.
         endOffset: _fragment.formalsOffset,
         forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin,
         isConst: _fragment.modifiers.isConst,
+        isSynthetic: false,
         returnType: returnType,
         typeParameters: _typeParameters,
         formals: formals,
@@ -1473,267 +1215,6 @@
   Uri get fileUri => _fragment.fileUri;
 }
 
-mixin _ExtensionConstructorDeclarationMixin
-    implements
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        InferredTypeListener {
-  @override
-  ExtensionConstructorEncoding get _encoding;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void registerFunctionBody(Statement value) {
-    _encoding.registerFunctionBody(value);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void registerNoBodyConstructor() {
-    _encoding.registerNoBodyConstructor();
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  VariableDeclaration? get thisVariable => _encoding.thisVariable;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  List<TypeParameter>? get thisTypeParameters => _encoding.thisTypeParameters;
-
-  @override
-  void becomeNative(SourceLoader loader) {
-    throw new UnsupportedError("$runtimeType.becomeNative()");
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  Substitution computeFieldTypeSubstitution(
-      DeclarationBuilder declarationBuilder) {
-    if (_typeParameters != null) {
-      assert(
-          declarationBuilder.typeParameters!.length == _typeParameters?.length);
-      return Substitution.fromPairs(
-          (declarationBuilder as SourceExtensionTypeDeclarationBuilder)
-              .extensionTypeDeclaration
-              .typeParameters,
-          new List<DartType>.generate(
-              declarationBuilder.typeParameters!.length,
-              (int index) => new TypeParameterType.withDefaultNullability(
-                  function.typeParameters[index])));
-    } else {
-      return Substitution.empty;
-    }
-  }
-
-  @override
-  void buildBody() {
-    _encoding.buildBody();
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isRedirecting {
-    for (Initializer initializer in initializers) {
-      if (initializer is ExtensionTypeRedirectingInitializer) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @override
-  late final bool _hasSuperInitializingFormals =
-      formals?.any((formal) => formal.isSuperInitializingFormal) ?? false;
-
-  @override
-  void _addSuperParameterDefaultValueCloners(
-      {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
-      required Member superTarget,
-      required List<int?>? positionalSuperParameters,
-      required List<String>? namedSuperParameters,
-      required SourceLibraryBuilder libraryBuilder}) {
-    throw new UnsupportedError(
-        '$runtimeType.addSuperParameterDefaultValueCloners');
-  }
-
-  // Coverage-ignore(suite): Not run.
-  void _buildTypeParametersAndFormals({
-    required SourceLibraryBuilder libraryBuilder,
-    required DeclarationBuilder declarationBuilder,
-    required BodyBuilderContext bodyBuilderContext,
-    required ClassHierarchy classHierarchy,
-    required LookupScope typeParameterScope,
-  }) {
-    if (_typeParameters != null) {
-      for (int i = 0; i < _typeParameters!.length; i++) {
-        _typeParameters![i].buildOutlineExpressions(
-            libraryBuilder, bodyBuilderContext, classHierarchy);
-      }
-    }
-
-    if (formals != null) {
-      // For const constructors we need to include default parameter values
-      // into the outline. For all other formals we need to call
-      // buildOutlineExpressions to clear initializerToken to prevent
-      // consuming too much memory.
-      for (FormalParameterBuilder formal in formals!) {
-        formal.buildOutlineExpressions(libraryBuilder, declarationBuilder,
-            scope: typeParameterScope, buildDefaultValue: true);
-      }
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  BodyBuilderContext createBodyBuilderContext(
-      SourceConstructorBuilder constructorBuilder) {
-    return _encoding.createBodyBuilderContext(constructorBuilder, this);
-  }
-
-  @override
-  void onInferredType(DartType type) {
-    function.returnType = type;
-  }
-
-  @override
-  void registerInferable(Inferable inferable) {
-    returnType.registerInferredTypeListener(this);
-    if (formals != null) {
-      for (FormalParameterBuilder formal in formals!) {
-        if (formal.isInitializingFormal || formal.isSuperInitializingFormal) {
-          // Coverage-ignore-block(suite): Not run.
-          formal.type.registerInferable(inferable);
-        }
-      }
-    }
-  }
-}
-
-class ExtensionConstructorDeclaration
-    with
-        _ConstructorDeclarationMixin,
-        _ConstructorEncodingMixin,
-        _ExtensionConstructorDeclarationMixin
-    implements ConstructorDeclaration, ConstructorFragmentDeclaration {
-  final ConstructorFragment _fragment;
-
-  @override
-  final List<SourceNominalParameterBuilder>? _typeParameters;
-
-  @override
-  final ExtensionConstructorEncoding _encoding;
-
-  @override
-  Token? _beginInitializers;
-
-  ExtensionConstructorDeclaration(this._fragment,
-      {required List<SourceNominalParameterBuilder>? typeParameters})
-      : _typeParameters = typeParameters,
-        _beginInitializers = _fragment.beginInitializers,
-        _encoding = new ExtensionConstructorEncoding(
-            isExternal: _fragment.modifiers.isExternal) {
-    _fragment.declaration = this;
-  }
-
-  @override
-  void createEncoding(SourceConstructorBuilder builder) {
-    _fragment.builder = builder;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  LookupScope get _typeParameterScope => _fragment.typeParameterScope;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  List<MetadataBuilder>? get metadata => _fragment.metadata;
-
-  @override
-  OmittedTypeBuilder get returnType => _fragment.returnType;
-
-  @override
-  List<FormalParameterBuilder>? get formals => _fragment.formals;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isConst => _fragment.modifiers.isConst;
-
-  @override
-  bool get isExternal => _fragment.modifiers.isExternal;
-
-  @override
-  void buildOutlineNodes(BuildNodesCallback f,
-      {required SourceConstructorBuilder constructorBuilder,
-      required SourceLibraryBuilder libraryBuilder,
-      required NameScheme nameScheme,
-      required ConstructorReferences? constructorReferences,
-      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
-    _encoding.buildOutlineNodes(f,
-        constructorBuilder: constructorBuilder,
-        libraryBuilder: libraryBuilder,
-        declarationBuilder:
-            constructorBuilder.declarationBuilder as SourceExtensionBuilder,
-        name: _fragment.name,
-        nameScheme: nameScheme,
-        constructorReferences: constructorReferences,
-        fileUri: _fragment.fileUri,
-        fileOffset: _fragment.fullNameOffset,
-        formalsOffset: _fragment.formalsOffset,
-        endOffset: _fragment.endOffset,
-        forAbstractClassOrEnumOrMixin: _fragment.forAbstractClassOrMixin,
-        isConst: _fragment.modifiers.isConst,
-        returnType: returnType,
-        typeParameters: _typeParameters,
-        formals: formals,
-        delayedDefaultValueCloners: delayedDefaultValueCloners);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void _buildMetadataForOutlineExpressions(
-      {required Iterable<Annotatable> annotatables,
-      required Uri annotatablesFileUri,
-      required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required SourceConstructorBuilder constructorBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    for (Annotatable annotatable in annotatables) {
-      MetadataBuilder.buildAnnotations(
-          annotatable: annotatable,
-          annotatableFileUri: annotatablesFileUri,
-          metadata: _fragment.metadata,
-          bodyBuilderContext: bodyBuilderContext,
-          libraryBuilder: libraryBuilder,
-          scope: _fragment.enclosingScope);
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void _buildTypeParametersAndFormalsForOutlineExpressions(
-      {required SourceLibraryBuilder libraryBuilder,
-      required DeclarationBuilder declarationBuilder,
-      required BodyBuilderContext bodyBuilderContext,
-      required ClassHierarchy classHierarchy}) {
-    _buildTypeParametersAndFormals(
-        libraryBuilder: libraryBuilder,
-        declarationBuilder: declarationBuilder,
-        bodyBuilderContext: bodyBuilderContext,
-        classHierarchy: classHierarchy,
-        typeParameterScope: _fragment.typeParameterScope);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  int get fileOffset => _fragment.fullNameOffset;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  Uri get fileUri => _fragment.fileUri;
-}
-
 /// Interface for using a [ConstructorFragment] or [PrimaryConstructorFragment]
 /// to create a [BodyBuilderContext].
 abstract class ConstructorFragmentDeclaration {
@@ -1851,13 +1332,6 @@
   }
 
   @override
-  Substitution computeFieldTypeSubstitution(
-      DeclarationBuilder declarationBuilder) {
-    throw new UnsupportedError(
-        "Unexpected call to $runtimeType.computeFieldTypeSubstitution");
-  }
-
-  @override
   List<Initializer> get initializers {
     throw new UnsupportedError("Unexpected call to $runtimeType.initializers");
   }
@@ -1875,7 +1349,11 @@
   }
 
   @override
-  void registerInferable(Inferable inferable) {}
+  // Coverage-ignore(suite): Not run.
+  Substitution computeFieldTypeSubstitution(
+      DeclarationBuilder declarationBuilder) {
+    return Substitution.empty;
+  }
 }
 
 class DefaultConstructorDeclaration
@@ -1895,7 +1373,14 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  void createEncoding(SourceConstructorBuilder builder) {}
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  }) {}
 
   @override
   void addSuperParameterDefaultValueCloners(
@@ -1957,7 +1442,14 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  void createEncoding(SourceConstructorBuilder builder) {}
+  void createEncoding({
+    required ProblemReporting problemReporting,
+    required SourceLoader loader,
+    required DeclarationBuilder declarationBuilder,
+    required SourceConstructorBuilder constructorBuilder,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+    required ConstructorEncodingStrategy encodingStrategy,
+  }) {}
 
   @override
   void addSuperParameterDefaultValueCloners(
diff --git a/pkg/front_end/lib/src/fragment/constructor/encoding.dart b/pkg/front_end/lib/src/fragment/constructor/encoding.dart
index c82cf9f..02aabb0 100644
--- a/pkg/front_end/lib/src/fragment/constructor/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/constructor/encoding.dart
@@ -2,18 +2,22 @@
 // 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:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
 import '../../api_prototype/lowering_predicates.dart';
+import '../../base/modifiers.dart';
 import '../../builder/declaration_builders.dart';
 import '../../builder/formal_parameter_builder.dart';
+import '../../builder/named_type_builder.dart';
 import '../../builder/omitted_type_builder.dart';
 import '../../builder/type_builder.dart';
 import '../../kernel/body_builder_context.dart';
 import '../../kernel/constructor_tearoff_lowering.dart';
 import '../../kernel/internal_ast.dart';
 import '../../kernel/kernel_helper.dart';
+import '../../source/builder_factory.dart';
 import '../../source/name_scheme.dart';
 import '../../source/source_class_builder.dart';
 import '../../source/source_constructor_builder.dart';
@@ -25,6 +29,7 @@
 import '../../source/source_member_builder.dart';
 import '../../source/source_type_parameter_builder.dart';
 import '../../type_inference/type_schema.dart';
+import '../fragment.dart';
 import 'body_builder_context.dart';
 import 'declaration.dart';
 
@@ -41,12 +46,63 @@
 
   VariableDeclaration? getTearOffParameter(int index);
 
+  VariableDeclaration? get thisVariable;
+
+  List<TypeParameter>? get thisTypeParameters;
+
   /// Mark the constructor as erroneous.
   ///
   /// This is used during the compilation phase to set the appropriate flag on
   /// the input AST node. The flag helps the verifier to skip apriori erroneous
   /// members and to avoid reporting cascading errors.
   void markAsErroneous();
+
+  void buildOutlineNodes(
+    BuildNodesCallback f, {
+    required SourceConstructorBuilder constructorBuilder,
+    required SourceLibraryBuilder libraryBuilder,
+    required covariant DeclarationBuilder declarationBuilder,
+    required String name,
+    required NameScheme nameScheme,
+    required ConstructorReferences? constructorReferences,
+    required Uri fileUri,
+    required int startOffset,
+    required int fileOffset,
+    required int formalsOffset,
+    required int endOffset,
+    required bool forAbstractClassOrEnumOrMixin,
+    required bool isConst,
+    required bool isSynthetic,
+    required TypeBuilder returnType,
+    required List<SourceNominalParameterBuilder>? typeParameters,
+    required List<FormalParameterBuilder>? formals,
+    required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
+  });
+
+  void buildBody();
+
+  BodyBuilderContext createBodyBuilderContext(
+      SourceConstructorBuilder constructorBuilder,
+      ConstructorFragmentDeclaration constructorDeclaration);
+
+  void registerFunctionBody(Statement value);
+
+  void registerNoBodyConstructor();
+
+  void addSuperParameterDefaultValueCloners(
+      {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
+      required Member superTarget,
+      required List<int?>? positionalSuperParameters,
+      required List<String>? namedSuperParameters,
+      required SourceLibraryBuilder libraryBuilder});
+
+  void becomeNative(SourceLoader loader, String nativeMethodName);
+
+  Substitution computeFieldTypeSubstitution(
+      covariant DeclarationBuilder declarationBuilder,
+      List<SourceNominalParameterBuilder>? typeParameters);
+
+  bool get isRedirecting;
 }
 
 class RegularConstructorEncoding implements ConstructorEncoding {
@@ -65,10 +121,12 @@
       : _isExternal = isExternal,
         _isEnumConstructor = isEnumConstructor;
 
+  @override
   void registerFunctionBody(Statement value) {
     function.body = value..parent = function;
   }
 
+  @override
   void registerNoBodyConstructor() {
     if (!_isExternal) {
       registerFunctionBody(new EmptyStatement());
@@ -87,6 +145,23 @@
   @override
   List<Initializer> get initializers => _constructor.initializers;
 
+  @override
+  bool get isRedirecting {
+    for (Initializer initializer in initializers) {
+      if (initializer is RedirectingInitializer) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  VariableDeclaration? get thisVariable => null;
+
+  @override
+  List<TypeParameter>? get thisTypeParameters => null;
+
+  @override
   void buildOutlineNodes(
     BuildNodesCallback f, {
     required SourceConstructorBuilder constructorBuilder,
@@ -233,6 +308,9 @@
   }
 
   @override
+  void buildBody() {}
+
+  @override
   void prepareInitializers() {
     // For const constructors we parse initializers already at the outlining
     // stage, there is no easy way to make body building stage skip initializer
@@ -256,6 +334,7 @@
     _constructor.initializers.insert(0, initializer);
   }
 
+  @override
   void becomeNative(SourceLoader loader, String nativeMethodName) {
     _constructor.isExternal = true;
 
@@ -295,6 +374,7 @@
 
   bool _hasAddedDefaultValueCloners = false;
 
+  @override
   void addSuperParameterDefaultValueCloners(
       {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
       required Member superTarget,
@@ -323,6 +403,7 @@
     }
   }
 
+  @override
   BodyBuilderContext createBodyBuilderContext(
       SourceConstructorBuilder constructorBuilder,
       ConstructorFragmentDeclaration constructorDeclaration) {
@@ -334,6 +415,15 @@
   void markAsErroneous() {
     _constructor.isErroneous = true;
   }
+
+  @override
+  Substitution computeFieldTypeSubstitution(
+      covariant DeclarationBuilder declarationBuilder,
+      List<SourceNominalParameterBuilder>? typeParameters) {
+    // Nothing to substitute. Regular generative constructors don't have their
+    // own type parameters.
+    return Substitution.empty;
+  }
 }
 
 mixin _ExtensionTypeConstructorEncodingMixin<T extends DeclarationBuilder>
@@ -365,10 +455,12 @@
   @override
   List<Initializer> get initializers => _initializers;
 
+  @override
   void registerFunctionBody(Statement value) {
     function.body = value..parent = function;
   }
 
+  @override
   void registerNoBodyConstructor() {
     if (!_hasBuiltBody && !_isExternal) {
       registerFunctionBody(new EmptyStatement());
@@ -495,12 +587,14 @@
     }
   }
 
+  @override
   VariableDeclaration? get thisVariable {
     assert(_thisVariable != null,
         "ProcedureBuilder.thisVariable has not been set.");
     return _thisVariable;
   }
 
+  @override
   List<TypeParameter>? get thisTypeParameters {
     // Use [_thisVariable] as marker for whether this type parameters have
     // been computed.
@@ -561,6 +655,7 @@
 
   bool _hasBuiltBody = false;
 
+  @override
   void buildBody() {
     if (_hasBuiltBody) {
       return;
@@ -583,6 +678,7 @@
     _hasBuiltBody = true;
   }
 
+  @override
   BodyBuilderContext createBodyBuilderContext(
       SourceConstructorBuilder constructorBuilder,
       ConstructorFragmentDeclaration constructorDeclaration) {
@@ -594,6 +690,22 @@
   void markAsErroneous() {
     _constructor.isErroneous = true;
   }
+
+  @override
+  void addSuperParameterDefaultValueCloners(
+      {required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
+      required Member superTarget,
+      required List<int?>? positionalSuperParameters,
+      required List<String>? namedSuperParameters,
+      required SourceLibraryBuilder libraryBuilder}) {
+    throw new UnsupportedError(
+        '$runtimeType.addSuperParameterDefaultValueCloners');
+  }
+
+  @override
+  void becomeNative(SourceLoader loader, String nativeMethodName) {
+    throw new UnsupportedError('$runtimeType.becomeNative');
+  }
 }
 
 class _ExtensionTypeInitializerToStatementConverter
@@ -687,6 +799,7 @@
         extensionTypeDeclaration, Nullability.nonNullable, typeArguments);
   }
 
+  @override
   void buildOutlineNodes(
     BuildNodesCallback f, {
     required SourceConstructorBuilder constructorBuilder,
@@ -696,11 +809,13 @@
     required NameScheme nameScheme,
     required ConstructorReferences? constructorReferences,
     required Uri fileUri,
+    required int startOffset,
     required int fileOffset,
     required int formalsOffset,
     required int endOffset,
     required bool forAbstractClassOrEnumOrMixin,
     required bool isConst,
+    required bool isSynthetic,
     required TypeBuilder returnType,
     required List<SourceNominalParameterBuilder>? typeParameters,
     required List<FormalParameterBuilder>? formals,
@@ -734,6 +849,36 @@
 
   @override
   bool get _isExtensionTypeMember => true;
+
+  @override
+  Substitution computeFieldTypeSubstitution(
+      DeclarationBuilder declarationBuilder,
+      List<SourceNominalParameterBuilder>? typeParameters) {
+    if (typeParameters != null) {
+      assert(
+          declarationBuilder.typeParameters!.length == typeParameters.length);
+      return Substitution.fromPairs(
+          (declarationBuilder as SourceExtensionTypeDeclarationBuilder)
+              .extensionTypeDeclaration
+              .typeParameters,
+          new List<DartType>.generate(
+              declarationBuilder.typeParameters!.length,
+              (int index) => new TypeParameterType.withDefaultNullability(
+                  function.typeParameters[index])));
+    } else {
+      return Substitution.empty;
+    }
+  }
+
+  @override
+  bool get isRedirecting {
+    for (Initializer initializer in initializers) {
+      if (initializer is ExtensionTypeRedirectingInitializer) {
+        return true;
+      }
+    }
+    return false;
+  }
 }
 
 class ExtensionConstructorEncoding
@@ -745,6 +890,7 @@
   ExtensionConstructorEncoding({required bool isExternal})
       : _isExternal = isExternal;
 
+  @override
   void buildOutlineNodes(
     BuildNodesCallback f, {
     required SourceConstructorBuilder constructorBuilder,
@@ -754,11 +900,13 @@
     required NameScheme nameScheme,
     required ConstructorReferences? constructorReferences,
     required Uri fileUri,
+    required int startOffset,
     required int fileOffset,
     required int formalsOffset,
     required int endOffset,
     required bool forAbstractClassOrEnumOrMixin,
     required bool isConst,
+    required bool isSynthetic,
     required TypeBuilder returnType,
     required List<SourceNominalParameterBuilder>? typeParameters,
     required List<FormalParameterBuilder>? formals,
@@ -798,4 +946,221 @@
     return Substitution.fromPairs(extension.typeParameters, typeArguments)
         .substituteType(extension.onType);
   }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Substitution computeFieldTypeSubstitution(
+      SourceExtensionBuilder declarationBuilder,
+      List<SourceNominalParameterBuilder>? typeParameters) {
+    if (typeParameters != null) {
+      assert(
+          declarationBuilder.typeParameters!.length == typeParameters.length);
+      return Substitution.fromPairs(
+          declarationBuilder.extension.typeParameters,
+          new List<DartType>.generate(
+              declarationBuilder.typeParameters!.length,
+              (int index) => new TypeParameterType.withDefaultNullability(
+                  function.typeParameters[index])));
+    } else {
+      return Substitution.empty;
+    }
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isRedirecting {
+    // TODO(johnniwinther): Update this if redirecting extension constructors
+    //  are supported.
+    return false;
+  }
+}
+
+abstract class ConstructorEncodingStrategy {
+  factory ConstructorEncodingStrategy(DeclarationBuilder declarationBuilder) {
+    switch (declarationBuilder) {
+      case ClassBuilder():
+        if (declarationBuilder.isEnum) {
+          return const EnumConstructorEncodingStrategy();
+        } else {
+          return const RegularConstructorEncodingStrategy();
+        }
+      case ExtensionBuilder():
+        return const ExtensionConstructorEncodingStrategy();
+      case ExtensionTypeDeclarationBuilder():
+        return const ExtensionTypeConstructorEncodingStrategy();
+    }
+  }
+
+  List<FormalParameterBuilder>? createFormals({
+    required SourceLoader loader,
+    required List<FormalParameterBuilder>? formals,
+    required Uri fileUri,
+    required int fileOffset,
+  });
+
+  List<SourceNominalParameterBuilder>? createTypeParameters({
+    required DeclarationBuilder declarationBuilder,
+    required List<TypeParameterFragment>? declarationTypeParameterFragments,
+    required List<SourceNominalParameterBuilder>? typeParameters,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+  });
+
+  ConstructorEncoding createEncoding({required bool isExternal});
+}
+
+class RegularConstructorEncodingStrategy
+    implements ConstructorEncodingStrategy {
+  const RegularConstructorEncodingStrategy();
+
+  @override
+  ConstructorEncoding createEncoding({required bool isExternal}) {
+    return new RegularConstructorEncoding(
+        isExternal: isExternal, isEnumConstructor: false);
+  }
+
+  @override
+  List<FormalParameterBuilder>? createFormals(
+      {required SourceLoader loader,
+      required List<FormalParameterBuilder>? formals,
+      required Uri fileUri,
+      required int fileOffset}) {
+    return formals;
+  }
+
+  @override
+  List<SourceNominalParameterBuilder>? createTypeParameters(
+      {required DeclarationBuilder declarationBuilder,
+      required List<TypeParameterFragment>? declarationTypeParameterFragments,
+      required List<SourceNominalParameterBuilder>? typeParameters,
+      required List<NominalParameterBuilder> unboundNominalParameters}) {
+    return typeParameters;
+  }
+}
+
+class EnumConstructorEncodingStrategy implements ConstructorEncodingStrategy {
+  const EnumConstructorEncodingStrategy();
+
+  @override
+  ConstructorEncoding createEncoding({required bool isExternal}) {
+    return new RegularConstructorEncoding(
+        isExternal: isExternal, isEnumConstructor: true);
+  }
+
+  @override
+  List<FormalParameterBuilder>? createFormals({
+    required SourceLoader loader,
+    required List<FormalParameterBuilder>? formals,
+    required Uri fileUri,
+    required int fileOffset,
+  }) {
+    return [
+      new FormalParameterBuilder(FormalParameterKind.requiredPositional,
+          Modifiers.empty, loader.target.intType, "#index", fileOffset,
+          fileUri: fileUri, hasImmediatelyDeclaredInitializer: false),
+      new FormalParameterBuilder(FormalParameterKind.requiredPositional,
+          Modifiers.empty, loader.target.stringType, "#name", fileOffset,
+          fileUri: fileUri, hasImmediatelyDeclaredInitializer: false),
+      ...?formals
+    ];
+  }
+
+  @override
+  List<SourceNominalParameterBuilder>? createTypeParameters(
+      {required DeclarationBuilder declarationBuilder,
+      required List<TypeParameterFragment>? declarationTypeParameterFragments,
+      required List<SourceNominalParameterBuilder>? typeParameters,
+      required List<NominalParameterBuilder> unboundNominalParameters}) {
+    return typeParameters;
+  }
+}
+
+class ExtensionConstructorEncodingStrategy
+    implements ConstructorEncodingStrategy {
+  const ExtensionConstructorEncodingStrategy();
+
+  @override
+  ConstructorEncoding createEncoding({required bool isExternal}) {
+    return new ExtensionConstructorEncoding(isExternal: isExternal);
+  }
+
+  @override
+  List<FormalParameterBuilder>? createFormals(
+      {required SourceLoader loader,
+      required List<FormalParameterBuilder>? formals,
+      required Uri fileUri,
+      required int fileOffset}) {
+    return formals;
+  }
+
+  @override
+  List<SourceNominalParameterBuilder>? createTypeParameters(
+      {required DeclarationBuilder declarationBuilder,
+      required List<TypeParameterFragment>? declarationTypeParameterFragments,
+      required List<SourceNominalParameterBuilder>? typeParameters,
+      required List<NominalParameterBuilder> unboundNominalParameters}) {
+    NominalParameterCopy? nominalVariableCopy =
+        NominalParameterCopy.copyTypeParameters(
+            unboundNominalParameters: unboundNominalParameters,
+            oldParameterBuilders: declarationBuilder.typeParameters,
+            oldParameterFragments: declarationTypeParameterFragments,
+            kind: TypeParameterKind.extensionSynthesized,
+            instanceTypeParameterAccess:
+                InstanceTypeParameterAccessState.Allowed);
+    if (nominalVariableCopy != null) {
+      if (typeParameters != null) {
+        // Coverage-ignore-block(suite): Not run.
+        typeParameters = nominalVariableCopy.newParameterBuilders
+          ..addAll(typeParameters);
+      } else {
+        typeParameters = nominalVariableCopy.newParameterBuilders;
+      }
+    }
+    return typeParameters;
+  }
+}
+
+class ExtensionTypeConstructorEncodingStrategy
+    implements ConstructorEncodingStrategy {
+  const ExtensionTypeConstructorEncodingStrategy();
+
+  @override
+  List<FormalParameterBuilder>? createFormals(
+      {required SourceLoader loader,
+      required List<FormalParameterBuilder>? formals,
+      required Uri fileUri,
+      required int fileOffset}) {
+    return formals;
+  }
+
+  @override
+  List<SourceNominalParameterBuilder>? createTypeParameters({
+    required DeclarationBuilder declarationBuilder,
+    required List<TypeParameterFragment>? declarationTypeParameterFragments,
+    required List<SourceNominalParameterBuilder>? typeParameters,
+    required List<NominalParameterBuilder> unboundNominalParameters,
+  }) {
+    NominalParameterCopy? nominalVariableCopy =
+        NominalParameterCopy.copyTypeParameters(
+            unboundNominalParameters: unboundNominalParameters,
+            oldParameterBuilders: declarationBuilder.typeParameters,
+            oldParameterFragments: declarationTypeParameterFragments,
+            kind: TypeParameterKind.extensionSynthesized,
+            instanceTypeParameterAccess:
+                InstanceTypeParameterAccessState.Allowed);
+    if (nominalVariableCopy != null) {
+      if (typeParameters != null) {
+        // Coverage-ignore-block(suite): Not run.
+        typeParameters = nominalVariableCopy.newParameterBuilders
+          ..addAll(typeParameters);
+      } else {
+        typeParameters = nominalVariableCopy.newParameterBuilders;
+      }
+    }
+    return typeParameters;
+  }
+
+  @override
+  ConstructorEncoding createEncoding({required bool isExternal}) {
+    return new ExtensionTypeConstructorEncoding(isExternal: isExternal);
+  }
 }
diff --git a/pkg/front_end/lib/src/source/source_constructor_builder.dart b/pkg/front_end/lib/src/source/source_constructor_builder.dart
index 1a6ead6..200970a 100644
--- a/pkg/front_end/lib/src/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/source/source_constructor_builder.dart
@@ -160,11 +160,6 @@
       _augmentedDeclarations = [_introductory, ..._augmentations];
       _lastDeclaration = _augmentedDeclarations.removeLast();
     }
-
-    _introductory.registerInferable(this);
-    for (ConstructorDeclaration augmentation in _augmentations) {
-      augmentation.registerInferable(this);
-    }
   }
 
   // TODO(johnniwinther): Add annotations to tear-offs.
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart
index e745f8f..ea88097 100644
--- a/pkg/front_end/lib/src/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -6,6 +6,7 @@
 import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
 import 'package:front_end/src/base/messages.dart';
 import 'package:front_end/src/builder/property_builder.dart';
+import 'package:front_end/src/fragment/constructor/encoding.dart';
 import 'package:front_end/src/fragment/method/encoding.dart';
 import 'package:front_end/src/source/source_method_builder.dart';
 import 'package:kernel/ast.dart';
@@ -286,6 +287,9 @@
       }
     }
     if (needsSynthesizedDefaultConstructor) {
+      ConstructorEncodingStrategy encodingStrategy =
+          new ConstructorEncodingStrategy(this);
+
       FormalParameterBuilder nameFormalParameterBuilder =
           new FormalParameterBuilder(
               FormalParameterKind.requiredPositional,
@@ -343,6 +347,14 @@
               introductory: constructorDeclaration,
               isConst: true,
               isExternal: false);
+      constructorDeclaration.createEncoding(
+          problemReporting: libraryBuilder,
+          loader: libraryBuilder.loader,
+          declarationBuilder: this,
+          constructorBuilder: constructorBuilder,
+          unboundNominalParameters: const [],
+          encodingStrategy: encodingStrategy);
+
       constructorBuilder.registerInitializedField(valuesBuilder);
       addConstructorInternal(constructorBuilder, addToNameSpace: true);
       nameSpaceBuilder.checkTypeParameterConflict(
diff --git a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
index a7ff41c..a4a7246 100644
--- a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
+++ b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
@@ -2,7 +2,7 @@
 // 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:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
+import 'package:front_end/src/fragment/constructor/encoding.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/reference_from_index.dart';
 import 'package:kernel/src/bounds_checks.dart' show VarianceCalculationValue;
@@ -18,7 +18,6 @@
 import '../builder/constructor_builder.dart';
 import '../builder/declaration_builders.dart';
 import '../builder/factory_builder.dart';
-import '../builder/formal_parameter_builder.dart';
 import '../builder/function_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/named_type_builder.dart';
@@ -2760,119 +2759,8 @@
   bool isConst = fragment.modifiers.isConst;
   bool isExternal = fragment.modifiers.isExternal;
 
-  NameScheme nameScheme = new NameScheme(
-      isInstanceMember: false,
-      containerName: containerName,
-      containerType: containerType,
-      libraryName: indexedLibrary != null
-          ? new LibraryName(indexedLibrary.library.reference)
-          : enclosingLibraryBuilder.libraryName);
-
-  createNominalParameterBuilders(
-      fragment.typeParameters, unboundNominalParameters);
-
-  ConstructorReferences constructorReferences = new ConstructorReferences(
-      name: name,
-      nameScheme: nameScheme,
-      indexedContainer: indexedContainer,
-      loader: loader,
-      declarationBuilder: declarationBuilder!);
-
-  ConstructorDeclaration createConstructorDeclaration(
-      ConstructorFragment fragment) {
-    switch (declarationBuilder) {
-      case ExtensionTypeDeclarationBuilder():
-        List<SourceNominalParameterBuilder>? typeParameters = fragment
-            .typeParameters
-            // Coverage-ignore(suite): Not run.
-            ?.builders;
-        NominalParameterCopy? nominalVariableCopy =
-            NominalParameterCopy.copyTypeParameters(
-                unboundNominalParameters: unboundNominalParameters,
-                oldParameterBuilders: declarationBuilder.typeParameters,
-                oldParameterFragments:
-                    fragment.enclosingDeclaration.typeParameters,
-                kind: TypeParameterKind.extensionSynthesized,
-                instanceTypeParameterAccess:
-                    InstanceTypeParameterAccessState.Allowed);
-        if (nominalVariableCopy != null) {
-          if (typeParameters != null) {
-            // Coverage-ignore-block(suite): Not run.
-            typeParameters = nominalVariableCopy.newParameterBuilders
-              ..addAll(typeParameters);
-          } else {
-            typeParameters = nominalVariableCopy.newParameterBuilders;
-          }
-        }
-        fragment.typeParameterNameSpace.addTypeParameters(
-            problemReporting, typeParameters,
-            ownerName: fragment.name, allowNameConflict: true);
-        return new ExtensionTypeConstructorDeclaration(fragment,
-            typeParameters: typeParameters);
-      case ClassBuilder():
-        List<FormalParameterBuilder>? syntheticFormals;
-        if (declarationBuilder.isEnum) {
-          syntheticFormals = [
-            new FormalParameterBuilder(
-                FormalParameterKind.requiredPositional,
-                Modifiers.empty,
-                loader.target.intType,
-                "#index",
-                fragment.fullNameOffset,
-                fileUri: fragment.fileUri,
-                hasImmediatelyDeclaredInitializer: false),
-            new FormalParameterBuilder(
-                FormalParameterKind.requiredPositional,
-                Modifiers.empty,
-                loader.target.stringType,
-                "#name",
-                fragment.fullNameOffset,
-                fileUri: fragment.fileUri,
-                hasImmediatelyDeclaredInitializer: false),
-          ];
-        }
-        List<SourceNominalParameterBuilder>? typeParameters =
-            fragment.typeParameters?.builders;
-        fragment.typeParameterNameSpace.addTypeParameters(
-            problemReporting, typeParameters,
-            ownerName: fragment.name, allowNameConflict: true);
-        return new RegularConstructorDeclaration(fragment,
-            typeParameters: typeParameters,
-            syntheticFormals: syntheticFormals,
-            isEnumConstructor: declarationBuilder.isEnum);
-      case ExtensionBuilder():
-        List<SourceNominalParameterBuilder>? typeParameters = fragment
-            .typeParameters
-            // Coverage-ignore(suite): Not run.
-            ?.builders;
-        NominalParameterCopy? nominalVariableCopy =
-            NominalParameterCopy.copyTypeParameters(
-                unboundNominalParameters: unboundNominalParameters,
-                oldParameterBuilders: declarationBuilder.typeParameters,
-                oldParameterFragments:
-                    fragment.enclosingDeclaration.typeParameters,
-                kind: TypeParameterKind.extensionSynthesized,
-                instanceTypeParameterAccess:
-                    InstanceTypeParameterAccessState.Allowed);
-        if (nominalVariableCopy != null) {
-          if (typeParameters != null) {
-            // Coverage-ignore-block(suite): Not run.
-            typeParameters = nominalVariableCopy.newParameterBuilders
-              ..addAll(typeParameters);
-          } else {
-            typeParameters = nominalVariableCopy.newParameterBuilders;
-          }
-        }
-        fragment.typeParameterNameSpace.addTypeParameters(
-            problemReporting, typeParameters,
-            ownerName: fragment.name, allowNameConflict: true);
-        return new ExtensionConstructorDeclaration(fragment,
-            typeParameters: typeParameters);
-    }
-  }
-
   ConstructorDeclaration constructorDeclaration =
-      createConstructorDeclaration(fragment);
+      new RegularConstructorDeclaration(fragment);
 
   List<ConstructorDeclaration> augmentationDeclarations = [];
   if (augmentations != null) {
@@ -2880,10 +2768,8 @@
       // Promote [augmentation] to [ConstructorFragment].
       augmentation as ConstructorFragment;
 
-      createNominalParameterBuilders(
-          augmentation.typeParameters, unboundNominalParameters);
-
-      augmentationDeclarations.add(createConstructorDeclaration(augmentation));
+      augmentationDeclarations
+          .add(new RegularConstructorDeclaration(augmentation));
 
       if (!augmentation.modifiers.isExternal) {
         isExternal = false;
@@ -2898,7 +2784,6 @@
       loader: loader,
       name: name,
       uriOffset: fragment.uriOffset,
-      nameScheme: nameScheme,
       enclosingLibraryBuilder: enclosingLibraryBuilder,
       declarationBuilder: declarationBuilder,
       unboundNominalParameters: unboundNominalParameters,
@@ -2906,7 +2791,6 @@
       containerType: containerType,
       indexedContainer: indexedContainer,
       containerName: containerName,
-      constructorReferences: constructorReferences,
       nativeMethodName: fragment.nativeMethodName,
       isConst: isConst,
       isExternal: isExternal,
@@ -2920,7 +2804,6 @@
     required SourceLoader loader,
     required String name,
     required UriOffsetLength uriOffset,
-    required NameScheme nameScheme,
     required SourceLibraryBuilder enclosingLibraryBuilder,
     required DeclarationBuilder? declarationBuilder,
     required List<NominalParameterBuilder> unboundNominalParameters,
@@ -2928,15 +2811,32 @@
     required ContainerType containerType,
     required IndexedContainer? indexedContainer,
     required ContainerName? containerName,
-    required ConstructorReferences constructorReferences,
     required String? nativeMethodName,
     required bool isConst,
     required bool isExternal,
     required bool inPatch}) {
+  NameScheme nameScheme = new NameScheme(
+      isInstanceMember: false,
+      containerName: containerName,
+      containerType: containerType,
+      libraryName: indexedLibrary != null
+          ? new LibraryName(indexedLibrary.library.reference)
+          : enclosingLibraryBuilder.libraryName);
+
+  ConstructorEncodingStrategy encodingStrategy =
+      new ConstructorEncodingStrategy(declarationBuilder!);
+
+  ConstructorReferences constructorReferences = new ConstructorReferences(
+      name: name,
+      nameScheme: nameScheme,
+      indexedContainer: indexedContainer,
+      loader: loader,
+      declarationBuilder: declarationBuilder);
+
   SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
       name: name,
       libraryBuilder: enclosingLibraryBuilder,
-      declarationBuilder: declarationBuilder!,
+      declarationBuilder: declarationBuilder,
       fileUri: uriOffset.fileUri,
       fileOffset: uriOffset.fileOffset,
       constructorReferences: constructorReferences,
@@ -2948,9 +2848,21 @@
       isExternal: isExternal);
   constructorReferences.registerReference(loader, constructorBuilder);
 
-  constructorDeclaration.createEncoding(constructorBuilder);
+  constructorDeclaration.createEncoding(
+      problemReporting: problemReporting,
+      loader: loader,
+      declarationBuilder: declarationBuilder,
+      constructorBuilder: constructorBuilder,
+      unboundNominalParameters: unboundNominalParameters,
+      encodingStrategy: encodingStrategy);
   for (ConstructorDeclaration augmentation in augmentationDeclarations) {
-    augmentation.createEncoding(constructorBuilder);
+    augmentation.createEncoding(
+        problemReporting: problemReporting,
+        loader: loader,
+        declarationBuilder: declarationBuilder,
+        constructorBuilder: constructorBuilder,
+        unboundNominalParameters: unboundNominalParameters,
+        encodingStrategy: encodingStrategy);
   }
   return new _AddBuilder(name, constructorBuilder, uriOffset, inPatch: inPatch);
 }
@@ -2968,57 +2880,15 @@
     required ContainerName? containerName}) {
   String name = fragment.name;
 
-  NameScheme nameScheme = new NameScheme(
-      isInstanceMember: false,
-      containerName: containerName,
-      containerType: containerType,
-      libraryName: indexedLibrary != null
-          ? new LibraryName(indexedLibrary.library.reference)
-          : enclosingLibraryBuilder.libraryName);
+  ConstructorDeclaration constructorDeclaration =
+      new PrimaryConstructorDeclaration(fragment);
 
-  ConstructorReferences constructorReferences = new ConstructorReferences(
-      name: name,
-      nameScheme: nameScheme,
-      indexedContainer: indexedContainer,
-      loader: loader,
-      declarationBuilder: declarationBuilder!);
-
-  ConstructorDeclaration constructorDeclaration;
-  switch (declarationBuilder) {
-    case ExtensionTypeDeclarationBuilder():
-      NominalParameterCopy? nominalVariableCopy =
-          NominalParameterCopy.copyTypeParameters(
-              unboundNominalParameters: unboundNominalParameters,
-              oldParameterBuilders: declarationBuilder.typeParameters,
-              oldParameterFragments:
-                  fragment.enclosingDeclaration.typeParameters,
-              kind: TypeParameterKind.extensionSynthesized,
-              instanceTypeParameterAccess:
-                  InstanceTypeParameterAccessState.Allowed);
-
-      List<SourceNominalParameterBuilder>? typeParameters =
-          nominalVariableCopy?.newParameterBuilders;
-      fragment.typeParameterNameSpace.addTypeParameters(
-          problemReporting, typeParameters,
-          ownerName: fragment.name, allowNameConflict: true);
-      constructorDeclaration = new ExtensionTypePrimaryConstructorDeclaration(
-          fragment,
-          typeParameters: typeParameters);
-    // Coverage-ignore(suite): Not run.
-    case ClassBuilder():
-      constructorDeclaration = new PrimaryConstructorDeclaration(fragment);
-    // Coverage-ignore(suite): Not run.
-    case ExtensionBuilder():
-      throw new UnsupportedError(
-          'Unexpected extension primary constructor $fragment');
-  }
   return _createConstructorBuilderFromDeclarations(
       constructorDeclaration, const [],
       problemReporting: problemReporting,
       loader: loader,
       name: name,
       uriOffset: fragment.uriOffset,
-      nameScheme: nameScheme,
       enclosingLibraryBuilder: enclosingLibraryBuilder,
       declarationBuilder: declarationBuilder,
       unboundNominalParameters: unboundNominalParameters,
@@ -3026,7 +2896,6 @@
       containerType: containerType,
       indexedContainer: indexedContainer,
       containerName: containerName,
-      constructorReferences: constructorReferences,
       nativeMethodName: null,
       isConst: fragment.modifiers.isConst,
       isExternal: fragment.modifiers.isExternal,
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index 75cb31b..47cf26d 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -505,12 +505,12 @@
   ),
   // 100.0%.
   "package:front_end/src/fragment/constructor/declaration.dart": (
-    hitCount: 735,
+    hitCount: 622,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/fragment/constructor/encoding.dart": (
-    hitCount: 421,
+    hitCount: 489,
     missCount: 0,
   ),
   // 100.0%.
@@ -955,12 +955,12 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_constructor_builder.dart": (
-    hitCount: 360,
+    hitCount: 356,
     missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_enum_builder.dart": (
-    hitCount: 423,
+    hitCount: 428,
     missCount: 0,
   ),
   // 100.0%.
@@ -1026,7 +1026,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/type_parameter_scope_builder.dart": (
-    hitCount: 1519,
+    hitCount: 1458,
     missCount: 0,
   ),
   // 100.0%.
diff --git a/tools/VERSION b/tools/VERSION
index 9cea039..b5a148f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 9
 PATCH 0
-PRERELEASE 247
+PRERELEASE 248
 PRERELEASE_PATCH 0
