[cfe] Handle patch factories through fragments

Change-Id: I11a5b2e113d854ae159a823359ddbdd8e796f6db
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/415281
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/builder/builder.dart b/pkg/front_end/lib/src/builder/builder.dart
index e6ceab3..8f48ba3 100644
--- a/pkg/front_end/lib/src/builder/builder.dart
+++ b/pkg/front_end/lib/src/builder/builder.dart
@@ -277,7 +277,6 @@
   bool get isConst => false;
 
   @override
-  // Coverage-ignore(suite): Not run.
   bool get isConstructor => false;
 
   @override
@@ -324,7 +323,7 @@
   bool get isLocal => false;
 
   @override
-  bool get isAugmenting => this != origin;
+  bool get isAugmenting => false;
 
   @override
   bool get isAugment => false;
diff --git a/pkg/front_end/lib/src/fragment/factory.dart b/pkg/front_end/lib/src/fragment/factory.dart
index ad89d0e..e0c9642 100644
--- a/pkg/front_end/lib/src/fragment/factory.dart
+++ b/pkg/front_end/lib/src/fragment/factory.dart
@@ -30,6 +30,8 @@
 
   SourceFactoryBuilder? _builder;
 
+  FactoryDeclaration? _declaration;
+
   FactoryFragment({
     required this.constructorName,
     required this.fileUri,
@@ -65,6 +67,18 @@
     _builder = value;
   }
 
+  FactoryDeclaration get declaration {
+    assert(
+        _declaration != null, "Declaration has not been computed for $this.");
+    return _declaration!;
+  }
+
+  void set declaration(FactoryDeclaration value) {
+    assert(_declaration == null,
+        "Declaration has already been computed for $this.");
+    _declaration = value;
+  }
+
   @override
   FunctionBodyBuildingContext createFunctionBodyBuildingContext() {
     return new _FactoryBodyBuildingContext(this);
@@ -108,7 +122,7 @@
 
   @override
   BodyBuilderContext createBodyBuilderContext() {
-    return _fragment.builder.createBodyBuilderContext();
+    return _fragment.declaration.createBodyBuilderContext(_fragment.builder);
   }
 
   @override
@@ -119,9 +133,8 @@
       ?.inferenceData;
 
   @override
-  List<TypeParameter>? get thisTypeParameters =>
-      _fragment.builder.thisTypeParameters;
+  List<TypeParameter>? get thisTypeParameters => null;
 
   @override
-  VariableDeclaration? get thisVariable => _fragment.builder.thisVariable;
+  VariableDeclaration? get thisVariable => null;
 }
diff --git a/pkg/front_end/lib/src/source/constructor_declaration.dart b/pkg/front_end/lib/src/source/constructor_declaration.dart
index 47f64e1..6e69c22 100644
--- a/pkg/front_end/lib/src/source/constructor_declaration.dart
+++ b/pkg/front_end/lib/src/source/constructor_declaration.dart
@@ -6,13 +6,15 @@
 
 import '../kernel/expression_generator_helper.dart';
 import '../type_inference/inference_results.dart';
-import 'source_function_builder.dart';
+import 'source_member_builder.dart';
 import 'source_property_builder.dart';
 
 /// Common interface for builders for generative constructor declarations in
 /// source code, such as a generative constructor in a regular class or a
 /// generative constructor in an extension type declaration.
-abstract class ConstructorDeclarationBuilder implements SourceFunctionBuilder {
+abstract class ConstructorDeclarationBuilder implements SourceMemberBuilder {
+  FunctionNode get function;
+
   /// Returns `true` if this constructor, including its augmentations, is
   /// external.
   ///
diff --git a/pkg/front_end/lib/src/source/source_class_builder.dart b/pkg/front_end/lib/src/source/source_class_builder.dart
index 6a2aacd..4e78960 100644
--- a/pkg/front_end/lib/src/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/source/source_class_builder.dart
@@ -908,8 +908,7 @@
           // Report an error if a mixin class has a constructor with parameters,
           // is external, or is a redirecting constructor.
           if (constructor.isRedirecting ||
-              (constructor.formals != null &&
-                  constructor.formals!.isNotEmpty) ||
+              constructor.hasParameters ||
               constructor.isExternal) {
             addProblem(
                 templateIllegalMixinDueToConstructors
diff --git a/pkg/front_end/lib/src/source/source_constructor_builder.dart b/pkg/front_end/lib/src/source/source_constructor_builder.dart
index 435a1be..854635e 100644
--- a/pkg/front_end/lib/src/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/source/source_constructor_builder.dart
@@ -39,7 +39,6 @@
 import 'constructor_declaration.dart';
 import 'name_scheme.dart';
 import 'source_class_builder.dart';
-import 'source_function_builder.dart';
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 import 'source_loader.dart' show SourceLoader;
 import 'source_member_builder.dart';
@@ -76,7 +75,7 @@
 class SourceConstructorBuilderImpl extends SourceMemberBuilderImpl
     implements
         SourceConstructorBuilder,
-        SourceFunctionBuilder,
+        SourceMemberBuilder,
         Inferable,
         ConstructorDeclarationBuilder {
   final Modifiers modifiers;
@@ -169,13 +168,14 @@
   @override
   Builder get parent => declarationBuilder;
 
-  @override
+  bool get hasParameters => _introductory.formals != null;
+
   // Coverage-ignore(suite): Not run.
-  List<NominalParameterBuilder>? get typeParameters =>
+  List<NominalParameterBuilder>? get typeParametersForTesting =>
       _introductory.typeParameters;
 
-  @override
-  List<FormalParameterBuilder>? get formals => _introductory.formals;
+  // Coverage-ignore(suite): Not run.
+  List<FormalParameterBuilder>? get formalsForTesting => _introductory.formals;
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -210,21 +210,13 @@
   Name get memberName => _memberName.name;
 
   @override
+  // Coverage-ignore(suite): Not run.
   SourceConstructorBuilderImpl get origin => this;
 
   @override
   bool get isRedirecting => _lastDeclaration.isRedirecting;
 
   @override
-  // Coverage-ignore(suite): Not run.
-  VariableDeclaration? get thisVariable => _introductory.thisVariable;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  List<TypeParameter>? get thisTypeParameters =>
-      _introductory.thisTypeParameters;
-
-  @override
   Member get readTarget => _readTarget;
 
   @override
@@ -262,7 +254,6 @@
   @override
   FunctionNode get function => _lastDeclaration.function;
 
-  @override
   void becomeNative(SourceLoader loader) {
     _introductory.becomeNative();
     for (ConstructorDeclaration augmentation in _augmentations) {
@@ -284,7 +275,6 @@
 
   final String? nativeMethodName;
 
-  @override
   // Coverage-ignore(suite): Not run.
   bool get isNative => nativeMethodName != null;
 
diff --git a/pkg/front_end/lib/src/source/source_factory_builder.dart b/pkg/front_end/lib/src/source/source_factory_builder.dart
index 7e4e120..3eed714 100644
--- a/pkg/front_end/lib/src/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/source/source_factory_builder.dart
@@ -46,7 +46,7 @@
 import 'source_member_builder.dart';
 
 class SourceFactoryBuilder extends SourceMemberBuilderImpl
-    implements SourceFunctionBuilder {
+    implements FunctionBuilder {
   final Modifiers modifiers;
 
   @override
@@ -61,10 +61,6 @@
   @override
   final bool isExtensionInstanceMember = false;
 
-  SourceFactoryBuilder? _actualOrigin;
-
-  List<SourceFactoryBuilder>? _augmentations;
-
   final MemberName _memberName;
 
   @override
@@ -75,6 +71,12 @@
 
   final FactoryDeclaration _introductory;
 
+  final List<FactoryDeclaration> _augmentations;
+
+  late final FactoryDeclaration _lastDeclaration;
+
+  late final List<FactoryDeclaration> _augmentedDeclarations;
+
   SourceFactoryBuilder(
       {required this.modifiers,
       required this.name,
@@ -85,10 +87,23 @@
       required Reference? procedureReference,
       required Reference? tearOffReference,
       required NameScheme nameScheme,
-      required FactoryDeclaration introductory})
+      required FactoryDeclaration introductory,
+      required List<FactoryDeclaration> augmentations})
       : _memberName = nameScheme.getDeclaredName(name),
-        _introductory = introductory {
-    _introductory.createNode(
+        _introductory = introductory,
+        _augmentations = augmentations {
+    _augmentedDeclarations = [introductory, ...augmentations];
+    _lastDeclaration = _augmentedDeclarations.removeLast();
+
+    for (FactoryDeclaration augmentedDeclaration in _augmentedDeclarations) {
+      augmentedDeclaration.createNode(
+          name: name,
+          libraryBuilder: libraryBuilder,
+          nameScheme: nameScheme,
+          procedureReference: null,
+          tearOffReference: null);
+    }
+    _lastDeclaration.createNode(
         name: name,
         libraryBuilder: libraryBuilder,
         nameScheme: nameScheme,
@@ -96,29 +111,26 @@
         tearOffReference: tearOffReference);
   }
 
-  @override
   // Coverage-ignore(suite): Not run.
-  List<NominalParameterBuilder>? get typeParameters =>
+  List<NominalParameterBuilder>? get typeParametersForTesting =>
       _introductory.typeParameters;
 
-  TypeBuilder get returnType => _introductory.returnType;
-
-  @override
   // Coverage-ignore(suite): Not run.
-  List<FormalParameterBuilder>? get formals => _introductory.formals;
+  List<FormalParameterBuilder>? get formalsForTesting => _introductory.formals;
 
   @override
   // Coverage-ignore(suite): Not run.
   Iterable<MetadataBuilder>? get metadataForTesting => _introductory.metadata;
 
   ConstructorReferenceBuilder? get redirectionTarget =>
-      _introductory.redirectionTarget;
+      _lastDeclaration.redirectionTarget;
 
   @override
   // Coverage-ignore(suite): Not run.
   bool get isAugmentation => modifiers.isAugment;
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool get isExternal => modifiers.isExternal;
 
   @override
@@ -141,34 +153,12 @@
   // Coverage-ignore(suite): Not run.
   bool get isAssignable => false;
 
-  FormalParameterBuilder? getFormal(Identifier identifier) =>
-      _introductory.getFormal(identifier);
-
-  void setBody(Statement value) {
-    _introductory.setBody(value);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isNative => _introductory.isNative;
-
-  /// Returns the [index]th parameter of this function.
-  ///
-  /// The index is the syntactical index, including both positional and named
-  /// parameter in the order they are declared, and excluding the synthesized
-  /// this parameter on extension instance members.
-  VariableDeclaration getFormalParameter(int index) =>
-      _introductory.getFormalParameter(index);
-
-  @override
-  VariableDeclaration? get thisVariable => null;
-
-  @override
-  List<TypeParameter>? get thisTypeParameters => null;
-
-  @override
   void becomeNative(SourceLoader loader) {
     _introductory.becomeNative(loader: loader, annotatables: annotatables);
+    for (FactoryDeclaration augmentation in _augmentations) {
+      // Coverage-ignore-block(suite): Not run.
+      augmentation.becomeNative(loader: loader, annotatables: annotatables);
+    }
   }
 
   @override
@@ -178,15 +168,9 @@
   // Coverage-ignore(suite): Not run.
   Name get memberName => _memberName.name;
 
-  // Coverage-ignore(suite): Not run.
-  List<SourceFactoryBuilder>? get augmentationsForTesting => _augmentations;
-
-  void _setAsyncModifier(AsyncMarker newModifier) {
-    _introductory.asyncModifier = newModifier;
-  }
-
   @override
-  SourceFactoryBuilder get origin => _actualOrigin ?? this;
+  // Coverage-ignore(suite): Not run.
+  SourceFactoryBuilder get origin => this;
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -221,14 +205,12 @@
   // Coverage-ignore(suite): Not run.
   bool get isEnumElement => false;
 
-  Procedure get _procedure =>
-      isAugmenting ? origin._procedure : _introductory.procedure;
+  Procedure get _procedure => _lastDeclaration.procedure;
 
-  Procedure? get _tearOff =>
-      isAugmenting ? origin._tearOff : _introductory.tearOff;
+  Procedure? get _tearOff => _lastDeclaration.tearOff;
 
   @override
-  FunctionNode get function => _introductory.function;
+  FunctionNode get function => _lastDeclaration.function;
 
   @override
   Member get readTarget => _tearOff ?? _procedure;
@@ -256,6 +238,7 @@
   // Coverage-ignore(suite): Not run.
   Iterable<Reference> get exportedMemberReferences => [_procedure.reference];
 
+  // Coverage-ignore(suite): Not run.
   /// If this is an extension instance method or constructor with lowering
   /// enabled, the tear off parameter corresponding to the [index]th parameter
   /// on the instance method or constructor is returned.
@@ -276,47 +259,8 @@
       throw new UnsupportedError('${runtimeType}.localSetters');
 
   @override
-  void addAugmentation(Builder augmentation) {
-    _addAugmentation(augmentation);
-  }
-
-  void _addAugmentation(Builder augmentation) {
-    if (augmentation is SourceFactoryBuilder) {
-      if (checkAugmentation(
-          augmentationLibraryBuilder: augmentation.libraryBuilder,
-          origin: this,
-          augmentation: augmentation)) {
-        augmentation._actualOrigin = this;
-        (_augmentations ??= []).add(augmentation);
-      }
-    } else {
-      // Coverage-ignore-block(suite): Not run.
-      reportAugmentationMismatch(
-          originLibraryBuilder: libraryBuilder,
-          origin: this,
-          augmentation: augmentation);
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void applyAugmentation(Builder augmentation) {
-    _addAugmentation(augmentation);
-  }
-
-  @override
   int buildBodyNodes(BuildNodesCallback f) {
-    int count = 0;
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        count += augmentation.buildBodyNodes(f);
-      }
-    }
-    if (isAugmenting) {
-      _finishAugmentation();
-    }
-    return count;
+    return 0;
   }
 
   @override
@@ -324,12 +268,9 @@
       {required bool inErrorRecovery}) {
     int count = _introductory.computeDefaultTypes(context,
         inErrorRecovery: inErrorRecovery);
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        count += augmentation.computeDefaultTypes(context,
-            inErrorRecovery: inErrorRecovery);
-      }
+    for (FactoryDeclaration augmentation in _augmentations) {
+      count += augmentation.computeDefaultTypes(context,
+          inErrorRecovery: inErrorRecovery);
     }
     return count;
   }
@@ -343,11 +284,8 @@
   void checkTypes(SourceLibraryBuilder library, NameSpace nameSpace,
       TypeEnvironment typeEnvironment) {
     _introductory.checkTypes(library, nameSpace, typeEnvironment);
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        augmentation.checkTypes(library, nameSpace, typeEnvironment);
-      }
+    for (FactoryDeclaration augmentation in _augmentations) {
+      augmentation.checkTypes(library, nameSpace, typeEnvironment);
     }
   }
 
@@ -365,12 +303,12 @@
           factoryBuilder: this,
           typeEnvironment: typeEnvironment);
     }
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        if (augmentation.redirectionTarget != null) {
-          augmentation.checkRedirectingFactories(typeEnvironment);
-        }
+    for (FactoryDeclaration augmentation in _augmentations) {
+      if (augmentation.redirectionTarget != null) {
+        augmentation.checkRedirectingFactory(
+            libraryBuilder: libraryBuilder,
+            factoryBuilder: this,
+            typeEnvironment: typeEnvironment);
       }
     }
   }
@@ -386,40 +324,20 @@
   @override
   Iterable<Annotatable> get annotatables => [_procedure];
 
-  /// Returns `true` if this member is augmented, either by being the origin
-  /// of a augmented member or by not being the last among augmentations.
-  bool get isAugmented {
-    if (isAugmenting) {
-      return origin._augmentations!.last != this;
-    } else {
-      return _augmentations != null;
-    }
-  }
-
-  // Coverage-ignore(suite): Not run.
-  List<DartType>? get _redirectionTypeArguments =>
-      _introductory.redirectionTypeArguments;
-
-  // Coverage-ignore(suite): Not run.
-  void set _redirectionTypeArguments(List<DartType>? value) {
-    _introductory.redirectionTypeArguments = value;
-  }
-
   @override
   void buildOutlineNodes(BuildNodesCallback f) {
-    _introductory.buildOutlineNodes(
-        libraryBuilder: libraryBuilder, factoryBuilder: this, f: f);
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        augmentation.buildOutlineNodes((
-            {required Member member,
-            Member? tearOff,
-            required BuiltMemberKind kind}) {
-          // Don't add augmentations.
-        });
-      }
+    for (FactoryDeclaration augmentedDeclaration in _augmentedDeclarations) {
+      augmentedDeclaration.buildOutlineNodes(
+          libraryBuilder: libraryBuilder,
+          factoryBuilder: this,
+          isConst: isConst,
+          f: noAddBuildNodesCallback);
     }
+    _lastDeclaration.buildOutlineNodes(
+        libraryBuilder: libraryBuilder,
+        factoryBuilder: this,
+        f: f,
+        isConst: isConst);
   }
 
   bool _hasInferredRedirectionTarget = false;
@@ -428,14 +346,18 @@
       List<DelayedDefaultValueCloner> delayedDefaultValueCloners) {
     if (_hasInferredRedirectionTarget) return;
     _hasInferredRedirectionTarget = true;
-    if (isAugmenting) {
-      origin.inferRedirectionTarget(classHierarchy, delayedDefaultValueCloners);
-    }
     _introductory.inferRedirectionTarget(
         libraryBuilder: libraryBuilder,
         factoryBuilder: this,
         classHierarchy: classHierarchy,
         delayedDefaultValueCloners: delayedDefaultValueCloners);
+    for (FactoryDeclaration augmentation in _augmentations) {
+      augmentation.inferRedirectionTarget(
+          libraryBuilder: libraryBuilder,
+          factoryBuilder: this,
+          classHierarchy: classHierarchy,
+          delayedDefaultValueCloners: delayedDefaultValueCloners);
+    }
   }
 
   bool _hasBuiltOutlineExpressions = false;
@@ -447,95 +369,61 @@
     if (_hasBuiltOutlineExpressions) return;
     _hasBuiltOutlineExpressions = true;
 
-    if (_introductory.redirectionTarget != null && isConst && isAugmenting) {
-      origin.buildOutlineExpressions(
-          classHierarchy, delayedDefaultValueCloners);
-    }
-
     _introductory.buildOutlineExpressions(
         libraryBuilder: libraryBuilder,
         factoryBuilder: this,
         classHierarchy: classHierarchy,
-        delayedDefaultValueCloners: delayedDefaultValueCloners);
-
-    if (isConst && isAugmenting) {
-      _finishAugmentation();
+        delayedDefaultValueCloners: delayedDefaultValueCloners,
+        createFileUriExpression:
+            _introductory.fileUri != _lastDeclaration.fileUri);
+    for (FactoryDeclaration augmentation in _augmentations) {
+      augmentation.buildOutlineExpressions(
+          libraryBuilder: libraryBuilder,
+          factoryBuilder: this,
+          classHierarchy: classHierarchy,
+          delayedDefaultValueCloners: delayedDefaultValueCloners,
+          createFileUriExpression:
+              augmentation.fileUri != _lastDeclaration.fileUri);
     }
-
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        augmentation.buildOutlineExpressions(
-            classHierarchy, delayedDefaultValueCloners);
-      }
-    }
-  }
-
-  void _finishAugmentation() {
-    finishProcedureAugmentation(_procedure, _introductory.procedure);
-
-    if (_introductory.tearOff != null) {
-      finishProcedureAugmentation(_tearOff!, _introductory.tearOff!);
-    }
-
-    if (_introductory.redirectionTarget != null) {
-      if (origin.redirectionTarget != null) {
-        // Coverage-ignore-block(suite): Not run.
-        origin._redirectionTypeArguments = _redirectionTypeArguments;
-      }
-    }
-  }
-
-  BodyBuilderContext createBodyBuilderContext() {
-    return new FactoryBodyBuilderContext(this, _procedure);
   }
 
   void resolveRedirectingFactory() {
     _introductory.resolveRedirectingFactory(
         libraryBuilder: libraryBuilder, factoryBuilder: this);
-
-    List<SourceFactoryBuilder>? augmentations = _augmentations;
-    if (augmentations != null) {
-      for (SourceFactoryBuilder augmentation in augmentations) {
-        augmentation.resolveRedirectingFactory();
-      }
+    for (FactoryDeclaration augmentation in _augmentations) {
+      augmentation.resolveRedirectingFactory(
+          libraryBuilder: libraryBuilder, factoryBuilder: this);
     }
   }
-
-  void _setRedirectingFactoryBody(Member target, List<DartType> typeArguments) {
-    _introductory.setRedirectingFactoryBody(
-        libraryBuilder: libraryBuilder,
-        factoryBuilder: this,
-        target: target,
-        typeArguments: typeArguments);
-  }
 }
 
 class FactoryBodyBuilderContext extends BodyBuilderContext {
-  final SourceFactoryBuilder _member;
+  final SourceFactoryBuilder _builder;
 
-  final Member _builtMember;
+  final FactoryDeclaration _declaration;
 
-  FactoryBodyBuilderContext(this._member, this._builtMember)
-      : super(_member.libraryBuilder, _member.declarationBuilder,
-            isDeclarationInstanceMember: _member.isDeclarationInstanceMember);
+  final Member _member;
+
+  FactoryBodyBuilderContext(this._builder, this._declaration, this._member)
+      : super(_builder.libraryBuilder, _builder.declarationBuilder,
+            isDeclarationInstanceMember: _builder.isDeclarationInstanceMember);
 
   @override
   VariableDeclaration getFormalParameter(int index) {
-    return _member.getFormalParameter(index);
+    return _declaration.getFormalParameter(index);
   }
 
   @override
   VariableDeclaration? getTearOffParameter(int index) {
-    return _member.getTearOffParameter(index);
+    return _declaration.getTearOffParameter(index);
   }
 
   @override
-  TypeBuilder get returnType => _member.returnType;
+  TypeBuilder get returnType => _declaration.returnType;
 
   @override
   // Coverage-ignore(suite): Not run.
-  List<FormalParameterBuilder>? get formals => _member.formals;
+  List<FormalParameterBuilder>? get formals => _declaration.formals;
 
   @override
   LocalScope computeFormalParameterInitializerScope(LocalScope parent) {
@@ -546,78 +434,65 @@
 
   @override
   FormalParameterBuilder? getFormalParameterByName(Identifier name) {
-    return _member.getFormal(name);
+    return _declaration.getFormal(name);
   }
 
   @override
-  int get memberNameLength => _member.name.length;
+  int get memberNameLength => _builder.name.length;
 
   @override
   FunctionNode get function {
-    return _member.function;
+    return _declaration.function;
   }
 
   @override
   // Coverage-ignore(suite): Not run.
-  bool get isFactory {
-    return _member.isFactory;
-  }
+  bool get isFactory => true;
 
   @override
   // Coverage-ignore(suite): Not run.
   bool get isNativeMethod {
-    return _member.isNative;
+    return _declaration.isNative;
   }
 
   @override
   bool get isExternalFunction {
-    return _member.isExternal;
+    return _declaration.isExternal;
   }
 
   @override
-  bool get isSetter {
-    return _member.isSetter;
-  }
+  bool get isSetter => false;
 
   @override
-  // Coverage-ignore(suite): Not run.
-  AugmentSuperTarget? get augmentSuperTarget {
-    if (_member.isAugmentation) {
-      return _member.augmentSuperTarget;
-    }
-    return null;
-  }
-
-  @override
-  int get memberNameOffset => _member.fileOffset;
+  int get memberNameOffset => _declaration.fileOffset;
 
   @override
   // Coverage-ignore(suite): Not run.
   void registerSuperCall() {
-    _builtMember.transformerFlags |= TransformerFlag.superCalls;
+    _member.transformerFlags |= TransformerFlag.superCalls;
   }
 
   @override
   void registerFunctionBody(Statement body) {
-    _member.setBody(body);
+    _declaration.setBody(body);
   }
 
   @override
   void setAsyncModifier(AsyncMarker asyncModifier) {
-    _member._setAsyncModifier(asyncModifier);
+    _declaration.setAsyncModifier(asyncModifier);
   }
 
   @override
-  bool get isRedirectingFactory => _member.redirectionTarget != null;
+  bool get isRedirectingFactory => _declaration.redirectionTarget != null;
 
   @override
   DartType get returnTypeContext {
-    return _member.function.returnType;
+    return _declaration.function.returnType;
   }
 
   @override
   String get redirectingFactoryTargetName {
-    return _member.redirectionTarget!.fullNameForErrors;
+    return _declaration.redirectionTarget!.fullNameForErrors;
   }
 }
 
@@ -643,13 +518,15 @@
   void buildOutlineNodes(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
-      required BuildNodesCallback f});
+      required BuildNodesCallback f,
+      required bool isConst});
 
   void buildOutlineExpressions(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
       required ClassHierarchy classHierarchy,
-      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners});
+      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
+      required bool createFileUriExpression});
 
   void inferRedirectionTarget(
       {required SourceLibraryBuilder libraryBuilder,
@@ -671,7 +548,7 @@
 
   void setBody(Statement value);
 
-  void set asyncModifier(AsyncMarker newModifier);
+  void setAsyncModifier(AsyncMarker newModifier);
 
   FormalParameterBuilder? getFormal(Identifier identifier);
 
@@ -681,6 +558,12 @@
 
   bool get isNative;
 
+  bool get isExternal;
+
+  Uri get fileUri;
+
+  int get fileOffset;
+
   void becomeNative(
       {required SourceLoader loader,
       required Iterable<Annotatable> annotatables});
@@ -707,6 +590,9 @@
   Iterable<MetadataBuilder>? get metadata;
 
   ConstructorReferenceBuilder? get redirectionTarget;
+
+  BodyBuilderContext createBodyBuilderContext(
+      SourceFactoryBuilder factoryBuilder);
 }
 
 class FactoryDeclarationImpl implements FactoryDeclaration {
@@ -722,7 +608,9 @@
       : _encoding = new FactoryEncoding(_fragment,
             typeParameters: typeParameters,
             returnType: returnType,
-            redirectionTarget: _fragment.redirectionTarget);
+            redirectionTarget: _fragment.redirectionTarget) {
+    _fragment.declaration = this;
+  }
 
   @override
   Procedure get procedure => _encoding.procedure;
@@ -738,6 +626,15 @@
   bool get isNative => _encoding.isNative;
 
   @override
+  bool get isExternal => _fragment.modifiers.isExternal;
+
+  @override
+  Uri get fileUri => _fragment.fileUri;
+
+  @override
+  int get fileOffset => _fragment.fullNameOffset;
+
+  @override
   void becomeNative(
       {required SourceLoader loader,
       required Iterable<Annotatable> annotatables}) {
@@ -767,9 +664,20 @@
   void buildOutlineNodes(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
-      required BuildNodesCallback f}) {
+      required BuildNodesCallback f,
+      required bool isConst}) {
     _encoding.buildOutlineNodes(
-        libraryBuilder: libraryBuilder, factoryBuilder: factoryBuilder, f: f);
+        libraryBuilder: libraryBuilder,
+        factoryBuilder: factoryBuilder,
+        f: f,
+        isConst: isConst);
+  }
+
+  @override
+  BodyBuilderContext createBodyBuilderContext(
+      SourceFactoryBuilder factoryBuilder) {
+    return new FactoryBodyBuilderContext(
+        factoryBuilder, this, _encoding.procedure);
   }
 
   @override
