Version 2.17.0-208.0.dev

Merge commit '7e4b88c0c934685cb6da0f57226b2ec16bb0a94a' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 0f02e2e..897b3d8 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -116,7 +116,7 @@
 
 import 'incremental_serializer.dart' show IncrementalSerializer;
 
-import 'kernel/macro.dart' show enableMacros, NeededPrecompilations;
+import 'kernel/macro/macro.dart' show enableMacros, NeededPrecompilations;
 
 import 'scope.dart' show Scope;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
index 30bd373..2bd09ac 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
@@ -51,7 +51,7 @@
     List<Supertype> interfacesList;
     int maxInheritancePath;
 
-    List<TypeBuilder>? directInterfaceBuilders;
+    List<ClassHierarchyNode>? interfaceNodes;
 
     if (classBuilder.isMixinApplication) {
       inferMixinApplication();
@@ -85,7 +85,8 @@
         }
       }
 
-      directInterfaceBuilders = ignoreFunction(classBuilder.interfaceBuilders);
+      List<TypeBuilder>? directInterfaceBuilders =
+          ignoreFunction(classBuilder.interfaceBuilders);
       if (classBuilder.isMixinApplication) {
         if (directInterfaceBuilders == null) {
           directInterfaceBuilders = <TypeBuilder>[
@@ -99,15 +100,13 @@
       }
 
       List<Supertype> superclassInterfaces = supernode.interfaces;
-      // ignore: unnecessary_null_comparison
-      if (superclassInterfaces != null) {
+      if (superclassInterfaces.isNotEmpty) {
         superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
       }
 
       if (directInterfaceBuilders != null) {
         Map<Class, Supertype> interfaces = {};
-        // ignore: unnecessary_null_comparison
-        if (superclassInterfaces != null) {
+        if (superclassInterfaces.isNotEmpty) {
           for (int i = 0; i < superclassInterfaces.length; i++) {
             addInterface(interfaces, superclasses, superclassInterfaces[i]);
           }
@@ -121,31 +120,28 @@
             addInterface(interfaces, superclasses, directInterface);
             ClassHierarchyNode interfaceNode =
                 hierarchy.getNodeFromClass(directInterface.classNode);
-            // ignore: unnecessary_null_comparison
-            if (interfaceNode != null) {
-              if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
-                maxInheritancePath = interfaceNode.maxInheritancePath + 1;
-              }
+            (interfaceNodes ??= []).add(interfaceNode);
 
+            if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
+              maxInheritancePath = interfaceNode.maxInheritancePath + 1;
+            }
+
+            List<Supertype> types =
+                substSupertypes(directInterface, interfaceNode.superclasses);
+            for (int i = 0; i < types.length; i++) {
+              addInterface(interfaces, superclasses, types[i]);
+            }
+            if (interfaceNode.interfaces.isNotEmpty) {
               List<Supertype> types =
-                  substSupertypes(directInterface, interfaceNode.superclasses);
+                  substSupertypes(directInterface, interfaceNode.interfaces);
               for (int i = 0; i < types.length; i++) {
                 addInterface(interfaces, superclasses, types[i]);
               }
-              // ignore: unnecessary_null_comparison
-              if (interfaceNode.interfaces != null) {
-                List<Supertype> types =
-                    substSupertypes(directInterface, interfaceNode.interfaces);
-                for (int i = 0; i < types.length; i++) {
-                  addInterface(interfaces, superclasses, types[i]);
-                }
-              }
             }
           }
         }
         interfacesList = interfaces.values.toList();
-        // ignore: unnecessary_null_comparison
-      } else if (superclassInterfaces != null &&
+      } else if (superclassInterfaces.isNotEmpty &&
           !classBuilder.library.isNonNullableByDefault &&
           supernode.classBuilder.library.isNonNullableByDefault) {
         Map<Class, Supertype> interfaces = {};
@@ -168,13 +164,8 @@
       }
     }
 
-    return new ClassHierarchyNode(
-        classBuilder,
-        supernode,
-        directInterfaceBuilders,
-        superclasses,
-        interfacesList,
-        maxInheritancePath);
+    return new ClassHierarchyNode(classBuilder, supernode, interfaceNodes,
+        superclasses, interfacesList, maxInheritancePath);
   }
 
   Supertype recordSupertype(Supertype supertype) {
@@ -329,9 +320,13 @@
   /// The class corresponding to this hierarchy node.
   final ClassBuilder classBuilder;
 
-  final ClassHierarchyNode? supernode;
+  /// The [ClassHierarchyNode] for the direct super class of [classBuilder], or
+  /// `null` if this is `Object`.
+  final ClassHierarchyNode? directSuperClassNode;
 
-  final List<TypeBuilder>? directInterfaceBuilders;
+  /// The [ClassHierarchyNode]s for the direct super interfaces of
+  /// [classBuilder].
+  final List<ClassHierarchyNode>? directInterfaceNodes;
 
   /// All superclasses of [classBuilder] excluding itself. The classes are
   /// sorted by depth from the root (Object) in ascending order.
@@ -348,8 +343,8 @@
 
   ClassHierarchyNode(
       this.classBuilder,
-      this.supernode,
-      this.directInterfaceBuilders,
+      this.directSuperClassNode,
+      this.directInterfaceNodes,
       this.superclasses,
       this.interfaces,
       this.maxInheritancePath);
@@ -390,8 +385,7 @@
       sb.writeln();
       depth++;
     }