@@ -777,26 +685,27 @@
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
       required ClassHierarchy classHierarchy,
-      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
+      required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
+      required bool createFileUriExpression}) {
     _fragment.formals?.infer(classHierarchy);
 
+    BodyBuilderContext bodyBuilderContext =
+        createBodyBuilderContext(factoryBuilder);
+
     for (Annotatable annotatable in factoryBuilder.annotatables) {
       MetadataBuilder.buildAnnotations(
           annotatable,
           _fragment.metadata,
-          factoryBuilder.createBodyBuilderContext(),
+          bodyBuilderContext,
           libraryBuilder,
           _fragment.fileUri,
           _fragment.enclosingScope,
-          createFileUriExpression: factoryBuilder.isAugmented);
+          createFileUriExpression: createFileUriExpression);
     }
     if (typeParameters != null) {
       for (int i = 0; i < typeParameters!.length; i++) {
-        typeParameters![i].buildOutlineExpressions(
-            libraryBuilder,
-            factoryBuilder.createBodyBuilderContext(),
-            classHierarchy,
-            _fragment.typeParameterScope);
+        typeParameters![i].buildOutlineExpressions(libraryBuilder,
+            bodyBuilderContext, classHierarchy, _fragment.typeParameterScope);
       }
     }
 
@@ -817,6 +726,7 @@
     _encoding.buildOutlineExpressions(
         libraryBuilder: libraryBuilder,
         factoryBuilder: factoryBuilder,
+        bodyBuilderContext: bodyBuilderContext,
         classHierarchy: classHierarchy,
         delayedDefaultValueCloners: delayedDefaultValueCloners);
   }