-    // ignore: unnecessary_null_comparison
-    if (interfaces != null) {
+    if (interfaces.isNotEmpty) {
       sb.write("  interfaces:");
       bool first = true;
       for (Supertype i in interfaces) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
index e4a2839..e4faf56 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -566,12 +566,12 @@
   }
 
   ClassMembersNode build() {
-    ClassMembersNode? supernode = _hierarchyNode.supernode != null
-        ? _membersBuilder
-            .getNodeFromClassBuilder(_hierarchyNode.supernode!.classBuilder)
+    ClassMembersNode? supernode = _hierarchyNode.directSuperClassNode != null
+        ? _membersBuilder.getNodeFromClassBuilder(
+            _hierarchyNode.directSuperClassNode!.classBuilder)
         : null;
-    List<TypeBuilder>? directInterfaceBuilders =
-        _hierarchyNode.directInterfaceBuilders;
+    List<ClassHierarchyNode>? interfaceNodes =
+        _hierarchyNode.directInterfaceNodes;
 
     /// Set to `true` if the class needs interfaces, that is, if it has any
     /// members where the interface member is different from its corresponding
@@ -770,18 +770,16 @@
         implement(supernode.interfaceSetterMap ?? supernode.classSetterMap);
       }
 
-      if (directInterfaceBuilders != null) {
-        for (int i = 0; i < directInterfaceBuilders.length; i++) {
+      if (interfaceNodes != null) {
+        for (int i = 0; i < interfaceNodes.length; i++) {
           ClassMembersNode? interfaceNode = _membersBuilder
-              .getNodeFromTypeBuilder(directInterfaceBuilders[i]);
-          if (interfaceNode != null) {
-            hasInterfaces = true;
+              .getNodeFromClassBuilder(interfaceNodes[i].classBuilder);
+          hasInterfaces = true;
 
-            implement(interfaceNode.interfaceMemberMap ??
-                interfaceNode.classMemberMap);
-            implement(interfaceNode.interfaceSetterMap ??
-                interfaceNode.classSetterMap);
-          }
+          implement(
+              interfaceNode.interfaceMemberMap ?? interfaceNode.classMemberMap);
+          implement(
+              interfaceNode.interfaceSetterMap ?? interfaceNode.classSetterMap);
         }
       }
     }
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 730ab5747..09fc019 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -82,7 +82,7 @@
         ConstantEvaluationData;
 import 'kernel_constants.dart' show KernelConstantErrorReporter;
 import 'kernel_helper.dart';
-import 'macro.dart';
+import 'macro/macro.dart';
 import 'verifier.dart' show verifyComponent, verifyGetStaticType;
 
 class KernelTarget extends TargetImplementation {
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
similarity index 98%
rename from pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart
rename to pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index aeed256..e177ba8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -7,14 +7,14 @@
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 
-import '../builder/builder.dart';
-import '../builder/class_builder.dart';
-import '../builder/member_builder.dart';
-import '../builder/metadata_builder.dart';
-import '../builder/prefix_builder.dart';
-import '../scope.dart';
-import '../source/diet_parser.dart';
-import '../source/source_library_builder.dart';
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/metadata_builder.dart';
+import '../../builder/prefix_builder.dart';
+import '../../scope.dart';
+import '../../source/diet_parser.dart';
+import '../../source/source_library_builder.dart';
 
 import 'macro.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
new file mode 100644
index 0000000..ad6743a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
@@ -0,0 +1,165 @@
+// 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:_fe_analyzer_shared/src/macros/executor.dart' as macro;
+import 'package:_fe_analyzer_shared/src/macros/executor/introspection_impls.dart'
+    as macro;
+import 'package:kernel/ast.dart';
+
+import '../../builder/class_builder.dart';
+import '../../builder/formal_parameter_builder.dart';
+import '../../builder/library_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/nullability_builder.dart';
+import '../../builder/type_alias_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../builder/type_declaration_builder.dart';
+
+abstract class IdentifierImpl implements macro.IdentifierImpl {
+  macro.ResolvedIdentifier resolveIdentifier();
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments);
+}
+
+class TypeBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final TypeBuilder typeBuilder;
+  final LibraryBuilder libraryBuilder;
+
+  TypeBuilderIdentifier({
+    required this.typeBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    TypeDeclarationBuilder? typeDeclarationBuilder = typeBuilder.declaration;
+    if (typeDeclarationBuilder != null) {
+      Uri? uri;
+      if (typeDeclarationBuilder is ClassBuilder) {
+        uri = typeDeclarationBuilder.library.importUri;
+      } else if (typeDeclarationBuilder is TypeAliasBuilder) {
+        uri = typeDeclarationBuilder.library.importUri;
+      } else if (name == 'dynamic') {
+        uri = Uri.parse('dart:core');
+      }
+      return new macro.ResolvedIdentifier(
+          kind: macro.IdentifierKind.topLevelMember,
+          name: name,
+          staticScope: null,
+          uri: uri);
+    } else {
+      throw new StateError('Unable to resolve identifier $this');
+    }
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    return typeBuilder.declaration!.buildTypeWithBuiltArguments(libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder), typeArguments);
+  }
+}
+
+class TypeDeclarationBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final TypeDeclarationBuilder typeDeclarationBuilder;
+  final LibraryBuilder libraryBuilder;
+
+  TypeDeclarationBuilderIdentifier({
+    required this.typeDeclarationBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    Uri? uri;
+    if (typeDeclarationBuilder is ClassBuilder) {
+      uri = (typeDeclarationBuilder as ClassBuilder).library.importUri;
+    } else if (typeDeclarationBuilder is TypeAliasBuilder) {
+      uri = (typeDeclarationBuilder as TypeAliasBuilder).library.importUri;
+    } else if (name == 'dynamic') {
+      uri = Uri.parse('dart:core');
+    }
+    return new macro.ResolvedIdentifier(
+        kind: macro.IdentifierKind.topLevelMember,
+        name: name,
+        staticScope: null,
+        uri: uri);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    return typeDeclarationBuilder.buildTypeWithBuiltArguments(libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder), typeArguments);
+  }
+}
+
+class MemberBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final MemberBuilder memberBuilder;
+
+  MemberBuilderIdentifier(
+      {required this.memberBuilder, required int id, required String name})
+      : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    Uri? uri;
+    String? staticScope;
+    macro.IdentifierKind kind;
+    if (memberBuilder.isStatic || memberBuilder.isConstructor) {
+      ClassBuilder classBuilder = memberBuilder.classBuilder!;
+      staticScope = classBuilder.name;
+      uri = classBuilder.library.importUri;
+      kind = macro.IdentifierKind.staticInstanceMember;
+    } else if (memberBuilder.isTopLevel) {
+      uri = memberBuilder.library.importUri;
+      kind = macro.IdentifierKind.topLevelMember;
+    } else {
+      kind = macro.IdentifierKind.instanceMember;
+    }
+    return new macro.ResolvedIdentifier(
+        kind: kind, name: name, staticScope: staticScope, uri: uri);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    throw new UnsupportedError('Cannot build type from member.');
+  }
+}
+
+class FormalParameterBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final LibraryBuilder libraryBuilder;
+  final FormalParameterBuilder parameterBuilder;
+
+  FormalParameterBuilderIdentifier({
+    required this.parameterBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    return new macro.ResolvedIdentifier(
+        kind: macro.IdentifierKind.local,
+        name: name,
+        staticScope: null,
+        uri: null);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    throw new UnsupportedError('Cannot build type from formal parameter.');
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
similarity index 82%
rename from pkg/front_end/lib/src/fasta/kernel/macro.dart
rename to pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
index 5a9d010..8779439 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -12,27 +12,27 @@
 import 'package:kernel/src/types.dart';
 import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
 
-import '../../base/common.dart';
-import '../builder/builder.dart';
-import '../builder/class_builder.dart';
-import '../builder/formal_parameter_builder.dart';
-import '../builder/library_builder.dart';
-import '../builder/member_builder.dart';
-import '../builder/named_type_builder.dart';
-import '../builder/nullability_builder.dart';
-import '../builder/type_alias_builder.dart';
-import '../builder/type_builder.dart';
-import '../builder/type_declaration_builder.dart';
-import '../identifiers.dart';
-import '../source/source_class_builder.dart';
-import '../source/source_constructor_builder.dart';
-import '../source/source_factory_builder.dart';
-import '../source/source_field_builder.dart';
-import '../source/source_library_builder.dart';
-import '../source/source_loader.dart';
-import '../source/source_procedure_builder.dart';
-import 'hierarchy/hierarchy_builder.dart';
-import 'hierarchy/hierarchy_node.dart';
+import '../../../base/common.dart';
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/formal_parameter_builder.dart';
+import '../../builder/library_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/named_type_builder.dart';
+import '../../builder/nullability_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../builder/type_declaration_builder.dart';
+import '../../identifiers.dart';
+import '../../source/source_class_builder.dart';
+import '../../source/source_constructor_builder.dart';
+import '../../source/source_factory_builder.dart';
+import '../../source/source_field_builder.dart';
+import '../../source/source_library_builder.dart';
+import '../../source/source_loader.dart';
+import '../../source/source_procedure_builder.dart';
+import '../hierarchy/hierarchy_builder.dart';
+import '../hierarchy/hierarchy_node.dart';
+import 'identifiers.dart';
 
 bool enableMacros = false;
 
@@ -214,55 +214,8 @@
   }
 
   macro.ResolvedIdentifier _resolveIdentifier(macro.Identifier identifier) {
-    if (identifier is _IdentifierImpl) {
-      MemberBuilder? memberBuilder = identifier.memberBuilder;
-      FormalParameterBuilder? parameterBuilder = identifier.parameterBuilder;
-      TypeDeclarationBuilder? typeDeclarationBuilder =
-          identifier.typeDeclarationBuilder ??
-              identifier.typeBuilder?.declaration;
-      if (memberBuilder != null) {
-        Uri? uri;
-        String? staticScope;
-        macro.IdentifierKind kind;
-        if (memberBuilder.isStatic || memberBuilder.isConstructor) {
-          ClassBuilder classBuilder = memberBuilder.classBuilder!;
-          staticScope = classBuilder.name;
-          uri = classBuilder.library.importUri;
-          kind = macro.IdentifierKind.staticInstanceMember;
-        } else if (memberBuilder.isTopLevel) {
-          uri = memberBuilder.library.importUri;
-          kind = macro.IdentifierKind.topLevelMember;
-        } else {
-          kind = macro.IdentifierKind.instanceMember;
-        }
-        return new macro.ResolvedIdentifier(
-            kind: kind,
-            name: identifier.name,
-            staticScope: staticScope,
-            uri: uri);
-      } else if (typeDeclarationBuilder != null) {
-        Uri? uri;
-        if (typeDeclarationBuilder is ClassBuilder) {
-          uri = typeDeclarationBuilder.library.importUri;
-        } else if (typeDeclarationBuilder is TypeAliasBuilder) {
-          uri = typeDeclarationBuilder.library.importUri;
-        } else if (identifier.name == 'dynamic') {
-          uri = Uri.parse('dart:core');
-        }
-        return new macro.ResolvedIdentifier(
-            kind: macro.IdentifierKind.topLevelMember,
-            name: identifier.name,
-            staticScope: null,
-            uri: uri);
-      } else if (parameterBuilder != null) {
-        return new macro.ResolvedIdentifier(
-            kind: macro.IdentifierKind.local,
-            name: identifier.name,
-            staticScope: null,
-            uri: null);
-      } else {
-        throw new StateError('Unable to resolve identifier $identifier');
-      }
+    if (identifier is IdentifierImpl) {
+      return identifier.resolveIdentifier();
     } else {
       // TODO(johnniwinther): Use [_IdentifierImpl] for all identifiers.
       if (identical(identifier, dynamicIdentifier)) {
@@ -522,7 +475,7 @@
   macro.ClassDeclaration _createClassDeclaration(ClassBuilder builder) {
     macro.ClassDeclaration declaration = new macro.ClassDeclarationImpl(
         id: macro.RemoteInstance.uniqueId,
-        identifier: new _IdentifierImpl.forTypeDeclarationBuilder(
+        identifier: new TypeDeclarationBuilderIdentifier(
             typeDeclarationBuilder: builder,
             libraryBuilder: builder.library,
             id: macro.RemoteInstance.uniqueId,
@@ -553,12 +506,11 @@
       for (FormalParameterBuilder formal in formals) {
         macro.TypeAnnotationImpl type =
             computeTypeAnnotation(builder.library, formal.type);
-        macro.IdentifierImpl identifier =
-            new _IdentifierImpl.forParameterBuilder(
-                id: macro.RemoteInstance.uniqueId,
-                name: formal.name,
-                parameterBuilder: formal,
-                libraryBuilder: builder.library);
+        macro.IdentifierImpl identifier = new FormalParameterBuilderIdentifier(
+            id: macro.RemoteInstance.uniqueId,
+            name: formal.name,
+            parameterBuilder: formal,
+            libraryBuilder: builder.library);
         if (formal.isNamed) {
           namedParameters.add(new macro.ParameterDeclarationImpl(
             id: macro.RemoteInstance.uniqueId,
@@ -594,7 +546,7 @@
         _getClassDeclaration(builder.classBuilder as SourceClassBuilder);
     return new macro.ConstructorDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
-      identifier: new _IdentifierImpl.forMemberBuilder(
+      identifier: new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: builder.name),
@@ -623,7 +575,7 @@
 
     return new macro.ConstructorDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
-      identifier: new _IdentifierImpl.forMemberBuilder(
+      identifier: new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: builder.name),
@@ -658,7 +610,7 @@
       //  declarations?
       return new macro.MethodDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -678,7 +630,7 @@
     } else {
       return new macro.FunctionDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -708,7 +660,7 @@
       //  declarations?
       return new macro.FieldDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -721,7 +673,7 @@
     } else {
       return new macro.VariableDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -752,7 +704,7 @@
         if (name is String) {
           return new macro.NamedTypeAnnotationImpl(
               id: macro.RemoteInstance.uniqueId,
-              identifier: new _IdentifierImpl.forTypeBuilder(
+              identifier: new TypeBuilderIdentifier(
                   typeBuilder: typeBuilder,
                   libraryBuilder: libraryBuilder,
                   id: macro.RemoteInstance.uniqueId,
@@ -763,7 +715,7 @@
           assert(name.qualifier is String);
           return new macro.NamedTypeAnnotationImpl(
               id: macro.RemoteInstance.uniqueId,
-              identifier: new _IdentifierImpl.forTypeBuilder(
+              identifier: new TypeBuilderIdentifier(
                   typeBuilder: typeBuilder,
                   libraryBuilder: libraryBuilder,
                   id: macro.RemoteInstance.uniqueId,
@@ -786,8 +738,7 @@
         _computeTypeAnnotation(libraryBuilder, typeBuilder);
   }
 
-  TypeBuilder _typeBuilderForAnnotation(
-      macro.TypeAnnotationCode typeAnnotation) {
+  DartType _typeForAnnotation(macro.TypeAnnotationCode typeAnnotation) {
     NullabilityBuilder nullabilityBuilder;
     if (typeAnnotation is macro.NullableTypeAnnotationCode) {
       nullabilityBuilder = const NullabilityBuilder.nullable();
@@ -797,35 +748,13 @@
     }
 
     if (typeAnnotation is macro.NamedTypeAnnotationCode) {
-      _IdentifierImpl typeIdentifier = typeAnnotation.name as _IdentifierImpl;
-      TypeDeclarationBuilder? typeDeclarationBuilder =
-          typeIdentifier.typeDeclarationBuilder;
-      InstanceTypeVariableAccessState instanceTypeVariableAccessState =
-          InstanceTypeVariableAccessState.Unexpected;
-      if (typeDeclarationBuilder == null) {
-        TypeBuilder? originalTypeBuilder = typeIdentifier.typeBuilder;
-
-        if (originalTypeBuilder == null) {
-          throw new StateError('No type builder for $typeIdentifier');
-        }
-        if (originalTypeBuilder is! NamedTypeBuilder) {
-          throw new StateError(
-              'Type $typeIdentifier was not a named type as expected!');
-        }
-        typeDeclarationBuilder = originalTypeBuilder.declaration!;
-        instanceTypeVariableAccessState =
-            originalTypeBuilder.instanceTypeVariableAccess;
-      }
-      List<TypeBuilder> arguments = [
-        for (macro.TypeAnnotationCode argumentCode
-            in typeAnnotation.typeArguments)
-          _typeBuilderForAnnotation(argumentCode),
-      ];
-
-      return new NamedTypeBuilder.fromTypeDeclarationBuilder(
-          typeDeclarationBuilder, nullabilityBuilder,
-          instanceTypeVariableAccess: instanceTypeVariableAccessState,
-          arguments: arguments);
+      macro.NamedTypeAnnotationCode namedTypeAnnotation = typeAnnotation;
+      IdentifierImpl typeIdentifier = typeAnnotation.name as IdentifierImpl;
+      List<DartType> arguments = new List<DartType>.generate(
+          namedTypeAnnotation.typeArguments.length,
+          (int index) =>
+              _typeForAnnotation(namedTypeAnnotation.typeArguments[index]));
+      return typeIdentifier.buildType(nullabilityBuilder, arguments);
     }
     // TODO: Implement support for function types.
     throw new UnimplementedError(
@@ -834,12 +763,7 @@
 
   macro.StaticType resolveTypeAnnotation(
       macro.TypeAnnotationCode typeAnnotation) {
-    TypeBuilder typeBuilder = _typeBuilderForAnnotation(typeAnnotation);
-    // TODO: This should probably be passed in instead, possibly attached to the
-    // TypeResolver class?
-    LibraryBuilder libraryBuilder =
-        typeAnnotation.parts.whereType<_IdentifierImpl>().first.libraryBuilder;
-    return createStaticType(typeBuilder.build(libraryBuilder));
+    return createStaticType(_typeForAnnotation(typeAnnotation));
   }
 
   Map<DartType, _StaticTypeImpl> _staticTypeCache = {};
@@ -849,54 +773,6 @@
   }
 }
 
-class _IdentifierImpl extends macro.IdentifierImpl {
-  final TypeDeclarationBuilder? typeDeclarationBuilder;
-  final MemberBuilder? memberBuilder;
-  final TypeBuilder? typeBuilder;
-  final LibraryBuilder libraryBuilder;
-  final FormalParameterBuilder? parameterBuilder;
-
-  _IdentifierImpl.forTypeBuilder({
-    required TypeBuilder this.typeBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeDeclarationBuilder = null,
-        memberBuilder = null,
-        parameterBuilder = null,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forTypeDeclarationBuilder({
-    required TypeDeclarationBuilder this.typeDeclarationBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeBuilder = null,
-        memberBuilder = null,
-        parameterBuilder = null,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forMemberBuilder(
-      {required MemberBuilder this.memberBuilder,
-      required int id,
-      required String name})
-      : typeBuilder = null,
-        typeDeclarationBuilder = null,
-        parameterBuilder = null,
-        libraryBuilder = memberBuilder.library,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forParameterBuilder({
-    required FormalParameterBuilder this.parameterBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeBuilder = null,
-        typeDeclarationBuilder = null,
-        memberBuilder = null,
-        super(id: id, name: name);
-}
-
 class _StaticTypeImpl extends macro.StaticType {
   final MacroApplications macroApplications;
   final DartType type;
@@ -942,13 +818,13 @@
               'Unable to find top level identifier "$name" in $library'),
           StackTrace.current);
     } else if (builder is TypeDeclarationBuilder) {
-      return new Future.value(new _IdentifierImpl.forTypeDeclarationBuilder(
+      return new Future.value(new TypeDeclarationBuilderIdentifier(
           typeDeclarationBuilder: builder,
           libraryBuilder: libraryBuilder,
           id: macro.RemoteInstance.uniqueId,
           name: name));
     } else if (builder is MemberBuilder) {
-      return new Future.value(new _IdentifierImpl.forMemberBuilder(
+      return new Future.value(new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: name));
@@ -1044,10 +920,10 @@
     ClassBuilder classBuilder = macroApplications._getClassBuilder(clazz);
     ClassHierarchyNode node =
         classHierarchy.getNodeFromClassBuilder(classBuilder);
-    ClassHierarchyNode? superNode = node.supernode;
+    ClassHierarchyNode? superNode = node.directSuperClassNode;
     while (superNode != null &&
         superNode.classBuilder.isAnonymousMixinApplication) {
-      superNode = superNode.supernode;
+      superNode = superNode.directSuperClassNode;
     }
     if (superNode != null) {
       return new Future.value(
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 edf0831..8665c23 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
@@ -462,34 +462,51 @@
           new RedirectingFactoryBody(target, typeArguments, function);
       function.body!.parent = function;
     }
-    if (_factoryTearOff != null) {
-      Set<Procedure> seenTargets = {};
-      while (target is Procedure && target.isRedirectingFactory) {
-        if (!seenTargets.add(target)) {
-          // Cyclic dependency.
-          target = null;
-          break;
-        }
-        RedirectingFactoryBody body =
-            target.function.body as RedirectingFactoryBody;
-        if (typeArguments != null) {
-          Substitution substitution = Substitution.fromPairs(
-              target.function.typeParameters, typeArguments);
-          typeArguments =
-              body.typeArguments?.map(substitution.substituteType).toList();
-        } else {
-          typeArguments = body.typeArguments;
-        }
-        target = body.target;
+
+    Set<Procedure> seenTargets = {};
+    while (target is Procedure && target.isRedirectingFactory) {
+      if (!seenTargets.add(target)) {
+        // Cyclic dependency.
+        target = null;
+        break;
       }
-      if (target is Constructor || target is Procedure && target.isFactory) {
+      RedirectingFactoryBody body =
+          target.function.body as RedirectingFactoryBody;
+      if (typeArguments != null) {
+        Substitution substitution = Substitution.fromPairs(
+            target.function.typeParameters, typeArguments);
+        typeArguments =
+            body.typeArguments?.map(substitution.substituteType).toList();
+      } else {
+        typeArguments = body.typeArguments;
+      }
+      target = body.target;
+    }
+
+    if (target is Constructor || target is Procedure && target.isFactory) {
+      typeArguments ??= [];
+      if (_factoryTearOff != null) {
         synthesizedFunctionNodes.add(buildRedirectingFactoryTearOffBody(
             _factoryTearOff!,
             target!,
-            typeArguments ?? [],
+            typeArguments,
             _tearOffTypeParameters!,
             library));
       }
+      Map<TypeParameter, DartType> substitutionMap;
+      if (function.typeParameters.length == typeArguments.length) {
+        substitutionMap = new Map<TypeParameter, DartType>.fromIterables(
+            function.typeParameters, typeArguments);
+      } else {
+        // Error case: Substitute type parameters with `dynamic`.
+        substitutionMap = new Map<TypeParameter, DartType>.fromIterables(
+            function.typeParameters,
+            new List<DartType>.generate(function.typeParameters.length,
+                (int index) => const DynamicType()));
+      }
+      synthesizedFunctionNodes.add(new SynthesizedFunctionNode(
+          substitutionMap, target!.function!, function,
+          libraryBuilder: library, identicalSignatures: false));
     }
     if (isConst && isPatch) {
       _finishPatch();
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 17257de..181c94b 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
@@ -66,7 +66,7 @@
 import '../kernel/internal_ast.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/load_library_builder.dart';
-import '../kernel/macro.dart';
+import '../kernel/macro/macro.dart';
 import '../kernel/type_algorithms.dart'
     show
         NonSimplicityIssue,
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 a281736..fb53047 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -74,8 +74,8 @@
 import '../kernel/kernel_helper.dart'
     show SynthesizedFunctionNode, TypeDependency;
 import '../kernel/kernel_target.dart' show KernelTarget;
-import '../kernel/macro.dart';
-import '../kernel/macro_annotation_parser.dart';
+import '../kernel/macro/macro.dart';
+import '../kernel/macro/annotation_parser.dart';
 import '../kernel/transform_collections.dart' show CollectionTransformer;
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 6a02262..cfb4145 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -24,7 +24,7 @@
 import 'fasta/fasta_codes.dart' show LocatedMessage;
 import 'fasta/hybrid_file_system.dart';
 import 'fasta/kernel/kernel_target.dart' show BuildResult, KernelTarget;
-import 'fasta/kernel/macro.dart';
+import 'fasta/kernel/macro/macro.dart';
 import 'fasta/kernel/utils.dart' show printComponentText, serializeComponent;
 import 'fasta/kernel/verifier.dart' show verifyComponent;
 import 'fasta/source/source_loader.dart' show SourceLoader;
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 102912e..4be720bd 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -25,7 +25,7 @@
 import '../api_prototype/terminal_color_support.dart'
     show printDiagnosticMessage;
 import '../base/common.dart';
-import '../fasta/kernel/macro.dart';
+import '../fasta/kernel/macro/macro.dart';
 import '../fasta/messages.dart' show FormattedMessage;
 import '../kernel_generator_impl.dart' show InternalCompilerResult;
 import 'compiler_common.dart' show compileScript, toTestUri;
diff --git a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
index 55076d6..a1c2094 100644
--- a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
+++ b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
@@ -37,12 +37,10 @@
 const String expectedHierarchy = """
 Object:
   superclasses:
-  interfaces:
 
 A:
   superclasses:
     Object
-  interfaces:
 
 B:
   Longest path to Object: 2
diff --git a/pkg/front_end/test/macros/application/macro_application_test.dart b/pkg/front_end/test/macros/application/macro_application_test.dart
index 731f92d..69ae9c6 100644
--- a/pkg/front_end/test/macros/application/macro_application_test.dart
+++ b/pkg/front_end/test/macros/application/macro_application_test.dart
@@ -16,7 +16,7 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/fasta/builder/field_builder.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/fasta/source/source_class_builder.dart';
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/macro_serializer.dart';
diff --git a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
index 175c4f3..27aa722 100644
--- a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
+++ b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
@@ -15,7 +15,7 @@
 import 'package:front_end/src/fasta/builder/class_builder.dart';
 import 'package:front_end/src/fasta/builder/library_builder.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
 import 'package:kernel/ast.dart' hide Arguments;
diff --git a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
index 2213b4c..6e38046 100644
--- a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
+++ b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
@@ -16,7 +16,7 @@
 import 'package:front_end/src/fasta/compiler_context.dart';
 import 'package:front_end/src/fasta/hybrid_file_system.dart';
 import 'package:front_end/src/fasta/incremental_compiler.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/isolate_macro_serializer.dart';
 import 'package:front_end/src/macro_serializer.dart';
 import 'package:front_end/src/testing/compiler_common.dart';
diff --git a/pkg/front_end/test/macros/macro_api_test.dart b/pkg/front_end/test/macros/macro_api_test.dart
index 768d1d1..1392e5f 100644
--- a/pkg/front_end/test/macros/macro_api_test.dart
+++ b/pkg/front_end/test/macros/macro_api_test.dart
@@ -11,7 +11,7 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/isolate_macro_serializer.dart';
 import 'package:front_end/src/macro_serializer.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
index 4acef90..a55684b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
index e793729..149333a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
index 841838c..7093a76 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
index 841838c..7093a76 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
index 742d873..0b49573 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
@@ -61,7 +61,7 @@
     return new self::Class::•<self::Class::fact::T%>(field);
   static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
     return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
   static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
     return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
index cc59901..f707639 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
index 8c398fe..00b5a13 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
index cc59901..f707639 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
@@ -23,20 +23,20 @@
     ;
   static method _#_#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
-  static factory •([core::int field = #C3]) → self::Class1
+  static factory •([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C2]) → self::Class1
     return new self::Class1::_(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
   constructor _({core::int field = #C2}) → self::Class2
     : self::Class2::field = field, super core::Object::•()
     ;
   static method _#_#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
-  static factory •({core::int field = #C3}) → self::Class2
+  static factory •({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C2}) → self::Class2
     return new self::Class2::_(field: field);
@@ -47,7 +47,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → void {
-  ([core::int]) → self::Class1 f1a = #C5;
+  ([core::int]) → self::Class1 f1a = #C4;
   self::Class1 c1a = f1a(){([core::int]) → self::Class1};
   self::expect(42, c1a.{self::Class1::field}{core::int});
   self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
@@ -58,13 +58,13 @@
     f1a(42, 87); // error
        ^" in f1a{<inapplicable>}.(42, 87);
   };
-  dynamic f1b = #C5;
+  dynamic f1b = #C4;
   dynamic c1c = f1b{dynamic}.call();
   self::expect(42, c1c{dynamic}.field);
   dynamic c1d = f1b{dynamic}.call(87);
   self::expect(87, c1d{dynamic}.field);
   self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
-  ({field: core::int}) → self::Class2 f2a = #C6;
+  ({field: core::int}) → self::Class2 f2a = #C5;
   self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
   self::expect(42, c2a.{self::Class2::field}{core::int});
   self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
@@ -75,7 +75,7 @@
     f2a(87); // error
        ^" in f2a{<inapplicable>}.(87);
   };
-  dynamic f2b = #C6;
+  dynamic f2b = #C5;
   dynamic c2c = f2b{dynamic}.call();
   self::expect(42, c2c{dynamic}.field);
   dynamic c2d = f2b{dynamic}.call(field: 87);
@@ -86,7 +86,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C6}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -103,9 +103,8 @@
 constants  {
   #C1 = constructor-tearoff self::Class1::•
   #C2 = 42
-  #C3 = null
-  #C4 = constructor-tearoff self::Class2::•
-  #C5 = static-tearoff self::Class1::_#new#tearOff
-  #C6 = static-tearoff self::Class2::_#new#tearOff
-  #C7 = false
+  #C3 = constructor-tearoff self::Class2::•
+  #C4 = static-tearoff self::Class1::_#new#tearOff
+  #C5 = static-tearoff self::Class2::_#new#tearOff
+  #C6 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
index aa4af4d..80d7fd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
index aa8c2df..f53573a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
index aa4af4d..80d7fd2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
@@ -52,11 +52,11 @@
     ;
   static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+  static factory redirectPositionalSame([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
     return new self::Class1::positional(field1, field2);
-  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+  static factory redirectPositionalFewer1([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
     return new self::Class1::positional(field1);
@@ -66,19 +66,19 @@
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedSame({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
-  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedReorder({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
-  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+  static factory redirectNamedFewer1({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
     return new self::Class1::named(field1: field1);
-  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+  static factory redirectNamedFewer2({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
     return new self::Class1::named(field2: field2);
@@ -93,7 +93,7 @@
   self::testDefaultValues();
 }
 static method testDefaultValues() → dynamic {
-  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  ([core::int, core::int]) → self::Class1 f1a = #C11;
   self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
   self::expect(1, c1a.{self::Class1::field1}{core::int});
   self::expect(2, c1a.{self::Class1::field2}{core::int});
@@ -103,7 +103,7 @@
   self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
   self::expect(42, c1c.{self::Class1::field1}{core::int});
   self::expect(87, c1c.{self::Class1::field2}{core::int});
-  ([core::int]) → self::Class1 f1b = #C13;
+  ([core::int]) → self::Class1 f1b = #C12;
   self::Class1 c1d = f1b(){([core::int]) → self::Class1};
   self::expect(1, c1d.{self::Class1::field1}{core::int});
   self::expect(2, c1d.{self::Class1::field2}{core::int});
@@ -116,7 +116,7 @@
     f1b(42, 87); // error
        ^" in f1b{<inapplicable>}.(42, 87);
   };
-  () → self::Class1 f1c = #C14;
+  () → self::Class1 f1c = #C13;
   self::Class1 c1f = f1c(){() → self::Class1};
   self::expect(1, c1f.{self::Class1::field1}{core::int});
   self::expect(2, c1f.{self::Class1::field2}{core::int});
@@ -130,7 +130,7 @@
     f1c(42, 87); // error
        ^" in f1c{<inapplicable>}.(42, 87);
   };
-  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C14;
   self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c2a.{self::Class1::field1}{core::int});
   self::expect(2, c2a.{self::Class1::field2}{core::int});
@@ -146,7 +146,7 @@
   self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c2e.{self::Class1::field1}{core::int});
   self::expect(87, c2e.{self::Class1::field2}{core::int});
-  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C15;
   self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(1, c3a.{self::Class1::field1}{core::int});
   self::expect(2, c3a.{self::Class1::field2}{core::int});
@@ -162,7 +162,7 @@
   self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
   self::expect(42, c3e.{self::Class1::field1}{core::int});
   self::expect(87, c3e.{self::Class1::field2}{core::int});
-  ({field1: core::int}) → self::Class1 f2c = #C17;
+  ({field1: core::int}) → self::Class1 f2c = #C16;
   self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
   self::expect(1, c4a.{self::Class1::field1}{core::int});
   self::expect(2, c4a.{self::Class1::field2}{core::int});
@@ -174,7 +174,7 @@
     f2c(field1: 42, field2: 87); // error
                     ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
   };
-  ({field2: core::int}) → self::Class1 f2d = #C18;
+  ({field2: core::int}) → self::Class1 f2d = #C17;
   self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
   self::expect(1, c5a.{self::Class1::field1}{core::int});
   self::expect(2, c5a.{self::Class1::field2}{core::int});
@@ -186,7 +186,7 @@
     f2d(field1: 42, field2: 87); // error
         ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
   };
-  () → self::Class1 f2e = #C19;
+  () → self::Class1 f2e = #C18;
   self::Class1 c6a = f2e(){() → self::Class1};
   self::expect(1, c6a.{self::Class1::field1}{core::int});
   self::expect(2, c6a.{self::Class1::field2}{core::int});
@@ -206,7 +206,7 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C19}) → dynamic {
   try {
     f(){() → dynamic};
   }
@@ -231,14 +231,13 @@
   #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
   #C9 = 1
   #C10 = 2
-  #C11 = null
-  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
-  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
-  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
-  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
-  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
-  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
-  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
-  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
-  #C20 = false
+  #C11 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C12 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C19 = false
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
index 713b894..3175a4a 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
index e1f62d1..9913373 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
index 911cbda..2a8a57e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
index 911cbda..2a8a57e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
index ec985b8..7444b65 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
@@ -53,7 +53,7 @@
     ;
   static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
     return new self::Class::•<self::Class::fact::T%>(field);
-  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::redirectingFactory::T%>
     return new self::Class::•<self::Class::redirectingFactory::T%>(field);
 }
 abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
index 7840205..3b2e796 100644
--- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
@@ -99,7 +99,7 @@
                    ^";
   static factory f5() → self::E
     return self::E::f();
-  static factory f6(core::int value) → self::E
+  static factory f6(core::int value = #C11) → self::E
     return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
   factory E.f6(int value) = E.f; // Error.
@@ -129,7 +129,7 @@
 Try using a constructor or factory that is 'const'.
   const E.f(); // Error.
         ^";
-  #C11;
+  #C12;
 }
 static method main() → dynamic {}
 
@@ -144,7 +144,8 @@
   #C8 = constructor-tearoff self::E::f4
   #C9 = constructor-tearoff self::E::f5
   #C10 = constructor-tearoff self::E::f6
-  #C11 = constructor-tearoff self::E::f
+  #C11 = null
+  #C12 = constructor-tearoff self::E::f
 }
 
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
index 0cdd47c..ec986d0 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
@@ -37,7 +37,7 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
     return throw "unsupported";
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
 }
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
index 706562c..0be5e5b 100644
--- a/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.transformed.expect
@@ -10,17 +10,17 @@
 }
 class Settings extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
-  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+  static factory •({@#C3 self::Sidebar sidebar = #C2}) → self::Settings
     return self::_SSettings::•(sidebar: sidebar);
 }
 class Sidebar extends core::Object {
-  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
   static factory •() → self::Sidebar
     return self::_SSidebar::•();
 }
 abstract class _SSettings extends core::Object implements self::Settings {
-  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
-  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C2}) → self::_SSettings
     return new self::_$_SSettings::•(sidebar: sidebar);
 }
 class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
@@ -30,7 +30,7 @@
     ;
 }
 abstract class _SSidebar extends core::Object implements self::Sidebar {
-  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
   static factory •() → self::_SSidebar
     return new self::_$_SSidebar::•();
 }
@@ -45,10 +45,9 @@
   #C1 = constructor-tearoff self::Settings::•
   #C2 = self::_$_SSidebar {}
   #C3 = self::Default {defaultValue:#C2}
-  #C4 = null
-  #C5 = constructor-tearoff self::Sidebar::•
-  #C6 = constructor-tearoff self::_SSettings::•
-  #C7 = constructor-tearoff self::_SSidebar::•
+  #C4 = constructor-tearoff self::Sidebar::•
+  #C5 = constructor-tearoff self::_SSettings::•
+  #C6 = constructor-tearoff self::_SSidebar::•
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue48548.dart b/pkg/front_end/testcases/general/issue48548.dart
new file mode 100644
index 0000000..52be292
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2022, 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.
+
+abstract class A {
+  int get value;
+  factory A({int value}) = _AImpl;
+}
+
+class _AImpl implements A {
+  final int value;
+  _AImpl({this.value = 0});
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+
+void main(List<String> args) {
+  expect(0, A().value);
+  expect(0, A.new().value);
+  expect(0, _new().value);
+  expect(0, (A.new)().value);
+  expect(0, _AImpl().value);
+  expect(0, _AImpl.new().value);
+  expect(0, _newImpl().value);
+  expect(0, (_AImpl.new)().value);
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect
new file mode 100644
index 0000000..a9c9cef
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+abstract class A {
+  int get value;
+  factory A({int value}) = _AImpl;
+}
+
+class _AImpl implements A {
+  final int value;
+  _AImpl({this.value = 0});
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+void main(List<String> args) {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0c47551
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+abstract class A {
+  factory A({int value}) = _AImpl;
+  int get value;
+}
+
+class _AImpl implements A {
+  _AImpl({this.value = 0});
+  final int value;
+}
+
+const _new = A.new;
+const _newImpl = _AImpl.new;
+expect(expected, actual) {}
+void main(List<String> args) {}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
new file mode 100644
index 0000000..3119c74
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = 0}) → self::_AImpl
+    ;
+}
+static const field ({value: core::int}) → self::A _new = self::A::•;
+static const field ({value: core::int}) → self::_AImpl _newImpl = self::_AImpl::•;
+static method main(core::List<core::String> args) → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue48548.dart:5:16 -> ConstructorTearOffConstant(A.)
+Evaluated: RedirectingFactoryTearOff @ org-dartlang-testcase:///issue48548.dart:15:14 -> RedirectingFactoryTearOffConstant(A.)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue48548.dart:16:18 -> ConstructorTearOffConstant(_AImpl.)
+Extra constant evaluation: evaluated: 6, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect
new file mode 100644
index 0000000..5077524
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48548.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  abstract get value() → core::int;
+  static factory •({core::int value = #C2}) → self::A
+    return new self::_AImpl::•(value: value);
+}
+class _AImpl extends core::Object implements self::A {
+  final field core::int value;
+  constructor •({core::int value = #C2}) → self::_AImpl
+    : self::_AImpl::value = value, super core::Object::•()
+    ;
+}
+static const field ({value: core::int}) → self::A _new = #C3;
+static const field ({value: core::int}) → self::_AImpl _newImpl = #C4;
+static method main(core::List<core::String> args) → void {
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, #C3(){({value: core::int}) → self::A}.{self::A::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, new self::_AImpl::•().{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+  self::expect(0, #C4(){({value: core::int}) → self::_AImpl}.{self::_AImpl::value}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = 0
+  #C3 = redirecting-factory-tearoff self::A::•
+  #C4 = constructor-tearoff self::_AImpl::•
+}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart b/pkg/front_end/testcases/general/redirecting_default_values.dart
new file mode 100644
index 0000000..322fc25
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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.
+
+class Class {
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+
+  Class.named({int a = 0, int b = 42});
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect
new file mode 100644
index 0000000..85004fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class Class {
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+  Class.named({int a = 0, int b = 42});
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c7ca7ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+class Class {
+  Class.named({int a = 0, int b = 42});
+  Class.positional([int a = 0, int b = 42]);
+  factory Class.redirect1a() = Class.positional;
+  factory Class.redirect1b() = Class.named;
+  factory Class.redirect2a(int a) = Class.positional;
+  factory Class.redirect2b({int a}) = Class.named;
+  factory Class.redirect3a([int a]) = Class.positional;
+  factory Class.redirect3b({int b}) = Class.named;
+  factory Class.redirect4a(int a, [int b]) = Class.positional;
+  factory Class.redirect4b({int a, int b}) = Class.named;
+  factory Class.redirect5a([int a, int b]) = Class.positional;
+  factory Class.redirect5b({int b, int a}) = Class.named;
+  factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+  factory Class.redirect6b({int a = 1, int b}) = Class.named;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
new file mode 100644
index 0000000..cbca85f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.outline.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect1a, self::Class::redirect2a, self::Class::redirect3a, self::Class::redirect4a, self::Class::redirect5a, self::Class::redirect6a, self::Class::redirect1b, self::Class::redirect2b, self::Class::redirect3b, self::Class::redirect4b, self::Class::redirect5b, self::Class::redirect6b]/*isLegacy*/;
+  constructor positional([core::int a = 0, core::int b = 42]) → self::Class
+    ;
+  constructor named({core::int a = 0, core::int b = 42}) → self::Class
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a, [core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a, core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a, core::int b]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a, core::int b}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b, core::int a}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a, core::int b}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect1a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect2a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect3a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect4a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect5a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect6a)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect1b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect2b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect3b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect4b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect5b)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirecting_default_values.dart:5:7 -> ConstructorTearOffConstant(Class.redirect6b)
+Extra constant evaluation: evaluated: 41, effectively constant: 12
diff --git a/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect
new file mode 100644
index 0000000..f08d181
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_default_values.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:12:44: Error: Can't have a default value here because any default values of 'Class.positional' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6a([int a, int b = 2]) = Class.positional;
+//                                            ^
+//
+// pkg/front_end/testcases/general/redirecting_default_values.dart:20:37: Error: Can't have a default value here because any default values of 'Class.named' would be used instead.
+// Try removing the default value.
+//   factory Class.redirect6b({int a = 1, int b}) = Class.named;
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C10, #C11, #C12]/*isLegacy*/;
+  constructor positional([core::int a = #C13, core::int b = #C14]) → self::Class
+    : super core::Object::•()
+    ;
+  constructor named({core::int a = #C13, core::int b = #C14}) → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect1a() → self::Class
+    return new self::Class::positional();
+  static factory redirect2a(core::int a = #C13) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect3a([core::int a = #C13]) → self::Class
+    return new self::Class::positional(a);
+  static factory redirect4a(core::int a = #C13, [core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect5a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect6a([core::int a = #C13, core::int b = #C14]) → self::Class
+    return new self::Class::positional(a, b);
+  static factory redirect1b() → self::Class
+    return new self::Class::named();
+  static factory redirect2b({core::int a = #C13}) → self::Class
+    return new self::Class::named(a: a);
+  static factory redirect3b({core::int b = #C14}) → self::Class
+    return new self::Class::named(b: b);
+  static factory redirect4b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+  static factory redirect5b({core::int b = #C14, core::int a = #C13}) → self::Class
+    return new self::Class::named(b: b, a: a);
+  static factory redirect6b({core::int a = #C13, core::int b = #C14}) → self::Class
+    return new self::Class::named(a: a, b: b);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect1a
+  #C2 = constructor-tearoff self::Class::redirect2a
+  #C3 = constructor-tearoff self::Class::redirect3a
+  #C4 = constructor-tearoff self::Class::redirect4a
+  #C5 = constructor-tearoff self::Class::redirect5a
+  #C6 = constructor-tearoff self::Class::redirect6a
+  #C7 = constructor-tearoff self::Class::redirect1b
+  #C8 = constructor-tearoff self::Class::redirect2b
+  #C9 = constructor-tearoff self::Class::redirect3b
+  #C10 = constructor-tearoff self::Class::redirect4b
+  #C11 = constructor-tearoff self::Class::redirect5b
+  #C12 = constructor-tearoff self::Class::redirect6b
+  #C13 = 0
+  #C14 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
index 4a74b87..1dd09f3 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
@@ -16,7 +16,7 @@
   constructor •([core::int field = #C2]) → self::A
     : self::A::field = field, super core::Object::•()
     ;
-  static factory redirect([core::int field]) → self::A
+  static factory redirect([core::int field = #C2]) → self::A
     return new self::A::•(field);
 }
 static method main() → dynamic {
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
index f16b938..3754d31 100644
--- a/pkg/frontend_server/lib/compute_kernel.dart
+++ b/pkg/frontend_server/lib/compute_kernel.dart
@@ -24,7 +24,7 @@
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:kernel/ast.dart' show Component, Library, Reference;
 import 'package:kernel/target/targets.dart';
 import 'package:vm/target/flutter.dart';
diff --git a/tools/VERSION b/tools/VERSION
index 4f4bab0..90afb1e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 207
+PRERELEASE 208
 PRERELEASE_PATCH 0
\ No newline at end of file