@@ -827,9 +737,12 @@
       required SourceFactoryBuilder factoryBuilder,
       required ClassHierarchy classHierarchy,
       required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
+    BodyBuilderContext bodyBuilderContext =
+        createBodyBuilderContext(factoryBuilder);
     _encoding.inferRedirectionTarget(
         libraryBuilder: libraryBuilder,
         factoryBuilder: factoryBuilder,
+        bodyBuilderContext: bodyBuilderContext,
         classHierarchy: classHierarchy,
         delayedDefaultValueCloners: delayedDefaultValueCloners);
   }
@@ -875,7 +788,7 @@
   }
 
   @override
-  void set asyncModifier(AsyncMarker newModifier) {
+  void setAsyncModifier(AsyncMarker newModifier) {
     _encoding.asyncModifier = newModifier;
   }
 
@@ -909,6 +822,7 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   void setRedirectingFactoryBody(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
@@ -1033,7 +947,8 @@
   void buildOutlineNodes(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
-      required BuildNodesCallback f}) {
+      required BuildNodesCallback f,
+      required bool isConst}) {
     _procedureInternal.function.asyncMarker = _asyncModifier;
     if (_redirectionTarget == null &&
         !_fragment.modifiers.isAbstract &&
@@ -1053,7 +968,10 @@
         _procedureInternal.fileEndOffset;
     _procedureInternal.isAbstract = _fragment.modifiers.isAbstract;
     _procedureInternal.isExternal = _fragment.modifiers.isExternal;
-    _procedureInternal.isConst = _fragment.modifiers.isConst;
+    // TODO(johnniwinther): DDC platform currently relies on the ability to
+    // patch a const constructor with a non-const patch. Remove this and enforce
+    // equal constness on origin and patch.
+    _procedureInternal.isConst = isConst;
     _procedureInternal.isStatic = _fragment.modifiers.isStatic;
 
     if (_redirectionTarget != null) {
@@ -1095,6 +1013,7 @@
   void buildOutlineExpressions(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
+      required BodyBuilderContext bodyBuilderContext,
       required ClassHierarchy classHierarchy,
       required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
     if (_delayedDefaultValueCloner != null) {
@@ -1105,6 +1024,7 @@
   void inferRedirectionTarget(
       {required SourceLibraryBuilder libraryBuilder,
       required SourceFactoryBuilder factoryBuilder,
+      required BodyBuilderContext bodyBuilderContext,
       required ClassHierarchy classHierarchy,
       required List<DelayedDefaultValueCloner> delayedDefaultValueCloners}) {
     if (_redirectionTarget == null) {
@@ -1128,11 +1048,8 @@
               _fragment.typeParameterScope,
               null);
       InferenceHelper helper = libraryBuilder.loader
-          .createBodyBuilderForOutlineExpression(
-              libraryBuilder,
-              factoryBuilder.createBodyBuilderContext(),
-              _fragment.enclosingScope,
-              _fragment.fileUri);
+          .createBodyBuilderForOutlineExpression(libraryBuilder,
+              bodyBuilderContext, _fragment.enclosingScope, _fragment.fileUri);
       Builder? targetBuilder = _redirectionTarget.target;
 
       if (targetBuilder is SourceMemberBuilder) {
@@ -1355,22 +1272,6 @@
       ..parent = _procedureInternal.function;
     _procedureInternal.function.redirectingFactoryTarget =
         new RedirectingFactoryTarget(target, typeArguments);
-    if (factoryBuilder.isAugmenting) {
-      if (_procedureInternal.function.typeParameters.isNotEmpty) {
-        Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-        for (int i = 0;
-            i < _procedureInternal.function.typeParameters.length;
-            i++) {
-          substitution[_procedureInternal.function.typeParameters[i]] =
-              new TypeParameterType.withDefaultNullability(
-                  factoryBuilder.origin.function.typeParameters[i]);
-        }
-        typeArguments = new List<DartType>.generate(typeArguments.length,
-            (int i) => substitute(typeArguments[i], substitution),
-            growable: false);
-      }
-      factoryBuilder.origin._setRedirectingFactoryBody(target, typeArguments);
-    }
   }
 
   void _addProblemForRedirectingFactory(
@@ -1427,21 +1328,6 @@
     // of their own.
     FunctionType factoryType = _procedureInternal.function
         .computeThisFunctionType(Nullability.nonNullable);
-    if (factoryBuilder.isAugmenting) {
-      // The redirection target type uses the origin type parameters so we must
-      // substitute augmentation type parameters before checking subtyping.
-      if (_procedureInternal.function.typeParameters.isNotEmpty) {
-        Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-        for (int i = 0;
-            i < _procedureInternal.function.typeParameters.length;
-            i++) {
-          substitution[_procedureInternal.function.typeParameters[i]] =
-              new TypeParameterType.withDefaultNullability(
-                  factoryBuilder.origin.function.typeParameters[i]);
-        }
-        factoryType = substitute(factoryType, substitution) as FunctionType;
-      }
-    }
     FunctionType? redirecteeType = _computeRedirecteeType(
         libraryBuilder: libraryBuilder,
         factoryBuilder: factoryBuilder,
@@ -1449,7 +1335,7 @@
     Map<TypeParameter, DartType> substitutionMap = {};
     for (int i = 0; i < factoryType.typeParameters.length; i++) {
       TypeParameter functionTypeParameter =
-          factoryBuilder.origin.function.typeParameters[i];
+          factoryBuilder.function.typeParameters[i];
       substitutionMap[functionTypeParameter] =
           new StructuralParameterType.withDefaultNullability(
               factoryType.typeParameters[i]);
diff --git a/pkg/front_end/lib/src/source/source_function_builder.dart b/pkg/front_end/lib/src/source/source_function_builder.dart
index 7e31aac..b1b1d53 100644
--- a/pkg/front_end/lib/src/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/source/source_function_builder.dart
@@ -15,54 +15,11 @@
 import '../builder/builder.dart';
 import '../builder/declaration_builders.dart';
 import '../builder/formal_parameter_builder.dart';
-import '../builder/function_builder.dart';
 import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../type_inference/type_inference_engine.dart'
     show IncludesTypeParametersNonCovariantly;
 import 'source_library_builder.dart';
-import 'source_loader.dart' show SourceLoader;
-import 'source_member_builder.dart';
-
-abstract class SourceFunctionBuilder
-    implements FunctionBuilder, SourceMemberBuilder {
-  List<NominalParameterBuilder>? get typeParameters;
-
-  List<FormalParameterBuilder>? get formals;
-
-  @override
-  bool get isAbstract;
-
-  @override
-  bool get isConstructor;
-
-  @override
-  bool get isRegularMethod;
-
-  @override
-  bool get isGetter;
-
-  @override
-  bool get isSetter;
-
-  @override
-  bool get isOperator;
-
-  @override
-  bool get isFactory;
-
-  bool get isNative;
-
-  /// Returns the parameter for 'this' synthetically added to extension
-  /// instance members.
-  VariableDeclaration? get thisVariable;
-
-  /// Returns a list of synthetic type parameters added to extension instance
-  /// members.
-  List<TypeParameter>? get thisTypeParameters;
-
-  void becomeNative(SourceLoader loader);
-}
 
 /// Builds the [TypeParameter]s for [declaredTypeParameters] and the parameter
 /// [VariableDeclaration]s for [declaredFormals] and adds them to [function].
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index 4fd70a7..ad22718 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -2785,10 +2785,10 @@
     LibraryBuilder? library =
         lookupLoadedLibraryBuilder(kernelLibrary.importUri);
     if (library == null) {
+      // Coverage-ignore-block(suite): Not run.
       return target.dillTarget.loader
           .computeExtensionTypeBuilderFromTargetExtensionType(extensionType);
     }
-    // Coverage-ignore(suite): Not run.
     return library.lookupLocalMember(extensionType.name, required: true)
         as ExtensionTypeDeclarationBuilder;
   }
diff --git a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
index 97aa728..d61c459 100644
--- a/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
+++ b/pkg/front_end/lib/src/source/type_parameter_scope_builder.dart
@@ -1974,46 +1974,69 @@
         }
       case FactoryFragment():
         String name = fragment.name;
-        NominalParameterCopy? nominalParameterCopy =
-            NominalParameterCopy.copyTypeParameters(
-                unboundNominalParameters: unboundNominalParameters,
-                oldParameterBuilders: declarationBuilder!.typeParameters,
-                oldParameterFragments:
-                    fragment.enclosingDeclaration.typeParameters,
-                kind: TypeParameterKind.function,
-                instanceTypeParameterAccess:
-                    InstanceTypeParameterAccessState.Allowed);
-        List<NominalParameterBuilder>? typeParameters =
-            nominalParameterCopy?.newParameterBuilders;
-        TypeBuilder returnType;
-        switch (declarationBuilder) {
-          case ExtensionBuilder():
-            // Make the synthesized return type invalid for extensions.
-            returnType = new NamedTypeBuilderImpl.forInvalidType(
-                fragment.constructorName.fullName,
-                const NullabilityBuilder.omitted(),
-                messageExtensionDeclaresConstructor.withLocation(
-                    fragment.fileUri,
-                    fragment.constructorName.fullNameOffset,
-                    fragment.constructorName.fullNameLength));
-          case ClassBuilder():
-          case ExtensionTypeDeclarationBuilder():
-            returnType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
-                declarationBuilder, const NullabilityBuilder.omitted(),
-                arguments: nominalParameterCopy?.newTypeArguments,
-                fileUri: fragment.fileUri,
-                charOffset: fragment.constructorName.fullNameOffset,
-                instanceTypeParameterAccess:
-                    InstanceTypeParameterAccessState.Allowed);
+        Modifiers modifiers = fragment.modifiers;
+
+        FactoryDeclaration createFactoryDeclaration(FactoryFragment fragment) {
+          NominalParameterCopy? nominalParameterCopy =
+              NominalParameterCopy.copyTypeParameters(
+                  unboundNominalParameters: unboundNominalParameters,
+                  oldParameterBuilders: declarationBuilder!.typeParameters,
+                  oldParameterFragments:
+                      fragment.enclosingDeclaration.typeParameters,
+                  kind: TypeParameterKind.function,
+                  instanceTypeParameterAccess:
+                      InstanceTypeParameterAccessState.Allowed);
+          List<NominalParameterBuilder>? typeParameters =
+              nominalParameterCopy?.newParameterBuilders;
+          TypeBuilder returnType;
+          switch (declarationBuilder) {
+            case ExtensionBuilder():
+              // Make the synthesized return type invalid for extensions.
+              returnType = new NamedTypeBuilderImpl.forInvalidType(
+                  fragment.constructorName.fullName,
+                  const NullabilityBuilder.omitted(),
+                  messageExtensionDeclaresConstructor.withLocation(
+                      fragment.fileUri,
+                      fragment.constructorName.fullNameOffset,
+                      fragment.constructorName.fullNameLength));
+            case ClassBuilder():
+            case ExtensionTypeDeclarationBuilder():
+              returnType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
+                  declarationBuilder, const NullabilityBuilder.omitted(),
+                  arguments: nominalParameterCopy?.newTypeArguments,
+                  fileUri: fragment.fileUri,
+                  charOffset: fragment.constructorName.fullNameOffset,
+                  instanceTypeParameterAccess:
+                      InstanceTypeParameterAccessState.Allowed);
+          }
+
+          fragment.typeParameterNameSpace.addTypeParameters(
+              problemReporting, typeParameters,
+              ownerName: fragment.name, allowNameConflict: true);
+          return new FactoryDeclarationImpl(fragment,
+              returnType: returnType, typeParameters: typeParameters);
         }
 
-        fragment.typeParameterNameSpace.addTypeParameters(
-            problemReporting, typeParameters,
-            ownerName: fragment.name, allowNameConflict: true);
-        FactoryDeclaration introductoryDeclaration = new FactoryDeclarationImpl(
-            fragment,
-            returnType: returnType,
-            typeParameters: typeParameters);
+        FactoryDeclaration introductoryDeclaration =
+            createFactoryDeclaration(fragment);
+
+        bool isRedirectingFactory = fragment.redirectionTarget != null;
+        List<FactoryDeclaration> augmentationDeclarations = [];
+        if (augmentations != null) {
+          for (Fragment augmentation in augmentations) {
+            // Promote [augmentation] to [FactoryFragment].
+            augmentation as FactoryFragment;
+
+            augmentationDeclarations
+                .add(createFactoryDeclaration(augmentation));
+
+            isRedirectingFactory |= augmentation.redirectionTarget != null;
+
+            if (!augmentation.modifiers.isExternal) {
+              modifiers -= Modifiers.External;
+            }
+          }
+        }
 
         NameScheme nameScheme = new NameScheme(
             containerName: containerName,
@@ -2040,21 +2063,31 @@
         }
 
         SourceFactoryBuilder factoryBuilder = new SourceFactoryBuilder(
-            modifiers: fragment.modifiers,
+            modifiers: modifiers,
             name: name,
             libraryBuilder: enclosingLibraryBuilder,
-            declarationBuilder: declarationBuilder,
+            declarationBuilder: declarationBuilder!,
             fileUri: fragment.fileUri,
             fileOffset: fragment.fullNameOffset,
             procedureReference: procedureReference,
             tearOffReference: tearOffReference,
             nameScheme: nameScheme,
-            introductory: introductoryDeclaration);
-        if (fragment.redirectionTarget != null) {
+            introductory: introductoryDeclaration,
+            augmentations: augmentationDeclarations);
+        if (isRedirectingFactory) {
           (enclosingLibraryBuilder.redirectingFactoryBuilders ??= [])
               .add(factoryBuilder);
         }
         fragment.builder = factoryBuilder;
+        if (augmentations != null) {
+          for (Fragment augmentation in augmentations) {
+            // Promote [augmentation] to [FactoryFragment].
+            augmentation as FactoryFragment;
+
+            augmentation.builder = factoryBuilder;
+          }
+          augmentations = null;
+        }
         builders.add(new _AddBuilder(fragment.name, factoryBuilder,
             fragment.fileUri, fragment.fullNameOffset,
             inPatch: fragment.enclosingDeclaration.isPatch));
@@ -2095,6 +2128,7 @@
     }
     if (augmentations != null) {
       for (Fragment augmentation in augmentations) {
+        // Coverage-ignore-block(suite): Not run.
         createBuilder(augmentation);
       }
     }
@@ -2480,8 +2514,7 @@
       Uri fileUri = addBuilder.fileUri;
       int charOffset = addBuilder.charOffset;
 
-      bool isConstructor = declaration is FunctionBuilder &&
-          (declaration.isConstructor || declaration.isFactory);
+      bool isConstructor = declaration.isConstructor || declaration.isFactory;
       if (!isConstructor && name == _name) {
         problemReporting.addProblem(
             messageMemberWithSameNameAsClass, charOffset, noLength, fileUri);
diff --git a/pkg/front_end/lib/src/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/type_inference/type_inference_engine.dart
index 9515f9f..ba71d08 100644
--- a/pkg/front_end/lib/src/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/type_inference/type_inference_engine.dart
@@ -363,10 +363,10 @@
       InferenceDataForTesting? dataForTesting) {
     AssignedVariables<TreeNode, VariableDeclaration> assignedVariables;
     if (dataForTesting != null) {
+      // Coverage-ignore-block(suite): Not run.
       assignedVariables = dataForTesting.flowAnalysisResult.assignedVariables =
           new AssignedVariablesForTesting<TreeNode, VariableDeclaration>();
     } else {
-      // Coverage-ignore-block(suite): Not run.
       assignedVariables =
           new AssignedVariables<TreeNode, VariableDeclaration>();
     }
@@ -397,10 +397,10 @@
       InferenceDataForTesting? dataForTesting) {
     AssignedVariables<TreeNode, VariableDeclaration> assignedVariables;
     if (dataForTesting != null) {
+      // Coverage-ignore-block(suite): Not run.
       assignedVariables = dataForTesting.flowAnalysisResult.assignedVariables =
           new AssignedVariablesForTesting<TreeNode, VariableDeclaration>();
     } else {
-      // Coverage-ignore-block(suite): Not run.
       assignedVariables =
           new AssignedVariables<TreeNode, VariableDeclaration>();
     }
@@ -422,7 +422,6 @@
   }
 }
 
-// Coverage-ignore(suite): Not run.
 // TODO(cstefantsova): Merge with [TypeInferenceResultForTesting].
 class InferenceDataForTesting extends shared
     .TypeConstraintGenerationDataForTesting<VariableDeclaration, TreeNode> {
@@ -505,7 +504,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
   SharedTypeView get dynamicType {
     return new SharedTypeView(const DynamicType());
   }
@@ -521,7 +519,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
   SharedTypeView get neverType {
     return new SharedTypeView(const NeverType.nonNullable());
   }
@@ -583,30 +580,29 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool isExtensionTypeInternal(DartType type) => type is ExtensionType;
 
   @override
-  // Coverage-ignore(suite): Not run.
   bool isFinal(VariableDeclaration variable) {
     return variable.isFinal;
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool isInterfaceTypeInternal(DartType type) {
     return type is InterfaceType;
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
   bool isNever(SharedTypeView type) {
     return typeEnvironment.coreTypes.isBottom(type.unwrapTypeView());
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool isObject(SharedTypeView type) {
-    DartType unwrappedType = type // Coverage-ignore(suite): Not run.
-        .unwrapTypeView();
-    // Coverage-ignore(suite): Not run.
+    DartType unwrappedType = type.unwrapTypeView();
     return unwrappedType is InterfaceType &&
         unwrappedType.classNode == typeEnvironment.objectClass &&
         unwrappedType.nullability == Nullability.nonNullable;
@@ -743,6 +739,7 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   bool isTypeSchemaSatisfied(
       {required SharedTypeSchemaView typeSchema,
       required SharedTypeView type}) {
@@ -751,7 +748,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
   bool isVariableFinal(VariableDeclaration node) {
     return node.isFinal;
   }
@@ -921,6 +917,7 @@
     switch (modifier) {
       case NullabilitySuffix.none:
         return computeTypeWithoutNullabilityMarker(type);
+      // Coverage-ignore(suite): Not run.
       case NullabilitySuffix.question:
         return type.withDeclaredNullability(Nullability.nullable);
       // Coverage-ignore(suite): Not run.
@@ -1025,6 +1022,7 @@
     if (type is TypeParameterType) {
       return type.parameter.bound;
     } else if (type is StructuralParameterType) {
+      // Coverage-ignore-block(suite): Not run.
       return type.parameter.bound;
     } else if (type is IntersectionType) {
       return type.right;
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index 9d9386b..823e946 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -240,7 +240,7 @@
   ),
   // 100.0%.
   "package:front_end/src/builder/builder.dart": (
-    hitCount: 30,
+    hitCount: 29,
     missCount: 0,
   ),
   // 100.0%.
@@ -515,7 +515,7 @@
   ),
   // 100.0%.
   "package:front_end/src/fragment/factory.dart": (
-    hitCount: 49,
+    hitCount: 51,
     missCount: 0,
   ),
   // 100.0%.
@@ -865,7 +865,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_class_builder.dart": (
-    hitCount: 1354,
+    hitCount: 1352,
     missCount: 0,
   ),
   // 100.0%.
@@ -875,7 +875,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_constructor_builder.dart": (
-    hitCount: 430,
+    hitCount: 429,
     missCount: 0,
   ),
   // 100.0%.
@@ -896,7 +896,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/source_factory_builder.dart": (
-    hitCount: 972,
+    hitCount: 860,
     missCount: 0,
   ),
   // 100.0%.
@@ -909,10 +909,10 @@
     hitCount: 1085,
     missCount: 0,
   ),
-  // 99.88919667590028%.
+  // 100.0%.
   "package:front_end/src/source/source_loader.dart": (
     hitCount: 1803,
-    missCount: 2,
+    missCount: 0,
   ),
   // 100.0%.
   "package:front_end/src/source/source_member_builder.dart": (
@@ -946,7 +946,7 @@
   ),
   // 100.0%.
   "package:front_end/src/source/type_parameter_scope_builder.dart": (
-    hitCount: 1579,
+    hitCount: 1591,
     missCount: 0,
   ),
   // 100.0%.
@@ -1025,6 +1025,11 @@
     missCount: 0,
   ),
   // 100.0%.
+  "package:front_end/src/type_inference/type_inference_engine.dart": (
+    hitCount: 539,
+    missCount: 0,
+  ),
+  // 100.0%.
   "package:front_end/src/type_inference/type_inferrer.dart": (
     hitCount: 102,
     missCount: 0,
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index e93509d..4c5e969 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -13,7 +13,8 @@
 import 'package:front_end/src/builder/library_builder.dart';
 import 'package:front_end/src/builder/member_builder.dart';
 import 'package:front_end/src/builder/type_builder.dart';
-import 'package:front_end/src/source/source_function_builder.dart';
+import 'package:front_end/src/source/source_constructor_builder.dart';
+import 'package:front_end/src/source/source_factory_builder.dart';
 import 'package:front_end/src/source/source_library_builder.dart';
 import 'package:front_end/src/source/source_method_builder.dart';
 import 'package:front_end/src/source/source_property_builder.dart';
@@ -231,9 +232,10 @@
     MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member)!;
     Features features = new Features();
     features[Tags.builderName] = memberBuilder.name;
-    if (memberBuilder is SourceFunctionBuilder) {
-      if (memberBuilder.formals != null) {
-        for (FormalParameterBuilder parameter in memberBuilder.formals!) {
+    if (memberBuilder is SourceConstructorBuilderImpl) {
+      if (memberBuilder.formalsForTesting != null) {
+        for (FormalParameterBuilder parameter
+            in memberBuilder.formalsForTesting!) {
           if (parameter.isRequiredPositional) {
             features.addElement(Tags.builderRequiredParameters, parameter.name);
           } else if (parameter.isPositional) {
@@ -248,9 +250,35 @@
         features.markAsUnsorted(Tags.builderPositionalParameters);
         features.markAsUnsorted(Tags.builderNamedParameters);
       }
-      if (memberBuilder.typeParameters != null) {
+      if (memberBuilder.typeParametersForTesting != null) {
         for (NominalParameterBuilder typeVariable
-            in memberBuilder.typeParameters!) {
+            in memberBuilder.typeParametersForTesting!) {
+          features.addElement(Tags.builderTypeParameters,
+              typeVariableBuilderToText(typeVariable));
+        }
+        features.markAsUnsorted(Tags.builderTypeParameters);
+      }
+    } else if (memberBuilder is SourceFactoryBuilder) {
+      if (memberBuilder.formalsForTesting != null) {
+        for (FormalParameterBuilder parameter
+            in memberBuilder.formalsForTesting!) {
+          if (parameter.isRequiredPositional) {
+            features.addElement(Tags.builderRequiredParameters, parameter.name);
+          } else if (parameter.isPositional) {
+            features.addElement(
+                Tags.builderPositionalParameters, parameter.name);
+          } else {
+            assert(parameter.isNamed);
+            features.addElement(Tags.builderNamedParameters, parameter.name);
+          }
+        }
+        features.markAsUnsorted(Tags.builderRequiredParameters);
+        features.markAsUnsorted(Tags.builderPositionalParameters);
+        features.markAsUnsorted(Tags.builderNamedParameters);
+      }
+      if (memberBuilder.typeParametersForTesting != null) {
+        for (NominalParameterBuilder typeVariable
+            in memberBuilder.typeParametersForTesting!) {
           features.addElement(Tags.builderTypeParameters,
               typeVariableBuilderToText(typeVariable));
         }
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index f1cc8496..6ab002a 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -13,7 +13,6 @@
 import 'package:front_end/src/builder/builder.dart';
 import 'package:front_end/src/builder/member_builder.dart';
 import 'package:front_end/src/source/source_class_builder.dart';
-import 'package:front_end/src/source/source_factory_builder.dart';
 import 'package:front_end/src/source/source_member_builder.dart';
 import 'package:front_end/src/source/source_property_builder.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
@@ -164,9 +163,6 @@
     if (memberBuilder is SourcePropertyBuilder) {
       patchMembers = memberBuilder.augmentationsForTesting;
     }
-    if (memberBuilder is SourceFactoryBuilder) {
-      patchMembers = memberBuilder.augmentationsForTesting;
-    }
     if (patchMembers != null) {
       features.add(Tags.patch);
     }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect
index aa522f2..7bd3284 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.modular.expect
index aa522f2..7bd3284 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.modular.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.outline.expect
index f14e20f..cb38188 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.outline.expect
@@ -7,10 +7,10 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({has-declared-initializer core::bool growable}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect
index 4416e69..83d6fbb 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.strong.transformed.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
index 6a3c8ec..0bf0456 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.expect
@@ -36,23 +36,23 @@
     : super core::Object::•() {
     core::print("patch Class");
   }
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
+    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#fact#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#fact#tearOff::T% value}) → test::Class<test::Class::_#fact#tearOff::T%>
     return test::Class::fact<test::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect#tearOff::T% value}) → test::Class<test::Class::_#redirect#tearOff::T%>
     return new test::ClassImpl::•<test::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect2#tearOff::T% value}) → test::Class<test::Class::_#redirect2#tearOff::T%>
     return new test::ClassImpl::patched<test::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
-    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
 class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
@@ -71,11 +71,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -97,5 +97,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.modular.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.modular.expect
index 6a3c8ec..0bf0456 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.modular.expect
@@ -36,23 +36,23 @@
     : super core::Object::•() {
     core::print("patch Class");
   }
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
+    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#fact#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#fact#tearOff::T% value}) → test::Class<test::Class::_#fact#tearOff::T%>
     return test::Class::fact<test::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect#tearOff::T% value}) → test::Class<test::Class::_#redirect#tearOff::T%>
     return new test::ClassImpl::•<test::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect2#tearOff::T% value}) → test::Class<test::Class::_#redirect2#tearOff::T%>
     return new test::ClassImpl::patched<test::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
-    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
 class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
@@ -71,11 +71,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -97,5 +97,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.outline.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.outline.expect
index 34ef2c6..85a7705 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.outline.expect
@@ -20,22 +20,23 @@
   @_in::patch
   constructor /* from org-dartlang-testcase:///patch_lib.dart */ •({core::bool defaultValue = true, required self2::Class::T% value}) → self2::Class<self2::Class::T%>
     ;
-  @_in::patch
-  external static factory fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
-  static method _#fact#tearOff<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::_#fact#tearOff::T% value}) → self2::Class<self2::Class::_#fact#tearOff::T%>
-    return self2::Class::fact<self2::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
-  @_in::patch
-  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
-    return new self2::ClassImpl::•<self2::Class::redirect::T%>(defaultValue: defaultValue, value: value);
-  static method _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect#tearOff::T% value}) → self2::Class<self2::Class::_#redirect#tearOff::T%>
-    return self2::Class::redirect<self2::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
-  @_in::patch
-  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
-    return new self2::ClassImpl::patched<self2::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
-  static method _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect2#tearOff::T% value}) → self2::Class<self2::Class::_#redirect2#tearOff::T%>
-    return self2::Class::redirect2<self2::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::_#new#tearOff::T% value}) → self2::Class<self2::Class::_#new#tearOff::T%>
     return new self2::Class::•<self2::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>
+    ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#fact#tearOff<T extends core::Object? = dynamic>({has-declared-initializer core::bool defaultValue, required self2::Class::_#fact#tearOff::T% value}) → self2::Class<self2::Class::_#fact#tearOff::T%>
+    return self2::Class::fact<self2::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
+    return new self2::ClassImpl::•<self2::Class::redirect::T%>(defaultValue: defaultValue, value: value);
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect#tearOff::T% value}) → self2::Class<self2::Class::_#redirect#tearOff::T%>
+    return new self2::ClassImpl::•<self2::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
+    return new self2::ClassImpl::patched<self2::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue, required self2::Class::_#redirect2#tearOff::T% value}) → self2::Class<self2::Class::_#redirect2#tearOff::T%>
+    return new self2::ClassImpl::patched<self2::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements self2::Class<self2::ClassImpl::T%> {
@@ -51,11 +52,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#new#tearOff::T value}) → self2::Class<self2::_#Alias#new#tearOff::T>
   return new self2::Class::•<self2::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#fact#tearOff::T value}) → self2::Class<self2::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#fact#tearOff::T value}) → self2::Class<self2::_#Alias#fact#tearOff::T>
   return self2::Class::fact<self2::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect#tearOff::T value}) → self2::Class<self2::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect#tearOff::T value}) → self2::Class<self2::_#Alias#redirect#tearOff::T>
   return self2::Class::_#redirect#tearOff<self2::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect2#tearOff::T value}) → self2::Class<self2::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect2#tearOff::T value}) → self2::Class<self2::_#Alias#redirect2#tearOff::T>
   return self2::Class::_#redirect2#tearOff<self2::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#AliasImpl#new#tearOff::T value}) → self2::ClassImpl<self2::_#AliasImpl#new#tearOff::T>
   return new self2::ClassImpl::•<self2::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -66,9 +67,9 @@
 Extra constant evaluation status:
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:8:1 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:10:4 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:27 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:12:21 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:15:10 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:15:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:19:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:22:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:27:1 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:29:4 -> InstanceConstant(const _Patch{})
 Extra constant evaluation: evaluated: 49, effectively constant: 7
diff --git a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
index 6a3c8ec..0bf0456 100644
--- a/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/tear_off_patch/main.dart.strong.transformed.expect
@@ -36,23 +36,23 @@
     : super core::Object::•() {
     core::print("patch Class");
   }
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
+    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#fact#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#fact#tearOff::T% value}) → test::Class<test::Class::_#fact#tearOff::T%>
     return test::Class::fact<test::Class::_#fact#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect#tearOff::T% value}) → test::Class<test::Class::_#redirect#tearOff::T%>
     return new test::ClassImpl::•<test::Class::_#redirect#tearOff::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#redirect2#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#redirect2#tearOff::T% value}) → test::Class<test::Class::_#redirect2#tearOff::T%>
     return new test::ClassImpl::patched<test::Class::_#redirect2#tearOff::T%>(defaultValue: defaultValue, value: value);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#new#tearOff<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::_#new#tearOff::T% value}) → test::Class<test::Class::_#new#tearOff::T%>
-    return new test::Class::•<test::Class::_#new#tearOff::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
 class ClassImpl<T extends core::Object? = dynamic> extends core::Object implements test::Class<test::ClassImpl::T%> {
@@ -71,11 +71,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::_#redirect#tearOff<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::_#redirect2#tearOff<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -97,5 +97,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.expect
index f776adc..1c10fb5 100644
--- a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.expect
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.expect
@@ -21,6 +21,8 @@
   const constructor /* from org-dartlang-testcase:///patch_lib.dart */ _internal({core::bool defaultValue = #C2}) → test::Class
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
@@ -31,8 +33,6 @@
     return throw "unsupported";
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#constFact#tearOff({core::bool defaultValue = #C3}) → test::Class
     return test::Class::constFact(defaultValue: defaultValue);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
-    return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.modular.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.modular.expect
index f776adc..1c10fb5 100644
--- a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.modular.expect
@@ -21,6 +21,8 @@
   const constructor /* from org-dartlang-testcase:///patch_lib.dart */ _internal({core::bool defaultValue = #C2}) → test::Class
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
@@ -31,8 +33,6 @@
     return throw "unsupported";
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#constFact#tearOff({core::bool defaultValue = #C3}) → test::Class
     return test::Class::constFact(defaultValue: defaultValue);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
-    return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.outline.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.outline.expect
index d02c957..7cc3b17 100644
--- a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.outline.expect
@@ -19,21 +19,23 @@
   const constructor /* from org-dartlang-testcase:///patch_lib.dart */ _internal({core::bool defaultValue = false}) → self2::Class
     : self2::Class::defaultValue = defaultValue, super core::Object::•()
     ;
-  @_in::patch
-  external static factory fact({core::bool defaultValue = true}) → self2::Class;
-  static method _#fact#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
-    return self2::Class::fact(defaultValue: defaultValue);
-  @_in::patch
-  external static factory constFact({core::bool defaultValue = true}) → self2::Class;
-  static method _#constFact#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
-    return self2::Class::constFact(defaultValue: defaultValue);
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
     return new self2::Class::_internal(defaultValue: defaultValue);
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = true}) → self2::Class
+    ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#fact#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
+    return self2::Class::fact(defaultValue: defaultValue);
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = true}) → self2::Class
+    ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#constFact#tearOff({has-declared-initializer core::bool defaultValue}) → self2::Class
+    return self2::Class::constFact(defaultValue: defaultValue);
 }
 
 
 Extra constant evaluation status:
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:8:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:26 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:14:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:18:4 -> InstanceConstant(const _Patch{})
 Extra constant evaluation: evaluated: 10, effectively constant: 3
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.transformed.expect
index f776adc..1c10fb5 100644
--- a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.strong.transformed.expect
@@ -21,6 +21,8 @@
   const constructor /* from org-dartlang-testcase:///patch_lib.dart */ _internal({core::bool defaultValue = #C2}) → test::Class
     : test::Class::defaultValue = defaultValue, super core::Object::•()
     ;
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
     return new test::Class::_internal(defaultValue: defaultValue);
@@ -31,8 +33,6 @@
     return throw "unsupported";
   static method /* from org-dartlang-testcase:///patch_lib.dart */ _#constFact#tearOff({core::bool defaultValue = #C3}) → test::Class
     return test::Class::constFact(defaultValue: defaultValue);
-  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
-    return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
index 8d654ea..831312d 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.expect
@@ -543,10 +543,10 @@
   return self::E24|constructor#<self::E24|constructor#_#new#tearOff::T%>(it);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#Alias14#fromEnvironment#tearOff<unrelated T extends core::Object? = dynamic>(core::String name, {core::int defaultValue = #C1}) → core::int
   return core::int::fromEnvironment(name, defaultValue: defaultValue);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16b% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16b% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16b% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
@@ -555,10 +555,10 @@
   return core::List::generate<self::E16b% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16b% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16a% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16a% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16a% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
@@ -567,10 +567,10 @@
   return core::List::generate<self::E16a% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16a% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#empty#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias23#empty#tearOff::T%>
   return core::List::empty<self::_#Alias23#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#from#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#from#tearOff::T%>
   return core::List::from<self::_#Alias23#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#of#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias23#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#of#tearOff::T%>
@@ -579,10 +579,10 @@
   return core::List::generate<self::_#Alias23#generate#tearOff::T%>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#unmodifiable#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements) → core::List<self::_#Alias23#unmodifiable#tearOff::T%>
   return core::List::unmodifiable<self::_#Alias23#unmodifiable#tearOff::T%>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#empty#tearOff<T extends self::E24<self::_#Alias24#empty#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias24#empty#tearOff::T%>
   return core::List::empty<self::_#Alias24#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#from#tearOff<T extends self::E24<self::_#Alias24#from#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#from#tearOff::T%>
   return core::List::from<self::_#Alias24#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#of#tearOff<T extends self::E24<self::_#Alias24#of#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias24#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#of#tearOff::T%>
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.modular.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.modular.expect
index 8d654ea..831312d 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.modular.expect
@@ -543,10 +543,10 @@
   return self::E24|constructor#<self::E24|constructor#_#new#tearOff::T%>(it);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#Alias14#fromEnvironment#tearOff<unrelated T extends core::Object? = dynamic>(core::String name, {core::int defaultValue = #C1}) → core::int
   return core::int::fromEnvironment(name, defaultValue: defaultValue);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16b% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16b% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16b% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
@@ -555,10 +555,10 @@
   return core::List::generate<self::E16b% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16b% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16a% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16a% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16a% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
@@ -567,10 +567,10 @@
   return core::List::generate<self::E16a% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16a% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#empty#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias23#empty#tearOff::T%>
   return core::List::empty<self::_#Alias23#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#from#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#from#tearOff::T%>
   return core::List::from<self::_#Alias23#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#of#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias23#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#of#tearOff::T%>
@@ -579,10 +579,10 @@
   return core::List::generate<self::_#Alias23#generate#tearOff::T%>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#unmodifiable#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements) → core::List<self::_#Alias23#unmodifiable#tearOff::T%>
   return core::List::unmodifiable<self::_#Alias23#unmodifiable#tearOff::T%>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#empty#tearOff<T extends self::E24<self::_#Alias24#empty#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias24#empty#tearOff::T%>
   return core::List::empty<self::_#Alias24#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#from#tearOff<T extends self::E24<self::_#Alias24#from#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#from#tearOff::T%>
   return core::List::from<self::_#Alias24#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#of#tearOff<T extends self::E24<self::_#Alias24#of#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias24#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#of#tearOff::T%>
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.outline.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.outline.expect
index 5fbe8cb..1779129 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.outline.expect
@@ -483,10 +483,10 @@
   return self::E24|constructor#<self::E24|constructor#_#new#tearOff::T%>(it);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#Alias14#fromEnvironment#tearOff<unrelated T extends core::Object? = dynamic>(core::String name, {has-declared-initializer core::int defaultValue}) → core::int
   return core::int::fromEnvironment(name, defaultValue: defaultValue);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {has-declared-initializer core::bool growable}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#empty#tearOff<unrelated T extends core::Object? = dynamic>({has-declared-initializer core::bool growable}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16b% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {has-declared-initializer core::bool growable}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16b% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16b% /* erasure=invalid-type, declared=! */> elements, {has-declared-initializer core::bool growable}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
@@ -495,10 +495,10 @@
   return core::List::generate<self::E16b% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16b% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {has-declared-initializer core::bool growable}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#empty#tearOff<unrelated T extends core::Object? = dynamic>({has-declared-initializer core::bool growable}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16a% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {has-declared-initializer core::bool growable}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16a% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16a% /* erasure=invalid-type, declared=! */> elements, {has-declared-initializer core::bool growable}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
@@ -507,10 +507,10 @@
   return core::List::generate<self::E16a% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16a% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias23#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#empty#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>({has-declared-initializer core::bool growable}) → core::List<self::_#Alias23#empty#tearOff::T%>
   return core::List::empty<self::_#Alias23#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias23#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#from#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias23#from#tearOff::T%>
   return core::List::from<self::_#Alias23#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#of#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias23#of#tearOff::T%> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias23#of#tearOff::T%>
@@ -519,10 +519,10 @@
   return core::List::generate<self::_#Alias23#generate#tearOff::T%>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#unmodifiable#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements) → core::List<self::_#Alias23#unmodifiable#tearOff::T%>
   return core::List::unmodifiable<self::_#Alias23#unmodifiable#tearOff::T%>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias24#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#empty#tearOff<T extends self::E24<self::_#Alias24#empty#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>({has-declared-initializer core::bool growable}) → core::List<self::_#Alias24#empty#tearOff::T%>
   return core::List::empty<self::_#Alias24#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias24#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#from#tearOff<T extends self::E24<self::_#Alias24#from#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias24#from#tearOff::T%>
   return core::List::from<self::_#Alias24#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#of#tearOff<T extends self::E24<self::_#Alias24#of#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias24#of#tearOff::T%> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#Alias24#of#tearOff::T%>
diff --git a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
index 8d654ea..831312d 100644
--- a/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extension_types/cyclic_representation_type.dart.strong.transformed.expect
@@ -543,10 +543,10 @@
   return self::E24|constructor#<self::E24|constructor#_#new#tearOff::T%>(it);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#Alias14#fromEnvironment#tearOff<unrelated T extends core::Object? = dynamic>(core::String name, {core::int defaultValue = #C1}) → core::int
   return core::int::fromEnvironment(name, defaultValue: defaultValue);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16b% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16b% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16b% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16b% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16b% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
@@ -555,10 +555,10 @@
   return core::List::generate<self::E16b% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16a#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16b% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16b% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
-  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#empty#tearOff<unrelated T extends core::Object? = dynamic>({core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::empty<self::E16a% /* erasure=invalid-type, declared=! */>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#filled#tearOff<unrelated T extends core::Object? = dynamic>(core::int length, self::E16a% /* erasure=invalid-type, declared=! */ fill, {core::bool growable = #C2}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
+  return core::List::filled<self::E16a% /* erasure=invalid-type, declared=! */>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#from#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::from<self::E16a% /* erasure=invalid-type, declared=! */>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#of#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<self::E16a% /* erasure=invalid-type, declared=! */> elements, {core::bool growable = #C3}) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
@@ -567,10 +567,10 @@
   return core::List::generate<self::E16a% /* erasure=invalid-type, declared=! */>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias16b#unmodifiable#tearOff<unrelated T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<self::E16a% /* erasure=invalid-type, declared=! */>
   return core::List::unmodifiable<self::E16a% /* erasure=invalid-type, declared=! */>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#empty#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias23#empty#tearOff::T%>
   return core::List::empty<self::_#Alias23#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#filled#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias23#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias23#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias23#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#from#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#from#tearOff::T%>
   return core::List::from<self::_#Alias23#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#of#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias23#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias23#of#tearOff::T%>
@@ -579,10 +579,10 @@
   return core::List::generate<self::_#Alias23#generate#tearOff::T%>(length, generator, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias23#unmodifiable#tearOff<T extends self::E23% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements) → core::List<self::_#Alias23#unmodifiable#tearOff::T%>
   return core::List::unmodifiable<self::_#Alias23#unmodifiable#tearOff::T%>(elements);
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
-  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#empty#tearOff<T extends self::E24<self::_#Alias24#empty#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>({core::bool growable = #C2}) → core::List<self::_#Alias24#empty#tearOff::T%>
   return core::List::empty<self::_#Alias24#empty#tearOff::T%>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#filled#tearOff<T extends self::E24<self::_#Alias24#filled#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::int length, self::_#Alias24#filled#tearOff::T% fill, {core::bool growable = #C2}) → core::List<self::_#Alias24#filled#tearOff::T%>
+  return core::List::filled<self::_#Alias24#filled#tearOff::T%>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#from#tearOff<T extends self::E24<self::_#Alias24#from#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<dynamic> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#from#tearOff::T%>
   return core::List::from<self::_#Alias24#from#tearOff::T%>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#Alias24#of#tearOff<T extends self::E24<self::_#Alias24#of#tearOff::T%>% /* erasure=invalid-type, declared=! */ = self::E24<dynamic>% /* erasure=invalid-type, declared=! */>(core::Iterable<self::_#Alias24#of#tearOff::T%> elements, {core::bool growable = #C3}) → core::List<self::_#Alias24#of#tearOff::T%>
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.strong.outline.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.strong.outline.expect
index 91a92f6..14561fc 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.strong.outline.expect
@@ -20,9 +20,11 @@
     : self2::Class::defaultValue = defaultValue, super core::Object::•()
     ;
   @_in::patch
-  external static factory fact({core::bool defaultValue = true}) → self2::Class;
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = true}) → self2::Class
+    ;
   @_in::patch
-  external static factory constFact({core::bool defaultValue = true}) → self2::Class;
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = true}) → self2::Class
+    ;
   @_in::patch
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = true}) → self2::Class /* redirection-target: self2::Class::_internal */
     return new self2::Class::_internal(defaultValue: defaultValue);
@@ -31,7 +33,7 @@
 
 Extra constant evaluation status:
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:8:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:26 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:14:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:18:4 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:21:4 -> InstanceConstant(const _Patch{})
 Extra constant evaluation: evaluated: 7, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/issue47462.dart.strong.expect b/pkg/front_end/testcases/general/issue47462.dart.strong.expect
index aa522f2..7bd3284 100644
--- a/pkg/front_end/testcases/general/issue47462.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue47462.dart.strong.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/general/issue47462.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue47462.dart.strong.modular.expect
index aa522f2..7bd3284 100644
--- a/pkg/front_end/testcases/general/issue47462.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/issue47462.dart.strong.modular.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/general/issue47462.dart.strong.outline.expect b/pkg/front_end/testcases/general/issue47462.dart.strong.outline.expect
index f14e20f..cb38188 100644
--- a/pkg/front_end/testcases/general/issue47462.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/issue47462.dart.strong.outline.expect
@@ -7,10 +7,10 @@
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({has-declared-initializer core::bool growable}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {has-declared-initializer core::bool growable}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/general/issue47462.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue47462.dart.strong.transformed.expect
index 4416e69..83d6fbb 100644
--- a/pkg/front_end/testcases/general/issue47462.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47462.dart.strong.transformed.expect
@@ -22,10 +22,10 @@
   if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
     throw "Expected ${expected}, actual ${actual}";
 }
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
-  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
   return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
   return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
 static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
diff --git a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.expect b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.expect
index b93dd24..5a17e7c 100644
--- a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.expect
+++ b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.expect
@@ -161,7 +161,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5b extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b /* redirection-target: test::Class5bImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:44:23: Error: The constructor function type 'Class5bImpl Function()' isn't a subtype of 'Class5b Function()'.
  - 'Class5bImpl' is from 'dart:test'.
  - 'Class5b' is from 'dart:test'.
@@ -177,7 +177,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5c extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c /* redirection-target: test::Class5cImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:53:23: Error: The constructor function type 'Class5cImpl Function()' isn't a subtype of 'Class5c Function()'.
  - 'Class5cImpl' is from 'dart:test'.
  - 'Class5c' is from 'dart:test'.
@@ -193,7 +193,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6a<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%> /* redirection-target: test::_Class6aImpl::•<test::Class6a::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:62:41: Error: The constructor function type '_Class6aImpl<T> Function(void Function(T))' isn't a subtype of 'Class6a<T> Function(void Function(T))'.
  - '_Class6aImpl' is from 'dart:test'.
  - 'Class6a' is from 'dart:test'.
@@ -209,7 +209,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6c<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%> /* redirection-target: test::_Class6cImpl::•<test::Class6c::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:82:41: Error: The constructor function type '_Class6cImpl<T> Function(void Function(T))' isn't a subtype of 'Class6c<T> Function(void Function(T))'.
  - '_Class6cImpl' is from 'dart:test'.
  - 'Class6c' is from 'dart:test'.
diff --git a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.modular.expect b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.modular.expect
index b93dd24..5a17e7c 100644
--- a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.modular.expect
@@ -161,7 +161,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5b extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b /* redirection-target: test::Class5bImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:44:23: Error: The constructor function type 'Class5bImpl Function()' isn't a subtype of 'Class5b Function()'.
  - 'Class5bImpl' is from 'dart:test'.
  - 'Class5b' is from 'dart:test'.
@@ -177,7 +177,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5c extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c /* redirection-target: test::Class5cImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:53:23: Error: The constructor function type 'Class5cImpl Function()' isn't a subtype of 'Class5c Function()'.
  - 'Class5cImpl' is from 'dart:test'.
  - 'Class5c' is from 'dart:test'.
@@ -193,7 +193,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6a<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%> /* redirection-target: test::_Class6aImpl::•<test::Class6a::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:62:41: Error: The constructor function type '_Class6aImpl<T> Function(void Function(T))' isn't a subtype of 'Class6a<T> Function(void Function(T))'.
  - '_Class6aImpl' is from 'dart:test'.
  - 'Class6a' is from 'dart:test'.
@@ -209,7 +209,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6c<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%> /* redirection-target: test::_Class6cImpl::•<test::Class6c::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:82:41: Error: The constructor function type '_Class6cImpl<T> Function(void Function(T))' isn't a subtype of 'Class6c<T> Function(void Function(T))'.
  - '_Class6cImpl' is from 'dart:test'.
  - 'Class6c' is from 'dart:test'.
diff --git a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.outline.expect b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.outline.expect
index 166cfb4..1c6875e 100644
--- a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.outline.expect
@@ -93,7 +93,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class5a extends core::Object {
   @_in::patch
-  external static factory •() → self2::Class5a /* redirection-target: self2::Class5aImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → self2::Class5a /* redirection-target: self2::Class5aImpl::• */
     return new self2::Class5aImpl::•();
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
@@ -104,8 +104,12 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class5b extends core::Object {
   @_in::patch
-  external static factory •() → self2::Class5b
-    return new self2::Class5bImpl::•();
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → self2::Class5b
+    return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:44:23: Error: The constructor function type 'Class5bImpl Function()' isn't a subtype of 'Class5b Function()'.
+ - 'Class5bImpl' is from 'dart:test'.
+ - 'Class5b' is from 'dart:test'.
+  factory Class5b() = Class5bImpl;
+                      ^";
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class5bImpl extends core::Object {
@@ -115,8 +119,12 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class5c extends core::Object {
   @_in::patch
-  external static factory •() → self2::Class5c
-    return new self2::Class5cImpl::•();
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → self2::Class5c
+    return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:53:23: Error: The constructor function type 'Class5cImpl Function()' isn't a subtype of 'Class5c Function()'.
+ - 'Class5cImpl' is from 'dart:test'.
+ - 'Class5c' is from 'dart:test'.
+  factory Class5c() = Class5cImpl;
+                      ^";
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class5cImpl extends core::Object {
@@ -126,20 +134,28 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class6a<T extends core::Object? = dynamic> extends core::Object {
   @_in::patch
-  external static factory •<T extends core::Object? = dynamic>((self2::Class6a::•::T%) → void f) → self2::Class6a<self2::Class6a::•::T%>
-    return new self2::_Class6aImpl::•<self2::Class6a::•::T%>(f);
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((self2::Class6a::•::T%) → void f) → self2::Class6a<self2::Class6a::•::T%>
+    return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:62:41: Error: The constructor function type '_Class6aImpl<T> Function(void Function(T))' isn't a subtype of 'Class6a<T> Function(void Function(T))'.
+ - '_Class6aImpl' is from 'dart:test'.
+ - 'Class6a' is from 'dart:test'.
+  factory Class6a(void Function(T) f) = _Class6aImpl<T>;
+                                        ^";
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class6b<T extends core::Object? = dynamic> extends core::Object {
   @_in::patch
-  external static factory •<T extends core::Object? = dynamic>((self2::Class6b::•::T%) → void f) → self2::Class6b<self2::Class6b::•::T%> /* redirection-target: self2::_Class6bImpl::•<self2::Class6b::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((self2::Class6b::•::T%) → void f) → self2::Class6b<self2::Class6b::•::T%> /* redirection-target: self2::_Class6bImpl::•<self2::Class6b::•::T%>*/
     return new self2::_Class6bImpl::•<self2::Class6b::•::T%>(f);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class6c<T extends core::Object? = dynamic> extends core::Object {
   @_in::patch
-  external static factory •<T extends core::Object? = dynamic>((self2::Class6c::•::T%) → void f) → self2::Class6c<self2::Class6c::•::T%>
-    return new self2::_Class6cImpl::•<self2::Class6c::•::T%>(f);
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((self2::Class6c::•::T%) → void f) → self2::Class6c<self2::Class6c::•::T%>
+    return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:82:41: Error: The constructor function type '_Class6cImpl<T> Function(void Function(T))' isn't a subtype of 'Class6c<T> Function(void Function(T))'.
+ - '_Class6cImpl' is from 'dart:test'.
+ - 'Class6c' is from 'dart:test'.
+  factory Class6c(void Function(T) f) = _Class6cImpl<T>;
+                                        ^";
 }
 class _Class6aImpl<T extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///patch_lib.dart
   constructor •((self2::_Class6aImpl::T%) → void f) → self2::_Class6aImpl<self2::_Class6aImpl::T%>
@@ -170,18 +186,18 @@
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:26:1 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:29:1 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:32:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:31:29 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:34:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:38:1 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:41:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:39:16 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:43:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:47:1 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:50:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:46:44 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:52:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:56:1 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:59:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:54:6 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:61:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:69:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:71:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:79:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 32, effectively constant: 23
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:81:4 -> InstanceConstant(const _Patch{})
+Extra constant evaluation: evaluated: 26, effectively constant: 23
diff --git a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.transformed.expect
index 6d00291..78f2bc7 100644
--- a/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/patch_extends_implements/main.dart.strong.transformed.expect
@@ -161,7 +161,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5b extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b /* redirection-target: test::Class5bImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5b
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:44:23: Error: The constructor function type 'Class5bImpl Function()' isn't a subtype of 'Class5b Function()'.
  - 'Class5bImpl' is from 'dart:test'.
  - 'Class5b' is from 'dart:test'.
@@ -177,7 +177,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class5c extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c /* redirection-target: test::Class5cImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → test::Class5c
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:53:23: Error: The constructor function type 'Class5cImpl Function()' isn't a subtype of 'Class5c Function()'.
  - 'Class5cImpl' is from 'dart:test'.
  - 'Class5c' is from 'dart:test'.
@@ -193,7 +193,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6a<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%> /* redirection-target: test::_Class6aImpl::•<test::Class6a::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6a::•::T%) → void f) → test::Class6a<test::Class6a::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:62:41: Error: The constructor function type '_Class6aImpl<T> Function(void Function(T))' isn't a subtype of 'Class6a<T> Function(void Function(T))'.
  - '_Class6aImpl' is from 'dart:test'.
  - 'Class6a' is from 'dart:test'.
@@ -209,7 +209,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C1
 class Class6c<T extends core::Object? = dynamic> extends core::Object {
   @#C1
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%> /* redirection-target: test::_Class6cImpl::•<test::Class6c::•::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object? = dynamic>((test::Class6c::•::T%) → void f) → test::Class6c<test::Class6c::•::T%>
     return invalid-expression "pkg/front_end/testcases/general/patch_extends_implements/patch_lib.dart:82:41: Error: The constructor function type '_Class6cImpl<T> Function(void Function(T))' isn't a subtype of 'Class6c<T> Function(void Function(T))'.
  - '_Class6cImpl' is from 'dart:test'.
  - 'Class6c' is from 'dart:test'.
diff --git a/pkg/front_end/testcases/general/patch_internal/main.dart.strong.outline.expect b/pkg/front_end/testcases/general/patch_internal/main.dart.strong.outline.expect
index 8f6d2b5..df5c7e1 100644
--- a/pkg/front_end/testcases/general/patch_internal/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/patch_internal/main.dart.strong.outline.expect
@@ -18,7 +18,7 @@
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
 class Class extends core::Object {
   @_in::patch
-  external static factory •() → self2::Class /* redirection-target: _te::ClassImpl::• */
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •() → self2::Class /* redirection-target: _te::ClassImpl::• */
     return new _te::ClassImpl::•();
 }
 
@@ -37,5 +37,5 @@
 
 Extra constant evaluation status:
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:9:1 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:11:4 -> InstanceConstant(const _Patch{})
 Extra constant evaluation: evaluated: 3, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/patching/main.dart.strong.expect b/pkg/front_end/testcases/general/patching/main.dart.strong.expect
index 4c507cb..f6b0e35 100644
--- a/pkg/front_end/testcases/general/patching/main.dart.strong.expect
+++ b/pkg/front_end/testcases/general/patching/main.dart.strong.expect
@@ -57,12 +57,6 @@
     : this test::Class::•(value)
     ;
   @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
-    return new test::Class::•(value);
-  @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
-    return new test::Class::•(value);
-  @#C8
   get /* from org-dartlang-testcase:///patch_lib.dart */ instanceGetter() → core::int
     return 42;
   @#C8
@@ -72,8 +66,14 @@
     return 42;
   @#C8
   static set /* from org-dartlang-testcase:///patch_lib.dart */ staticSetter(core::int value) → void {}
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedFactory(core::int value) → test::Class
     return new test::Class::•(value);
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedRedirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
     return new test::Class::•(value);
   get /* from org-dartlang-testcase:///patch_lib.dart */ _injectedInstanceGetter() → core::int
diff --git a/pkg/front_end/testcases/general/patching/main.dart.strong.modular.expect b/pkg/front_end/testcases/general/patching/main.dart.strong.modular.expect
index 4c507cb..f6b0e35 100644
--- a/pkg/front_end/testcases/general/patching/main.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/patching/main.dart.strong.modular.expect
@@ -57,12 +57,6 @@
     : this test::Class::•(value)
     ;
   @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
-    return new test::Class::•(value);
-  @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
-    return new test::Class::•(value);
-  @#C8
   get /* from org-dartlang-testcase:///patch_lib.dart */ instanceGetter() → core::int
     return 42;
   @#C8
@@ -72,8 +66,14 @@
     return 42;
   @#C8
   static set /* from org-dartlang-testcase:///patch_lib.dart */ staticSetter(core::int value) → void {}
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedFactory(core::int value) → test::Class
     return new test::Class::•(value);
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedRedirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
     return new test::Class::•(value);
   get /* from org-dartlang-testcase:///patch_lib.dart */ _injectedInstanceGetter() → core::int
diff --git a/pkg/front_end/testcases/general/patching/main.dart.strong.outline.expect b/pkg/front_end/testcases/general/patching/main.dart.strong.outline.expect
index cf82370..9781a35 100644
--- a/pkg/front_end/testcases/general/patching/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/patching/main.dart.strong.outline.expect
@@ -26,11 +26,6 @@
   constructor /* from org-dartlang-testcase:///patch_lib.dart */ _injectedRedirecting(core::int value) → self2::Class
     ;
   @_in::patch
-  external static factory factory(core::int value) → self2::Class;
-  @_in::patch
-  external static factory redirectingFactory(core::int value) → self2::Class /* redirection-target: self2::Class::• */
-    return new self2::Class::•(value);
-  @_in::patch
   external get instanceGetter() → core::int;
   @_in::patch
   external set instanceSetter(core::int value) → void;
@@ -38,8 +33,14 @@
   external static get staticGetter() → core::int;
   @_in::patch
   external static set staticSetter(core::int value) → void;
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → self2::Class
+    ;
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedFactory(core::int value) → self2::Class
     ;
+  @_in::patch
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → self2::Class /* redirection-target: self2::Class::• */
+    return new self2::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedRedirectingFactory(core::int value) → self2::Class /* redirection-target: self2::Class::• */
     return new self2::Class::•(value);
   get /* from org-dartlang-testcase:///patch_lib.dart */ _injectedInstanceGetter() → core::int
@@ -164,8 +165,8 @@
 Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:75:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:80:4 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:95:4 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:100:4 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:113:4 -> InstanceConstant(const _Patch{})
diff --git a/pkg/front_end/testcases/general/patching/main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/patching/main.dart.strong.transformed.expect
index 4c507cb..f6b0e35 100644
--- a/pkg/front_end/testcases/general/patching/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/patching/main.dart.strong.transformed.expect
@@ -57,12 +57,6 @@
     : this test::Class::•(value)
     ;
   @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
-    return new test::Class::•(value);
-  @#C8
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
-    return new test::Class::•(value);
-  @#C8
   get /* from org-dartlang-testcase:///patch_lib.dart */ instanceGetter() → core::int
     return 42;
   @#C8
@@ -72,8 +66,14 @@
     return 42;
   @#C8
   static set /* from org-dartlang-testcase:///patch_lib.dart */ staticSetter(core::int value) → void {}
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ factory(core::int value) → test::Class
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedFactory(core::int value) → test::Class
     return new test::Class::•(value);
+  @#C8
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
+    return new test::Class::•(value);
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ _injectedRedirectingFactory(core::int value) → test::Class /* redirection-target: test::Class::• */
     return new test::Class::•(value);
   get /* from org-dartlang-testcase:///patch_lib.dart */ _injectedInstanceGetter() → core::int
diff --git a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.expect b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.expect
index cf12d53..50bfde7 100644
--- a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.expect
+++ b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.expect
@@ -40,10 +40,10 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
@@ -59,11 +59,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::redirect<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::redirect2<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -85,5 +85,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }
diff --git a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.modular.expect b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.modular.expect
index cf12d53..50bfde7 100644
--- a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.modular.expect
@@ -40,10 +40,10 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
@@ -59,11 +59,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::redirect<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::redirect2<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -85,5 +85,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }
diff --git a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.outline.expect b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.outline.expect
index a549ddb..d08f09e 100644
--- a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.outline.expect
@@ -21,12 +21,13 @@
   constructor /* from org-dartlang-testcase:///patch_lib.dart */ •({core::bool defaultValue = true, required self2::Class::T% value}) → self2::Class<self2::Class::T%>
     ;
   @_in::patch
-  external static factory fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>;
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = true, required self2::Class::fact::T% value}) → self2::Class<self2::Class::fact::T%>
+    ;
   @_in::patch
-  external static factory redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect::T% value}) → self2::Class<self2::Class::redirect::T%> /* redirection-target: self2::ClassImpl::•<self2::Class::redirect::T%>*/
     return new self2::ClassImpl::•<self2::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   @_in::patch
-  external static factory redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = null, required self2::Class::redirect2::T% value}) → self2::Class<self2::Class::redirect2::T%> /* redirection-target: self2::ClassImpl::patched<self2::Class::redirect2::T%>*/
     return new self2::ClassImpl::patched<self2::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
@@ -39,11 +40,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#new#tearOff::T value}) → self2::Class<self2::_#Alias#new#tearOff::T>
   return new self2::Class::•<self2::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#fact#tearOff::T value}) → self2::Class<self2::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#Alias#fact#tearOff::T value}) → self2::Class<self2::_#Alias#fact#tearOff::T>
   return self2::Class::fact<self2::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect#tearOff::T value}) → self2::Class<self2::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect#tearOff::T value}) → self2::Class<self2::_#Alias#redirect#tearOff::T>
   return self2::Class::redirect<self2::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect2#tearOff::T value}) → self2::Class<self2::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue, required self2::_#Alias#redirect2#tearOff::T value}) → self2::Class<self2::_#Alias#redirect2#tearOff::T>
   return self2::Class::redirect2<self2::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({has-declared-initializer core::bool defaultValue, required self2::_#AliasImpl#new#tearOff::T value}) → self2::ClassImpl<self2::_#AliasImpl#new#tearOff::T>
   return new self2::ClassImpl::•<self2::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -54,9 +55,9 @@
 Extra constant evaluation status:
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:8:1 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:10:4 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:27 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:12:21 -> InstanceConstant(const _Patch{})
-Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:15:10 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:15:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:19:4 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:22:4 -> InstanceConstant(const _Patch{})
 Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:27:1 -> InstanceConstant(const _Patch{})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:29:4 -> InstanceConstant(const _Patch{})
 Extra constant evaluation: evaluated: 31, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.transformed.expect
index cf12d53..50bfde7 100644
--- a/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/tear_off_patch/main.dart.strong.transformed.expect
@@ -40,10 +40,10 @@
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::fact::T% value}) → test::Class<test::Class::fact::T%>
     return new test::ClassImpl::•<test::Class::fact::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect::T% value}) → test::Class<test::Class::redirect::T%> /* redirection-target: test::ClassImpl::•<test::Class::redirect::T%>*/
     return new test::ClassImpl::•<test::Class::redirect::T%>(defaultValue: defaultValue, value: value);
   @#C13
-  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C15, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect2<T extends core::Object? = dynamic>({core::bool defaultValue = #C14, required test::Class::redirect2::T% value}) → test::Class<test::Class::redirect2::T%> /* redirection-target: test::ClassImpl::patched<test::Class::redirect2::T%>*/
     return new test::ClassImpl::patched<test::Class::redirect2::T%>(defaultValue: defaultValue, value: value);
 }
 @/* from org-dartlang-testcase:///patch_lib.dart */ #C13
@@ -59,11 +59,11 @@
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#new#tearOff::T value}) → test::Class<test::_#Alias#new#tearOff::T>
   return new test::Class::•<test::_#Alias#new#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#fact#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#fact#tearOff::T value}) → test::Class<test::_#Alias#fact#tearOff::T>
   return test::Class::fact<test::_#Alias#fact#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect#tearOff::T value}) → test::Class<test::_#Alias#redirect#tearOff::T>
   return test::Class::redirect<test::_#Alias#redirect#tearOff::T>(defaultValue: defaultValue, value: value);
-static method _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _#Alias#redirect2#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#Alias#redirect2#tearOff::T value}) → test::Class<test::_#Alias#redirect2#tearOff::T>
   return test::Class::redirect2<test::_#Alias#redirect2#tearOff::T>(defaultValue: defaultValue, value: value);
 static method _#AliasImpl#new#tearOff<T extends core::num>({core::bool defaultValue = #C14, required test::_#AliasImpl#new#tearOff::T value}) → test::ClassImpl<test::_#AliasImpl#new#tearOff::T>
   return new test::ClassImpl::•<test::_#AliasImpl#new#tearOff::T>(defaultValue: defaultValue, value: value);
@@ -85,5 +85,4 @@
   #C12 = static-tearoff test::_#AliasImpl#patched#tearOff
   #C13 = _in::_Patch {}
   #C14 = true
-  #C15 = null
 }