Version 2.14.0-381.0.dev

Merge commit 'a302550068c429e4adbb632b70d8427383602459' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index d40b3a4..8ede85a 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -250,7 +250,7 @@
       "name": "dds",
       "rootUri": "../pkg/dds",
       "packageUri": "lib/",
-      "languageVersion": "2.14"
+      "languageVersion": "2.12"
     },
     {
       "name": "dev_compiler",
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 7313659..8155799 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -22,8 +22,8 @@
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/conflicting_edit_exception.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -338,14 +338,7 @@
       }
     }
 
-    int computeChangeHash() {
-      var hash = 0;
-      var edits = builder.sourceChange.edits;
-      for (var i = 0; i < edits.length; ++i) {
-        hash = JenkinsSmiHash.combine(hash, edits[i].hashCode);
-      }
-      return JenkinsSmiHash.finish(hash);
-    }
+    int computeChangeHash() => (builder as ChangeBuilderImpl).changeHash;
 
     Future<void> generate(CorrectionProducer producer, String code) async {
       var oldHash = computeChangeHash();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
index 4022696..cb280c7 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
@@ -574,6 +574,58 @@
 }
 ''');
   }
+
+  Future<void> test_addParameter_withImport() async {
+    newFile('$workspaceRootPath/p/lib/d.dart', content: '''
+class D {}
+''');
+    setPackageContent('''
+import 'd.dart';
+
+class C {
+  void m(D x) {}
+}
+''');
+    addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Add parameter'
+  date: 2021-08-03
+  element:
+    uris: ['$importUri']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'addParameter'
+      index: 0
+      name: 'x'
+      style: required_positional
+      argumentValue:
+        expression: '{% d %}()'
+        variables:
+          d:
+            kind: 'import'
+            uris: ['d.dart']
+            name: 'D'
+''');
+    await resolveTestCode('''
+import '$importUri';
+
+void f(C c) {
+  c.m();
+  c.m();
+}
+''');
+    await assertHasFix('''
+import 'package:p/d.dart';
+import '$importUri';
+
+void f(C c) {
+  c.m(D());
+  c.m(D());
+}
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 7d50e7e..a8fcbf3 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -95,7 +95,9 @@
   CompileTimeErrorCode.CAST_TO_NON_TYPE,
   CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
+  CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD,
+  CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER,
   CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD,
   CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
   CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD,
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index af4dab4..c8caff3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -352,10 +352,14 @@
     }
 
     // Run lints that handle specific node types.
-    unit.accept(LinterVisitor(
+    unit.accept(
+      LinterVisitor(
         nodeRegistry,
-        LinterExceptionHandler(_analysisOptions.propagateLinterExceptions)
-            .logException));
+        LinterExceptionHandler(
+          propagateExceptions: _analysisOptions.propagateLinterExceptions,
+        ).logException,
+      ),
+    );
   }
 
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 4387e37..a40e33a 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -1308,9 +1308,11 @@
 class LinterExceptionHandler {
   /// Indicates whether linter exceptions should be propagated to the caller (by
   /// re-throwing them)
-  final bool propagateLinterExceptions;
+  final bool propagateExceptions;
 
-  LinterExceptionHandler(this.propagateLinterExceptions);
+  LinterExceptionHandler({
+    required this.propagateExceptions,
+  });
 
   /// A method that can be passed to the `LinterVisitor` constructor to handle
   /// exceptions that occur during linting.
@@ -1332,7 +1334,7 @@
     // TODO(39284): should this exception be silent?
     AnalysisEngine.instance.instrumentationService.logException(
         SilentException(buffer.toString(), exception, stackTrace));
-    if (propagateLinterExceptions) {
+    if (propagateExceptions) {
       throw exception;
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 327af6e..930340a 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -348,10 +348,14 @@
     }
 
     // Run lints that handle specific node types.
-    unit.accept(LinterVisitor(
+    unit.accept(
+      LinterVisitor(
         nodeRegistry,
-        LinterExceptionHandler(_analysisOptions.propagateLinterExceptions)
-            .logException));
+        LinterExceptionHandler(
+          propagateExceptions: _analysisOptions.propagateLinterExceptions,
+        ).logException,
+      ),
+    );
   }
 
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index fb2881f..29f4fe2 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1565,7 +1565,7 @@
 
   /**
    * Parameters:
-   * 0: the name of the field
+   * 0: the name of the constructor and field
    */
   // #### Description
   //
@@ -1610,6 +1610,19 @@
 
   /**
    * Parameters:
+   * 0: the name of the constructor and getter
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER =
+      CompileTimeErrorCode(
+          'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
+          "'{0}' can't be used to name both a constructor and a static getter "
+              "in this class.",
+          correction: "Try renaming either the constructor or the getter.",
+          hasPublishedDocs: true,
+          uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER');
+
+  /**
+   * Parameters:
    * 0: the name of the constructor
    */
   static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD =
@@ -1622,6 +1635,19 @@
           uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD');
 
   /**
+   * Parameters:
+   * 0: the name of the constructor and setter
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER =
+      CompileTimeErrorCode(
+          'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
+          "'{0}' can't be used to name both a constructor and a static setter "
+              "in this class.",
+          correction: "Try renaming either the constructor or the setter.",
+          hasPublishedDocs: true,
+          uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER');
+
+  /**
    * 10.11 Class Member Conflicts: Let `C` be a class. It is a compile-time
    * error if `C` declares a getter or a setter with basename `n`, and has a
    * method named `n`.
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index 0947fbe..7ad7ac9 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -302,11 +302,18 @@
           var staticMember = staticGetters[name] ?? staticSetters[name];
           if (staticMember != null) {
             if (staticMember is PropertyAccessorElement) {
-              _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
-                nameNode,
-                [name],
-              );
+              CompileTimeErrorCode errorCode;
+              if (staticMember.isSynthetic) {
+                errorCode = CompileTimeErrorCode
+                    .CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD;
+              } else if (staticMember.isGetter) {
+                errorCode = CompileTimeErrorCode
+                    .CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER;
+              } else {
+                errorCode = CompileTimeErrorCode
+                    .CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER;
+              }
+              _errorReporter.reportErrorForNode(errorCode, nameNode, [name]);
             } else {
               _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD,
diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.dart b/pkg/analyzer/lib/src/lint/linter_visitor.dart
index 0794a4c..424d04a 100644
--- a/pkg/analyzer/lib/src/lint/linter_visitor.dart
+++ b/pkg/analyzer/lib/src/lint/linter_visitor.dart
@@ -18,8 +18,8 @@
   final LintRuleExceptionHandler exceptionHandler;
 
   LinterVisitor(this.registry, [LintRuleExceptionHandler? exceptionHandler])
-      : exceptionHandler =
-            exceptionHandler ?? LinterExceptionHandler(true).logException;
+      : exceptionHandler = exceptionHandler ??
+            LinterExceptionHandler(propagateExceptions: true).logException;
 
   @override
   void visitAdjacentStrings(AdjacentStrings node) {
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index d5bb61e..c59ee4f 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -180,8 +180,8 @@
   static int get foo => 0;
 }
 ''', [
-      error(
-          CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD, 14, 3),
+      error(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER, 14,
+          3),
     ]);
   }
 
@@ -212,8 +212,8 @@
   static void set foo(_) {}
 }
 ''', [
-      error(
-          CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD, 14, 3),
+      error(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER, 14,
+          3),
     ]);
   }
 
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index f6857fc..0cdb816 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -1845,9 +1845,15 @@
 _'{0}' can't be used to name both a constructor and a static field in this
 class._
 
+_'{0}' can't be used to name both a constructor and a static getter in this
+class._
+
 _'{0}' can't be used to name both a constructor and a static method in this
 class._
 
+_'{0}' can't be used to name both a constructor and a static setter in this
+class._
+
 #### Description
 
 The analyzer produces this diagnostic when a named constructor and either a
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 0e6ea1a..f7e9777 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_yaml.dart';
@@ -60,6 +61,35 @@
       : assert(session == null || workspace == null),
         workspace = workspace ?? _SingleSessionWorkspace(session!);
 
+  /// Return a hash value that will change when new edits have been added to
+  /// this builder.
+  int get changeHash {
+    // The hash value currently ignores edits to import directives because
+    // finalizing the builders needs to happen exactly once and this getter
+    // needs to be invoked repeatedly.
+    //
+    // In addition, we should consider implementing our own hash function for
+    // file edits because the `hashCode` defined for them might not be
+    // sufficient to detect all changes to the list of edits.
+    var hash = 0;
+    for (var builder in _genericFileEditBuilders.values) {
+      if (builder.hasEdits) {
+        hash = JenkinsSmiHash.combine(hash, builder.fileEdit.hashCode);
+      }
+    }
+    for (var builder in _dartFileEditBuilders.values) {
+      if (builder.hasEdits) {
+        hash = JenkinsSmiHash.combine(hash, builder.fileEdit.hashCode);
+      }
+    }
+    for (var builder in _yamlFileEditBuilders.values) {
+      if (builder.hasEdits) {
+        hash = JenkinsSmiHash.combine(hash, builder.fileEdit.hashCode);
+      }
+    }
+    return JenkinsSmiHash.finish(hash);
+  }
+
   @override
   SourceRange? get selectionRange => _selectionRange;
 
diff --git a/pkg/dds/dds_protocol.md b/pkg/dds/dds_protocol.md
index 9224302..b690c1a 100644
--- a/pkg/dds/dds_protocol.md
+++ b/pkg/dds/dds_protocol.md
@@ -1,6 +1,6 @@
-# Dart Development Service Protocol 1.3
+# Dart Development Service Protocol 1.2
 
-This document describes _version 1.3_ of the Dart Development Service Protocol.
+This document describes _version 1.2_ of the Dart Development Service Protocol.
 This protocol is an extension of the Dart VM Service Protocol and implements it
 in it's entirety. For details on the VM Service Protocol, see the [Dart VM Service Protocol Specification][service-protocol].
 
@@ -67,29 +67,6 @@
 
 The DDS Protocol supports all [public RPCs defined in the VM Service protocol][service-protocol-public-rpcs].
 
-### getAvailableCachedCpuSamples
-
-```
-AvailableCachedCpuSamples getAvailableCachedCpuSamples();
-```
-
-The _getAvailableCachedCpuSamples_ RPC is used to determine which caches of CPU samples
-are available. Caches are associated with individual _UserTag_ names and are specified
-when DDS is started via the _cachedUserTags_ parameter.
-
-See [AvailableCachedCpuSamples](#availablecachedcpusamples).
-
-### getCachedCpuSamples
-
-```
-CachedCpuSamples getCachedCpuSamples(string isolateId, string userTag);
-```
-
-The _getCachedCpuSamples_ RPC is used to retrieve a cache of CPU samples collected
-under a _UserTag_ with name _userTag_.
-
-See [CachedCpuSamples](#cachedcpusamples).
-
 ### getClientName
 
 ```
@@ -204,37 +181,6 @@
 
 The DDS Protocol supports all [public types defined in the VM Service protocol][service-protocol-public-types].
 
-### AvailableCachedCpuSamples
-
-```
-class AvailableCachedCpuSamples extends Response {
-  // A list of UserTag names associated with CPU sample caches.
-  string[] cacheNames;
-}
-```
-
-A collection of [UserTag] names associated with caches of CPU samples.
-
-See [getAvailableCachedCpuSamples](#getavailablecachedcpusamples).
-
-### CachedCpuSamples
-
-```
-class CachedCpuSamples extends CpuSamples {
-  // The name of the UserTag associated with this cache of samples.
-  string userTag;
-
-  // Provided if the CPU sample cache has filled and older samples have been
-  // dropped.
-  bool truncated [optional];
-}
-```
-
-An extension of [CpuSamples](#cpu-samples) which represents a set of cached
-samples, associated with a particular [UserTag] name.
-
-See [getCachedCpuSamples](#getcachedcpusamples).
-
 ### ClientName
 
 ```
@@ -274,12 +220,10 @@
 1.0 | Initial revision
 1.1 | Added `getDartDevelopmentServiceVersion` RPC.
 1.2 | Added `getStreamHistory` RPC.
-1.3 | Added `getAvailableCachedCpuSamples` and `getCachedCpuSamples` RPCs.
 
 [resume]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#resume
 [success]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#success
 [version]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#version
-[cpu-samples]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#cpusamples
 
 [service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
 [service-protocol-rpcs-requests-and-responses]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#rpcs-requests-and-responses
diff --git a/pkg/dds/lib/dds.dart b/pkg/dds/lib/dds.dart
index f31e447..e8f05bb 100644
--- a/pkg/dds/lib/dds.dart
+++ b/pkg/dds/lib/dds.dart
@@ -42,7 +42,6 @@
     Uri? serviceUri,
     bool enableAuthCodes = true,
     bool ipv6 = false,
-    List<String> cachedUserTags = const [],
     DevToolsConfiguration? devToolsConfiguration,
     bool logRequests = false,
   }) async {
@@ -80,7 +79,6 @@
       remoteVmServiceUri,
       serviceUri,
       enableAuthCodes,
-      cachedUserTags,
       ipv6,
       devToolsConfiguration,
       logRequests,
@@ -138,13 +136,9 @@
   /// requests.
   bool get isRunning;
 
-  /// The list of [UserTag]s used to determine which CPU samples are cached by
-  /// DDS.
-  List<String> get cachedUserTags;
-
   /// The version of the DDS protocol supported by this [DartDevelopmentService]
   /// instance.
-  static const String protocolVersion = '1.3';
+  static const String protocolVersion = '1.2';
 }
 
 class DartDevelopmentServiceException implements Exception {
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 771ccee..1df3a3a 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -206,19 +206,6 @@
       return supportedProtocols;
     });
 
-    _clientPeer.registerMethod(
-      'getAvailableCachedCpuSamples',
-      (_) => {
-        'type': 'AvailableCachedCpuSamples',
-        'cacheNames': dds.cachedUserTags,
-      },
-    );
-
-    _clientPeer.registerMethod(
-      'getCachedCpuSamples',
-      dds.isolateManager.getCachedCpuSamples,
-    );
-
     // `evaluate` and `evaluateInFrame` actually consist of multiple RPC
     // invocations, including a call to `compileExpression` which can be
     // overridden by clients which provide their own implementation (e.g.,
diff --git a/pkg/dds/lib/src/common/ring_buffer.dart b/pkg/dds/lib/src/common/ring_buffer.dart
deleted file mode 100644
index 9ae802d..0000000
--- a/pkg/dds/lib/src/common/ring_buffer.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:math';
-
-class RingBuffer<T> {
-  RingBuffer(this._bufferSize) {
-    _buffer = List<T?>.filled(
-      _bufferSize,
-      null,
-    );
-  }
-
-  Iterable<T> call() sync* {
-    for (int i = _size - 1; i >= 0; --i) {
-      yield _buffer[(_count - i - 1) % _bufferSize]!;
-    }
-  }
-
-  /// Inserts a new element into the [RingBuffer].
-  /// 
-  /// Returns the element evicted as a result of adding the new element if the
-  /// buffer is as max capacity, null otherwise.
-  T? add(T e) {
-    if (_buffer.isEmpty) {
-      return null;
-    }
-    T? evicted;
-    final index = _count % _bufferSize;
-    if (isTruncated) {
-      evicted = _buffer[index];
-    }
-    _buffer[index] = e;
-    _count++;
-    return evicted;
-  }
-
-  void resize(int size) {
-    assert(size >= 0);
-    if (size == _bufferSize) {
-      return;
-    }
-    final resized = List<T?>.filled(
-      size,
-      null,
-    );
-    int count = 0;
-    if (size > 0) {
-      for (final e in this()) {
-        resized[count++ % size] = e;
-      }
-    }
-    _count = count;
-    _bufferSize = size;
-    _buffer = resized;
-  }
-
-  bool get isTruncated => _count % bufferSize < _count;
-
-  int get bufferSize => _bufferSize;
-
-  int get _size => min(_count, _bufferSize);
-
-  int _bufferSize;
-  int _count = 0;
-  late List<T?> _buffer;
-}
diff --git a/pkg/dds/lib/src/cpu_samples_manager.dart b/pkg/dds/lib/src/cpu_samples_manager.dart
deleted file mode 100644
index 1fe5084..0000000
--- a/pkg/dds/lib/src/cpu_samples_manager.dart
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:dds/src/common/ring_buffer.dart';
-import 'package:vm_service/vm_service.dart';
-
-import 'dds_impl.dart';
-
-/// Manages CPU sample caches for an individual [Isolate].
-class CpuSamplesManager {
-  CpuSamplesManager(this.dds, this.isolateId) {
-    for (final userTag in dds.cachedUserTags) {
-      cpuSamplesCaches[userTag] = CpuSamplesRepository(userTag);
-    }
-  }
-
-  void handleUserTagEvent(Event event) {
-    assert(event.kind! == EventKind.kUserTagChanged);
-    _currentTag = event.updatedTag!;
-    final previousTag = event.previousTag!;
-    if (cpuSamplesCaches.containsKey(previousTag)) {
-      _lastCachedTag = previousTag;
-    }
-  }
-
-  void handleCpuSamplesEvent(Event event) {
-    assert(event.kind! == EventKind.kCpuSamples);
-    // There might be some samples left in the buffer for the previously set
-    // user tag. We'll check for them here and then close out the cache.
-    if (_lastCachedTag != null) {
-      cpuSamplesCaches[_lastCachedTag]!.cacheSamples(
-        event.cpuSamples!,
-      );
-      _lastCachedTag = null;
-    }
-    cpuSamplesCaches[_currentTag]?.cacheSamples(event.cpuSamples!);
-  }
-
-  final DartDevelopmentServiceImpl dds;
-  final String isolateId;
-  final cpuSamplesCaches = <String, CpuSamplesRepository>{};
-
-  String _currentTag = '';
-  String? _lastCachedTag;
-}
-
-class CpuSamplesRepository extends RingBuffer<CpuSample> {
-  // TODO: math to figure out proper buffer sizes.
-  CpuSamplesRepository(
-    this.tag, [
-    int bufferSize = 1000000,
-  ]) : super(bufferSize);
-
-  void cacheSamples(CpuSamples samples) {
-    String getFunctionId(ProfileFunction function) {
-      final functionObject = function.function;
-      if (functionObject is NativeFunction) {
-        return 'native/${functionObject.name}';
-      }
-      return functionObject.id!;
-    }
-
-    // Initialize upon seeing our first samples.
-    if (functions.isEmpty) {
-      samplePeriod = samples.samplePeriod!;
-      maxStackDepth = samples.maxStackDepth!;
-      pid = samples.pid!;
-      functions.addAll(samples.functions!);
-
-      // Build the initial id to function index mapping. This allows for us to
-      // lookup a ProfileFunction in the global function list stored in this
-      // cache. This works since most ProfileFunction objects will have an
-      // associated function with a *typically* stable service ID that we can
-      // use as a key.
-      //
-      // TODO(bkonyi): investigate creating some form of stable ID for
-      // Functions tied to closures.
-      for (int i = 0; i < functions.length; ++i) {
-        idToFunctionIndex[getFunctionId(functions[i])] = i;
-      }
-
-      // Clear tick information as we'll need to recalculate these values later
-      // when a request for samples from this repository is received.
-      for (final f in functions) {
-        f.inclusiveTicks = 0;
-        f.exclusiveTicks = 0;
-      }
-
-      _firstSampleTimestamp = samples.timeOriginMicros!;
-    } else {
-      final newFunctions = samples.functions!;
-      final indexMapping = <int, int>{};
-
-      // Check to see if we've got a function object we've never seen before.
-      for (int i = 0; i < newFunctions.length; ++i) {
-        final key = getFunctionId(newFunctions[i]);
-        if (!idToFunctionIndex.containsKey(key)) {
-          idToFunctionIndex[key] = functions.length;
-          // Keep track of the original index and the location of the function
-          // in the master function list so we can update the function indicies
-          // for each sample in this batch.
-          indexMapping[i] = functions.length;
-          functions.add(newFunctions[i]);
-
-          // Reset tick state as we'll recalculate later.
-          functions.last.inclusiveTicks = 0;
-          functions.last.exclusiveTicks = 0;
-        }
-      }
-
-      // Update the indicies into the function table for functions that were
-      // newly processed in the most recent event.
-      for (final sample in samples.samples!) {
-        final stack = sample.stack!;
-        for (int i = 0; i < stack.length; ++i) {
-          if (indexMapping.containsKey(stack[i])) {
-            stack[i] = indexMapping[stack[i]]!;
-          }
-        }
-      }
-    }
-
-    final relevantSamples = samples.samples!.where((s) => s.userTag == tag);
-    for (final sample in relevantSamples) {
-      add(sample);
-    }
-  }
-
-  @override
-  CpuSample? add(CpuSample sample) {
-    final evicted = super.add(sample);
-
-    void updateTicksForSample(CpuSample sample, int increment) {
-      final stack = sample.stack!;
-      for (int i = 0; i < stack.length; ++i) {
-        final function = functions[stack[i]];
-        function.inclusiveTicks = function.inclusiveTicks! + increment;
-        if (i + 1 == stack.length) {
-          function.exclusiveTicks = function.exclusiveTicks! + increment;
-        }
-      }
-    }
-
-    if (evicted != null) {
-      // If a sample is evicted from the cache, we need to decrement the tick
-      // counters for each function in the sample's stack.
-      updateTicksForSample(sample, -1);
-
-      // We also need to change the first timestamp to that of the next oldest
-      // sample.
-      _firstSampleTimestamp = call().first.timestamp!;
-    }
-    _lastSampleTimestamp = sample.timestamp!;
-
-    // Update function ticks to include the new sample.
-    updateTicksForSample(sample, 1);
-
-    return evicted;
-  }
-
-  Map<String, dynamic> toJson() {
-    return {
-      'type': 'CachedCpuSamples',
-      'userTag': tag,
-      'truncated': isTruncated,
-      if (functions.isNotEmpty) ...{
-        'samplePeriod': samplePeriod,
-        'maxStackDepth': maxStackDepth,
-      },
-      'timeOriginMicros': _firstSampleTimestamp,
-      'timeExtentMicros': _lastSampleTimestamp - _firstSampleTimestamp,
-      'functions': [
-        // TODO(bkonyi): remove functions with no ticks and update sample stacks.
-        for (final f in functions) f.toJson(),
-      ],
-      'sampleCount': call().length,
-      'samples': [
-        for (final s in call()) s.toJson(),
-      ]
-    };
-  }
-
-  /// The UserTag associated with all samples stored in this repository.
-  final String tag;
-
-  /// The list of function references with corresponding profiler tick data.
-  /// ** NOTE **: The tick values here need to be updated as new CpuSamples
-  /// events are delivered.
-  final functions = <ProfileFunction>[];
-  final idToFunctionIndex = <String, int>{};
-
-  /// Assume sample period and max stack depth won't change.
-  late final int samplePeriod;
-  late final int maxStackDepth;
-
-  late final int pid;
-
-  int _firstSampleTimestamp = 0;
-  int _lastSampleTimestamp = 0;
-}
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
index 87ed83d..4360bcc 100644
--- a/pkg/dds/lib/src/dds_impl.dart
+++ b/pkg/dds/lib/src/dds_impl.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:math';
@@ -55,7 +54,6 @@
     this._remoteVmServiceUri,
     this._uri,
     this._authCodesEnabled,
-    this._cachedUserTags,
     this._ipv6,
     this._devToolsConfiguration,
     this.shouldLogRequests,
@@ -383,9 +381,6 @@
 
   final DevToolsConfiguration? _devToolsConfiguration;
 
-  List<String> get cachedUserTags => UnmodifiableListView(_cachedUserTags);
-  final List<String> _cachedUserTags;
-
   Future<void> get done => _done.future;
   Completer _done = Completer<void>();
   bool _shuttingDown = false;
diff --git a/pkg/dds/lib/src/isolate_manager.dart b/pkg/dds/lib/src/isolate_manager.dart
index 3a7a067..e9e14df 100644
--- a/pkg/dds/lib/src/isolate_manager.dart
+++ b/pkg/dds/lib/src/isolate_manager.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:dds/src/cpu_samples_manager.dart';
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
-import 'package:vm_service/vm_service.dart';
 
 import 'client.dart';
 import 'constants.dart';
@@ -37,11 +35,7 @@
 }
 
 class _RunningIsolate {
-  _RunningIsolate(this.isolateManager, this.id, this.name)
-      : cpuSamplesManager = CpuSamplesManager(
-          isolateManager.dds,
-          id,
-        );
+  _RunningIsolate(this.isolateManager, this.id, this.name);
 
   // State setters.
   void pausedOnExit() => _state = _IsolateState.pauseExit;
@@ -109,29 +103,6 @@
   /// Should always be called after an isolate is resumed.
   void clearResumeApprovals() => _resumeApprovalsByName.clear();
 
-  Map<String, dynamic> getCachedCpuSamples(String userTag) {
-    final repo = cpuSamplesManager.cpuSamplesCaches[userTag];
-    if (repo == null) {
-      throw json_rpc.RpcException.invalidParams(
-        'CPU sample caching is not enabled for tag: "$userTag"',
-      );
-    }
-    return repo.toJson();
-  }
-
-  void handleEvent(Event event) {
-    switch (event.kind) {
-      case EventKind.kUserTagChanged:
-        cpuSamplesManager.handleUserTagEvent(event);
-        return;
-      case EventKind.kCpuSamples:
-        cpuSamplesManager.handleCpuSamplesEvent(event);
-        return;
-      default:
-        return;
-    }
-  }
-
   int get _isolateStateMask => isolateStateToMaskMapping[_state] ?? 0;
 
   static const isolateStateToMaskMapping = {
@@ -141,7 +112,6 @@
   };
 
   final IsolateManager isolateManager;
-  final CpuSamplesManager cpuSamplesManager;
   final String name;
   final String id;
   final Set<String?> _resumeApprovalsByName = {};
@@ -152,25 +122,20 @@
   IsolateManager(this.dds);
 
   /// Handles state changes for isolates.
-  void handleIsolateEvent(Event event) {
+  void handleIsolateEvent(json_rpc.Parameters parameters) {
+    final event = parameters['event'];
+    final eventKind = event['kind'].asString;
+
     // There's no interesting information about isolate state associated with
     // and IsolateSpawn event.
-    // TODO(bkonyi): why isn't IsolateSpawn in package:vm_service
-    if (event.kind! == ServiceEvents.isolateSpawn) {
+    if (eventKind == ServiceEvents.isolateSpawn) {
       return;
     }
 
-    final isolateData = event.isolate!;
-    final id = isolateData.id!;
-    final name = isolateData.name!;
-    _updateIsolateState(id, name, event.kind!);
-  }
-
-  void routeEventToIsolate(Event event) {
-    final isolateId = event.isolate!.id!;
-    if (isolates.containsKey(isolateId)) {
-      isolates[isolateId]!.handleEvent(event);
-    }
+    final isolateData = event['isolate'];
+    final id = isolateData['id'].asString;
+    final name = isolateData['name'].asString;
+    _updateIsolateState(id, name, eventKind);
   }
 
   void _updateIsolateState(String id, String name, String eventKind) {
@@ -265,16 +230,6 @@
     return RPCResponses.success;
   }
 
-  Map<String, dynamic> getCachedCpuSamples(json_rpc.Parameters parameters) {
-    final isolateId = parameters['isolateId'].asString;
-    if (!isolates.containsKey(isolateId)) {
-      return RPCResponses.collectedSentinel;
-    }
-    final isolate = isolates[isolateId]!;
-    final userTag = parameters['userTag'].asString;
-    return isolate.getCachedCpuSamples(userTag);
-  }
-
   /// Forwards a `resume` request to the VM service.
   Future<Map<String, dynamic>> _sendResumeRequest(
     String isolateId,
diff --git a/pkg/dds/lib/src/logging_repository.dart b/pkg/dds/lib/src/logging_repository.dart
index 062529a..4537d7e 100644
--- a/pkg/dds/lib/src/logging_repository.dart
+++ b/pkg/dds/lib/src/logging_repository.dart
@@ -2,16 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:math';
+
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
 import 'client.dart';
-import 'common/ring_buffer.dart';
 
 /// [LoggingRepository] is used to store historical log messages from the
 /// target VM service. Clients which connect to DDS and subscribe to the
 /// `Logging` stream will be sent all messages contained within this repository
 /// upon initial subscription.
-class LoggingRepository extends RingBuffer<Map<String, dynamic>> {
+class LoggingRepository extends _RingBuffer<Map<String, dynamic>> {
   LoggingRepository([int logHistoryLength = 10000]) : super(logHistoryLength) {
     // TODO(bkonyi): enforce log history limit when DartDevelopmentService
     // allows for this to be set via Dart code.
@@ -45,3 +46,53 @@
   static const int _kMaxLogBufferSize = 100000;
 }
 
+// TODO(bkonyi): move to standalone file if we decide to use this elsewhere.
+class _RingBuffer<T> {
+  _RingBuffer(this._bufferSize) {
+    _buffer = List<T?>.filled(
+      _bufferSize,
+      null,
+    );
+  }
+
+  Iterable<T> call() sync* {
+    for (int i = _size - 1; i >= 0; --i) {
+      yield _buffer[(_count - i - 1) % _bufferSize]!;
+    }
+  }
+
+  void add(T e) {
+    if (_buffer.isEmpty) {
+      return;
+    }
+    _buffer[_count++ % _bufferSize] = e;
+  }
+
+  void resize(int size) {
+    assert(size >= 0);
+    if (size == _bufferSize) {
+      return;
+    }
+    final resized = List<T?>.filled(
+      size,
+      null,
+    );
+    int count = 0;
+    if (size > 0) {
+      for (final e in this()) {
+        resized[count++ % size] = e;
+      }
+    }
+    _count = count;
+    _bufferSize = size;
+    _buffer = resized;
+  }
+
+  int get bufferSize => _bufferSize;
+
+  int get _size => min(_count, _bufferSize);
+
+  int _bufferSize;
+  int _count = 0;
+  late List<T?> _buffer;
+}
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index f396c04..94f791a 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -5,7 +5,6 @@
 import 'dart:typed_data';
 
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
-import 'package:vm_service/vm_service.dart';
 
 import 'client.dart';
 import 'dds_impl.dart';
@@ -108,31 +107,18 @@
         // Stdout and Stderr streams may not exist.
       }
     }
-    if (dds.cachedUserTags.isNotEmpty) {
-      await streamListen(null, EventStreams.kProfiler);
-    }
     dds.vmServiceClient.registerMethod(
       'streamNotify',
-      (json_rpc.Parameters parameters) {
+      (parameters) {
         final streamId = parameters['streamId'].asString;
-        final event =
-            Event.parse(parameters['event'].asMap.cast<String, dynamic>())!;
-
         // Forward events from the streams IsolateManager subscribes to.
         if (isolateManagerStreams.contains(streamId)) {
-          dds.isolateManager.handleIsolateEvent(event);
+          dds.isolateManager.handleIsolateEvent(parameters);
         }
         // Keep a history of messages to send to clients when they first
         // subscribe to a stream with an event history.
         if (loggingRepositories.containsKey(streamId)) {
-          loggingRepositories[streamId]!.add(
-            parameters.asMap.cast<String, dynamic>(),
-          );
-        }
-        // If the event contains an isolate, forward the event to the
-        // corresponding isolate to be handled.
-        if (event.isolate != null) {
-          dds.isolateManager.routeEventToIsolate(event);
+          loggingRepositories[streamId]!.add(parameters.asMap);
         }
         streamNotify(streamId, parameters.value);
       },
@@ -265,7 +251,6 @@
   static const kExtensionStream = 'Extension';
   static const kIsolateStream = 'Isolate';
   static const kLoggingStream = 'Logging';
-  static const kProfilerStream = 'Profiler';
   static const kStderrStream = 'Stderr';
   static const kStdoutStream = 'Stdout';
 
@@ -287,17 +272,10 @@
     kStdoutStream,
   };
 
-  // Never cancel the profiler stream as `CpuSampleRepository` requires
-  // `UserTagChanged` events to enable/disable sample caching.
-  static const cpuSampleRepositoryStreams = <String>{
-    kProfilerStream,
-  };
-
   // The set of streams that DDS requires to function.
   static final ddsCoreStreams = <String>{
     ...isolateManagerStreams,
     ...loggingRepositoryStreams,
-    ...cpuSampleRepositoryStreams,
   };
 
   final DartDevelopmentServiceImpl dds;
diff --git a/pkg/dds/lib/vm_service_extensions.dart b/pkg/dds/lib/vm_service_extensions.dart
index 09bda25..903c14a 100644
--- a/pkg/dds/lib/vm_service_extensions.dart
+++ b/pkg/dds/lib/vm_service_extensions.dart
@@ -13,46 +13,18 @@
   static bool _factoriesRegistered = false;
   static Version? _ddsVersion;
 
-  /// The [getDartDevelopmentServiceVersion] RPC is used to determine what version of
+  /// The _getDartDevelopmentServiceVersion_ RPC is used to determine what version of
   /// the Dart Development Service Protocol is served by a DDS instance.
   ///
   /// The result of this call is cached for subsequent invocations.
   Future<Version> getDartDevelopmentServiceVersion() async {
     if (_ddsVersion == null) {
-      _ddsVersion = await _callHelper<Version>(
-        'getDartDevelopmentServiceVersion',
-      );
+      _ddsVersion =
+          await _callHelper<Version>('getDartDevelopmentServiceVersion');
     }
     return _ddsVersion!;
   }
 
-  /// The [getCachedCpuSamples] RPC is used to retrieve a cache of CPU samples
-  /// collected under a [UserTag] with name `userTag`.
-  Future<CachedCpuSamples> getCachedCpuSamples(
-      String isolateId, String userTag) async {
-    if (!(await _versionCheck(1, 3))) {
-      throw UnimplementedError('getCachedCpuSamples requires DDS version 1.3');
-    }
-    return _callHelper<CachedCpuSamples>('getCachedCpuSamples', args: {
-      'isolateId': isolateId,
-      'userTag': userTag,
-    });
-  }
-
-  /// The [getAvailableCachedCpuSamples] RPC is used to determine which caches of CPU samples
-  /// are available. Caches are associated with individual [UserTag] names and are specified
-  /// when DDS is started via the `cachedUserTags` parameter.
-  Future<AvailableCachedCpuSamples> getAvailableCachedCpuSamples() async {
-    if (!(await _versionCheck(1, 3))) {
-      throw UnimplementedError(
-        'getAvailableCachedCpuSamples requires DDS version 1.3',
-      );
-    }
-    return _callHelper<AvailableCachedCpuSamples>(
-      'getAvailableCachedCpuSamples',
-    );
-  }
-
   /// Retrieve the event history for `stream`.
   ///
   /// If `stream` does not have event history collected, a parameter error is
@@ -154,11 +126,6 @@
 
   static void _registerFactories() {
     addTypeFactory('StreamHistory', StreamHistory.parse);
-    addTypeFactory(
-      'AvailableCachedCpuSamples',
-      AvailableCachedCpuSamples.parse,
-    );
-    addTypeFactory('CachedCpuSamples', CachedCpuSamples.parse);
     _factoriesRegistered = true;
   }
 }
@@ -187,86 +154,3 @@
   List<Event> get history => UnmodifiableListView(_history);
   final List<Event> _history;
 }
-
-/// An extension of [CpuSamples] which represents a set of cached samples,
-/// associated with a particular [UserTag] name.
-class CachedCpuSamples extends CpuSamples {
-  static CachedCpuSamples? parse(Map<String, dynamic>? json) =>
-      json == null ? null : CachedCpuSamples._fromJson(json);
-
-  CachedCpuSamples({
-    required this.userTag,
-    this.truncated,
-    required int? samplePeriod,
-    required int? maxStackDepth,
-    required int? sampleCount,
-    required int? timeSpan,
-    required int? timeOriginMicros,
-    required int? timeExtentMicros,
-    required int? pid,
-    required List<ProfileFunction>? functions,
-    required List<CpuSample>? samples,
-  }) : super(
-          samplePeriod: samplePeriod,
-          maxStackDepth: maxStackDepth,
-          sampleCount: sampleCount,
-          timeSpan: timeSpan,
-          timeOriginMicros: timeOriginMicros,
-          timeExtentMicros: timeExtentMicros,
-          pid: pid,
-          functions: functions,
-          samples: samples,
-        );
-
-  CachedCpuSamples._fromJson(Map<String, dynamic> json)
-      : userTag = json['userTag']!,
-        truncated = json['truncated'],
-        super(
-          samplePeriod: json['samplePeriod'] ?? -1,
-          maxStackDepth: json['maxStackDepth'] ?? -1,
-          sampleCount: json['sampleCount'] ?? -1,
-          timeSpan: json['timeSpan'] ?? -1,
-          timeOriginMicros: json['timeOriginMicros'] ?? -1,
-          timeExtentMicros: json['timeExtentMicros'] ?? -1,
-          pid: json['pid'] ?? -1,
-          functions: List<ProfileFunction>.from(
-            createServiceObject(json['functions'], const ['ProfileFunction'])
-                    as List? ??
-                [],
-          ),
-          samples: List<CpuSample>.from(
-            createServiceObject(json['samples'], const ['CpuSample'])
-                    as List? ??
-                [],
-          ),
-        );
-
-  @override
-  String get type => 'CachedCpuSamples';
-
-  /// The name of the [UserTag] associated with this cache of [CpuSamples].
-  final String userTag;
-
-  /// Provided if the CPU sample cache has filled and older samples have been
-  /// dropped.
-  final bool? truncated;
-}
-
-/// A collection of [UserTag] names associated with caches of CPU samples.
-class AvailableCachedCpuSamples extends Response {
-  static AvailableCachedCpuSamples? parse(Map<String, dynamic>? json) =>
-      json == null ? null : AvailableCachedCpuSamples._fromJson(json);
-
-  AvailableCachedCpuSamples({
-    required this.cacheNames,
-  });
-
-  AvailableCachedCpuSamples._fromJson(Map<String, dynamic> json)
-      : cacheNames = List<String>.from(json['cacheNames']);
-
-  @override
-  String get type => 'AvailableCachedUserTagCpuSamples';
-
-  /// A [List] of [UserTag] names associated with CPU sample caches.
-  final List<String> cacheNames;
-}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index 5468e58..cfbf779 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,12 +3,12 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 2.1.0
+version: 2.0.2
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
 environment:
-  sdk: '>=2.14.0-0 <3.0.0'
+  sdk: '>=2.12.0 <3.0.0'
 
 dependencies:
   async: ^2.4.1
@@ -26,7 +26,7 @@
   sse: ^4.0.0
   stream_channel: ^2.0.0
   usage: ^4.0.0
-  vm_service: ^7.2.0
+  vm_service: ^7.0.0
   web_socket_channel: ^2.0.0
 
 dev_dependencies:
diff --git a/pkg/dds/test/common/test_helper.dart b/pkg/dds/test/common/test_helper.dart
index 077e75a..9fc441b 100644
--- a/pkg/dds/test/common/test_helper.dart
+++ b/pkg/dds/test/common/test_helper.dart
@@ -24,7 +24,6 @@
     '--observe=0',
     if (pauseOnStart) '--pause-isolates-on-start',
     '--write-service-info=$serviceInfoUri',
-    '--sample-buffer-duration=1',
     ...Platform.executableArguments,
     Platform.script.resolve(script).toString(),
   ];
diff --git a/pkg/dds/test/get_cached_cpu_samples_script.dart b/pkg/dds/test/get_cached_cpu_samples_script.dart
deleted file mode 100644
index 5949574..0000000
--- a/pkg/dds/test/get_cached_cpu_samples_script.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:developer';
-
-fib(int n) {
-  if (n <= 1) {
-    return n;
-  }
-  return fib(n - 1) + fib(n - 2);
-}
-
-void main() {
-  UserTag('Testing').makeCurrent();
-  int i = 5;
-  while (true) {
-    ++i;
-    fib(i);
-  }
-}
diff --git a/pkg/dds/test/get_cached_cpu_samples_test.dart b/pkg/dds/test/get_cached_cpu_samples_test.dart
deleted file mode 100644
index fe8a223..0000000
--- a/pkg/dds/test/get_cached_cpu_samples_test.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:dds/dds.dart';
-import 'package:dds/vm_service_extensions.dart';
-import 'package:test/test.dart';
-import 'package:vm_service/vm_service.dart';
-import 'package:vm_service/vm_service_io.dart';
-import 'common/test_helper.dart';
-
-void main() {
-  late Process process;
-  late DartDevelopmentService dds;
-
-  setUp(() async {
-    process = await spawnDartProcess(
-      'get_cached_cpu_samples_script.dart',
-    );
-  });
-
-  tearDown(() async {
-    await dds.shutdown();
-    process.kill();
-  });
-
-  test(
-    'No UserTags to cache',
-    () async {
-      dds = await DartDevelopmentService.startDartDevelopmentService(
-        remoteVmServiceUri,
-      );
-      expect(dds.isRunning, true);
-      final service = await vmServiceConnectUri(dds.wsUri.toString());
-
-      // We didn't provide `cachedUserTags` when starting DDS, so we shouldn't
-      // be caching anything.
-      final availableCaches = await service.getAvailableCachedCpuSamples();
-      expect(availableCaches.cacheNames.length, 0);
-
-      final isolate = (await service.getVM()).isolates!.first;
-
-      try {
-        await service.getCachedCpuSamples(isolate.id!, 'Fake');
-        fail('Invalid userTag did not cause an exception');
-      } on RPCError catch (e) {
-        expect(
-          e.message,
-          'CPU sample caching is not enabled for tag: "Fake"',
-        );
-      }
-    },
-    timeout: Timeout.none,
-  );
-
-  test(
-    'Cache CPU samples for provided UserTag name',
-    () async {
-      const kUserTag = 'Testing';
-      dds = await DartDevelopmentService.startDartDevelopmentService(
-        remoteVmServiceUri,
-        cachedUserTags: [kUserTag],
-      );
-      expect(dds.isRunning, true);
-      final service = await vmServiceConnectUri(dds.wsUri.toString());
-
-      // Ensure we're caching results for samples under the 'Testing' UserTag.
-      final availableCaches = await service.getAvailableCachedCpuSamples();
-      expect(availableCaches.cacheNames.length, 1);
-      expect(availableCaches.cacheNames.first, kUserTag);
-
-      final isolate = (await service.getVM()).isolates!.first;
-
-      final completer = Completer<void>();
-      int i = 0;
-      int count = 0;
-      service.onProfilerEvent.listen((event) async {
-        if (event.kind == EventKind.kCpuSamples &&
-            event.isolate!.id! == isolate.id!) {
-          // Pause so we don't evict another block of samples before we've
-          // retrieved the cached samples after this event.
-          await service.pause(isolate.id!);
-
-          // Ensure the number of CPU samples in the CpuSample event is
-          // is consistent with the number of samples in the cache.
-          expect(event.cpuSamples, isNotNull);
-          count += event.cpuSamples!.samples!
-              .where((e) => e.userTag == kUserTag)
-              .length;
-          final cache = await service.getCachedCpuSamples(
-            isolate.id!,
-            availableCaches.cacheNames.first,
-          );
-          expect(cache.sampleCount, count);
-
-          await service.resume(isolate.id!);
-          i++;
-          if (i == 3) {
-            completer.complete();
-          }
-        }
-      });
-      await service.streamListen(EventStreams.kProfiler);
-      await service.resume(isolate.id!);
-      await completer.future;
-    },
-    timeout: Timeout.none,
-  );
-}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_sound_test.dart
similarity index 76%
copy from pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
copy to pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_sound_test.dart
index 9db3279..9b56991 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_sound_test.dart
@@ -15,8 +15,8 @@
   var driver = await TestDriver.init();
 
   group('(Sound null safety)', () {
-    tearDownAll(() {
-      driver.finish();
+    tearDownAll(() async {
+      await driver.finish();
     });
 
     group('(AMD module system)', () {
@@ -24,11 +24,5 @@
           soundNullSafety: true, moduleFormat: ModuleFormat.amd);
       runSharedTests(setup, driver);
     });
-
-    group('(DDC module system)', () {
-      var setup = SetupCompilerOptions(
-          soundNullSafety: true, moduleFormat: ModuleFormat.ddc);
-      runSharedTests(setup, driver);
-    });
   });
 }
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_unsound_test.dart
similarity index 76%
copy from pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
copy to pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_unsound_test.dart
index 72df6f5..92a7c96 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_amd_unsound_test.dart
@@ -15,8 +15,8 @@
   var driver = await TestDriver.init();
 
   group('(Unsound null safety)', () {
-    tearDownAll(() {
-      driver.finish();
+    tearDownAll(() async {
+      await driver.finish();
     });
 
     group('(AMD module system)', () {
@@ -24,11 +24,5 @@
           soundNullSafety: false, moduleFormat: ModuleFormat.amd);
       runSharedTests(setup, driver);
     });
-
-    group('(DDC module system)', () {
-      var setup = SetupCompilerOptions(
-          soundNullSafety: false, moduleFormat: ModuleFormat.ddc);
-      runSharedTests(setup, driver);
-    });
   });
 }
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_sound_test.dart
similarity index 76%
rename from pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
rename to pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_sound_test.dart
index 9db3279..682327e 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_sound_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_sound_test.dart
@@ -15,14 +15,8 @@
   var driver = await TestDriver.init();
 
   group('(Sound null safety)', () {
-    tearDownAll(() {
-      driver.finish();
-    });
-
-    group('(AMD module system)', () {
-      var setup = SetupCompilerOptions(
-          soundNullSafety: true, moduleFormat: ModuleFormat.amd);
-      runSharedTests(setup, driver);
+    tearDownAll(() async {
+      await driver.finish();
     });
 
     group('(DDC module system)', () {
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_unsound_test.dart
similarity index 76%
rename from pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
rename to pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_unsound_test.dart
index 72df6f5..21bc460 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_unsound_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_ddc_unsound_test.dart
@@ -15,14 +15,8 @@
   var driver = await TestDriver.init();
 
   group('(Unsound null safety)', () {
-    tearDownAll(() {
-      driver.finish();
-    });
-
-    group('(AMD module system)', () {
-      var setup = SetupCompilerOptions(
-          soundNullSafety: false, moduleFormat: ModuleFormat.amd);
-      runSharedTests(setup, driver);
+    tearDownAll(() async {
+      await driver.finish();
     });
 
     group('(DDC module system)', () {
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart
index 40f3f36..18526d1 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_shared.dart
@@ -173,8 +173,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -215,8 +215,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -257,8 +257,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -366,8 +366,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -501,8 +501,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -649,8 +649,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -712,8 +712,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('compilation error', () async {
@@ -780,8 +780,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('call function not using type', () async {
@@ -840,8 +840,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('expression using local', () async {
@@ -881,8 +881,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('(then) expression using local', () async {
@@ -948,8 +948,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('expression loop variable', () async {
@@ -975,8 +975,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('evaluate formals', () async {
@@ -1020,8 +1020,8 @@
       await driver.initSource(setup, source);
     });
 
-    tearDownAll(() {
-      driver.cleanupTest();
+    tearDownAll(() async {
+      await driver.cleanupTest();
     });
 
     test('evaluation that non-destructively appends to the type container',
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
index 7300029..a20eb79 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
@@ -107,22 +107,23 @@
 
 class TestCompiler {
   final SetupCompilerOptions setup;
-  Component component;
-  ExpressionCompiler evaluator;
-  ModuleMetadata metadata;
-  source_maps.SingleMapping sourceMap;
+  final Component component;
+  final ExpressionCompiler evaluator;
+  final ModuleMetadata metadata;
+  final source_maps.SingleMapping sourceMap;
 
-  TestCompiler(this.setup);
+  TestCompiler._(this.setup, this.component, this.evaluator, this.metadata,
+      this.sourceMap);
 
-  Future<TestCompiler> init({Uri input, Uri output, Uri packages}) async {
+  static Future<TestCompiler> init(SetupCompilerOptions setup,
+      {Uri input, Uri output, Uri packages}) async {
     // Initialize the incremental compiler and module component.
     // TODO: extend this for multi-module compilations by storing separate
     // compilers/components/names per module.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    component = await compiler.computeDelta();
+    var component = await compiler.computeDelta();
     component.computeCanonicalNames();
-
     // Initialize DDC.
     var moduleName = '${p.basenameWithoutExtension(output.toFilePath())}';
 
@@ -158,8 +159,6 @@
       compiler: kernel2jsCompiler,
       component: component,
     );
-    metadata = code.metadata;
-    sourceMap = source_maps.SingleMapping.fromJson(code.sourceMap);
     var codeBytes = utf8.encode(code.code);
     var sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
 
@@ -167,7 +166,7 @@
     File('${output.toFilePath()}.map').writeAsBytesSync(sourceMapBytes);
 
     // Save the expression evaluator for future evaluations.
-    evaluator = ExpressionCompiler(
+    var evaluator = ExpressionCompiler(
       setup.options,
       setup.moduleFormat,
       setup.errors,
@@ -181,7 +180,9 @@
     }
     setup.diagnosticMessages.clear();
 
-    return this;
+    var sourceMap = source_maps.SingleMapping.fromJson(code.sourceMap);
+    return TestCompiler._(
+        setup, component, evaluator, code.metadata, sourceMap);
   }
 
   Future<TestCompilationResult> compileExpression(
@@ -212,45 +213,61 @@
 }
 
 class TestDriver {
-  SetupCompilerOptions setup;
-  String source;
-  Directory chromeDir;
-  Directory testDir;
-  String moduleFormatString;
+  final browser.Chrome chrome;
+  final Directory chromeDir;
+  final wip.WipConnection connection;
+  final wip.WipDebugger debugger;
+  TestCompiler compiler;
   Uri htmlBootstrapper;
   Uri input;
+  String moduleFormatString;
   Uri output;
   Uri packagesFile;
-  browser.Chrome chrome;
-  wip.WipDebugger debugger;
-  wip.WipConnection connection;
-  TestCompiler compiler;
+  String preemptiveBp;
+  SetupCompilerOptions setup;
+  String source;
+  Directory testDir;
 
-  TestDriver._();
-
-  static Future<TestDriver> init() async {
-    var driver = TestDriver._();
-    await driver.initChrome();
-    return driver;
-  }
+  TestDriver._(this.chrome, this.chromeDir, this.connection, this.debugger);
 
   /// Initializes a Chrome browser instance, tab connection, and debugger.
-  ///
-  /// Should be called once after creating TestDriver.
-  Future<void> initChrome() async {
+  static Future<TestDriver> init() async {
     // Create a temporary directory for holding Chrome tests.
-    var systemTempDir = Directory.systemTemp;
-    chromeDir = await systemTempDir.createTemp('ddc_eval_test_anchor');
+    var chromeDir = Directory.systemTemp.createTempSync('ddc_eval_test_anchor');
 
-    // Start Chrome on an empty page with a single empty tab.
-    chrome = await browser.Chrome.startWithDebugPort(['about:blank'],
-        userDataDir: chromeDir.uri.toFilePath(), headless: true);
+    // Try to start Chrome on an empty page with a single empty tab.
+    // TODO(#45713): Headless Chrome crashes the Windows bots, so run in
+    // standard mode until it's fixed.
+    browser.Chrome chrome;
+    var retries = 3;
+    while (chrome == null && retries-- > 0) {
+      try {
+        chrome = await browser.Chrome.startWithDebugPort(['about:blank'],
+            userDataDir: chromeDir.uri.toFilePath(),
+            headless: !Platform.isWindows);
+      } catch (e) {
+        if (retries == 0) rethrow;
+        await Future.delayed(Duration(seconds: 5));
+      }
+    }
 
     // Connect to the first 'normal' tab.
     var tab = await chrome.chromeConnection
         .getTab((tab) => !tab.isBackgroundPage && !tab.isChromeExtension);
-    connection = await tab.connect();
-    debugger = connection.debugger;
+    if (tab == null) {
+      throw Exception('Unable to connect to Chrome tab');
+    }
+
+    var connection = await tab.connect().timeout(Duration(seconds: 5),
+        onTimeout: () => throw Exception('Unable to connect to WIP tab'));
+
+    await connection.page.enable().timeout(Duration(seconds: 5),
+        onTimeout: () => throw Exception('Unable to enable WIP tab page'));
+
+    var debugger = connection.debugger;
+    await debugger.enable().timeout(Duration(seconds: 5),
+        onTimeout: () => throw Exception('Unable to enable WIP debugger'));
+    return TestDriver._(chrome, chromeDir, connection, debugger);
   }
 
   /// Must be called when testing a new Dart program.
@@ -268,7 +285,7 @@
     source = '${setup.dartLangComment}\n\n$source';
     this.setup = setup;
     this.source = source;
-    testDir = await chromeDir.createTemp('ddc_eval_test');
+    testDir = chromeDir.createTempSync('ddc_eval_test');
     var buildDir = p.dirname(p.dirname(p.dirname(Platform.resolvedExecutable)));
     var scriptPath = Platform.script.normalizePath().toFilePath();
     var ddcPath = p.dirname(p.dirname(p.dirname(scriptPath)));
@@ -295,8 +312,8 @@
       ''');
 
     // Initialize DDC and the incremental compiler, then perform a full compile.
-    compiler = await TestCompiler(setup)
-        .init(input: input, output: output, packages: packagesFile);
+    compiler = await TestCompiler.init(setup,
+        input: input, output: output, packages: packagesFile);
 
     htmlBootstrapper = testDir.uri.resolve('bootstrapper.html');
     var bootstrapFile = File(htmlBootstrapper.toFilePath())..createSync();
@@ -314,6 +331,9 @@
             setup.soundNullSafety ? 'sound' : 'kernel',
             'legacy',
             'dart_sdk.js'));
+        if (!File(dartSdkPath).existsSync()) {
+          throw Exception('Unable to find Dart SDK at $dartSdkPath');
+        }
         var dartLibraryPath =
             escaped(p.join(ddcPath, 'lib', 'js', 'legacy', 'dart_library.js'));
         var outputPath = output.toFilePath();
@@ -341,6 +361,9 @@
         moduleFormatString = 'amd';
         var dartSdkPath = escaped(p.join(buildDir, 'gen', 'utils', 'dartdevc',
             setup.soundNullSafety ? 'sound' : 'kernel', 'amd', 'dart_sdk'));
+        if (!File('$dartSdkPath.js').existsSync()) {
+          throw Exception('Unable to find Dart SDK at $dartSdkPath.js');
+        }
         var requirePath = escaped(p.join(buildDir, 'dart-sdk', 'lib',
             'dev_compiler', 'kernel', 'amd', 'require.js'));
         var outputPath = escaped(p.withoutExtension(output.toFilePath()));
@@ -378,27 +401,30 @@
             'Unsupported module format for SDK evaluation tests: ${setup.moduleFormat}');
     }
 
-    await debugger.enable();
+    await setBreakpointsActive(debugger, true);
 
     // Pause as soon as the test file loads but before it executes.
     var urlRegex = '.*${libraryUriToJsIdentifier(output)}.*';
-    await debugger.sendCommand('Debugger.setBreakpointByUrl', params: {
+    var bpResponse =
+        await debugger.sendCommand('Debugger.setBreakpointByUrl', params: {
       'urlRegex': urlRegex,
       'lineNumber': 0,
     });
+    preemptiveBp = wip.SetBreakpointResponse(bpResponse.json).breakpointId;
   }
 
-  void finish() async {
+  Future<void> finish() async {
     await chrome?.close();
     // Chrome takes a while to free its claim on chromeDir, so wait a bit.
-    await Future.delayed(const Duration(milliseconds: 500));
+    await Future.delayed(Duration(milliseconds: 500));
     chromeDir?.deleteSync(recursive: true);
   }
 
   Future<void> cleanupTest() async {
+    await setBreakpointsActive(debugger, false);
+    await debugger.removeBreakpoint(preemptiveBp);
     setup.diagnosticMessages.clear();
     setup.errors.clear();
-    await debugger.disable();
   }
 
   Future<void> check(
@@ -424,11 +450,14 @@
 
     // Navigate from the empty page and immediately pause on the preemptive
     // breakpoint.
-    await connection.page.navigate('$htmlBootstrapper');
+    await connection.page.navigate('$htmlBootstrapper').timeout(
+        Duration(seconds: 5),
+        onTimeout: () => throw Exception(
+            'Unable to navigate to page bootstrap script: $htmlBootstrapper'));
 
     // Poll until the script is found, or timeout after a few seconds.
     var script = (await scriptController.stream.first.timeout(
-            const Duration(seconds: 5),
+            Duration(seconds: 5),
             onTimeout: () => throw Exception(
                 'Unable to find JS script corresponding to test file $output in ${debugger.scripts}.')))
         .script;
@@ -446,11 +475,11 @@
     await debugger.resume();
     final event = await pauseController.stream
         .skip(1)
-        .timeout(const Duration(seconds: 5),
+        .timeout(Duration(seconds: 5),
             onTimeout: (event) => throw Exception(
                 'Unable to find JS preemptive pause event in $output.'))
         .first
-        .timeout(const Duration(seconds: 5),
+        .timeout(Duration(seconds: 5),
             onTimeout: () => throw Exception(
                 'Unable to find JS pause event corresponding to line ($dartLine -> $location) in $output.'));
     await pauseSub.cancel();
@@ -490,6 +519,9 @@
     await debugger.removeBreakpoint(bp.breakpointId);
     var value = await stringifyRemoteObject(evalResult);
 
+    // Resume execution to the end of the current script
+    await debugger.resume();
+
     expect(
         result,
         const TypeMatcher<TestCompilationResult>()
@@ -614,3 +646,10 @@
 }
 
 String escaped(String path) => path.replaceAll('\\', '\\\\');
+
+Future setBreakpointsActive(wip.WipDebugger debugger, bool active) async {
+  await debugger.sendCommand('Debugger.setBreakpointsActive', params: {
+    'active': active
+  }).timeout(Duration(seconds: 5),
+      onTimeout: () => throw Exception('Unable to set breakpoint activity'));
+}
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index ee007f5..e811ba1 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -12,7 +12,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show StringToken;
 
-import 'package:kernel/kernel.dart' show Component, Statement;
+import 'package:kernel/kernel.dart' show Component;
 
 import 'package:kernel/ast.dart' as ir;
 
@@ -37,8 +37,6 @@
 
 import '../kernel_generator_impl.dart' show generateKernelInternal;
 
-import '../fasta/kernel/redirecting_factory_body.dart' as redirecting;
-
 import 'compiler_state.dart' show InitializedCompilerState;
 
 import 'util.dart' show equalLists, equalMaps, equalSets;
@@ -242,18 +240,4 @@
 /// constructor.
 // TODO(sigmund): Delete this API once `member.isRedirectingFactory`
 // is implemented correctly for patch files (Issue #33495).
-bool isRedirectingFactory(ir.Procedure member) {
-  if (member.kind == ir.ProcedureKind.Factory) {
-    Statement? body = member.function.body;
-    if (body is redirecting.RedirectingFactoryBody) return true;
-    if (body is ir.ExpressionStatement) {
-      ir.Expression expression = body.expression;
-      if (expression is ir.Let) {
-        if (expression.variable.name == redirecting.letName) {
-          return true;
-        }
-      }
-    }
-  }
-  return false;
-}
+bool isRedirectingFactory(ir.Procedure member) => member.isRedirectingFactory;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 4de08b9..5d66e3c 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -44,6 +44,8 @@
 
 import '../kernel/kernel_helper.dart';
 
+import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
+
 import '../loader.dart';
 
 import '../modifier.dart';
@@ -921,7 +923,8 @@
         targetNode.computeFunctionType(library.nonNullable);
     if (typeArguments != null &&
         targetFunctionType.typeParameters.length != typeArguments.length) {
-      addProblem(
+      addProblemForRedirectingFactory(
+          factory,
           templateTypeArgumentMismatch
               .withArguments(targetFunctionType.typeParameters.length),
           redirectionTarget.charOffset,
@@ -946,7 +949,8 @@
         Loader loader = library.loader;
         if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound,
             SubtypeCheckMode.ignoringNullabilities)) {
-          addProblem(
+          addProblemForRedirectingFactory(
+              factory,
               templateRedirectingFactoryIncompatibleTypeArgument.withArguments(
                   typeArgument,
                   typeParameterBound,
@@ -957,7 +961,8 @@
         } else if (library.isNonNullableByDefault && loader is SourceLoader) {
           if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound,
               SubtypeCheckMode.withNullabilities)) {
-            addProblem(
+            addProblemForRedirectingFactory(
+                factory,
                 templateRedirectingFactoryIncompatibleTypeArgument
                     .withArguments(typeArgument, typeParameterBound,
                         library.isNonNullableByDefault),
@@ -1002,9 +1007,65 @@
     }
   }
 
+  bool _isCyclicRedirectingFactory(RedirectingFactoryBuilder factory) {
+    // We use the [tortoise and hare algorithm]
+    // (https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare) to
+    // handle cycles.
+    Builder? tortoise = factory;
+    Builder? hare = factory.redirectionTarget.target;
+    if (hare == factory) {
+      return true;
+    }
+    while (tortoise != hare) {
+      // Hare moves 2 steps forward.
+      if (hare is! RedirectingFactoryBuilder) {
+        return false;
+      }
+      hare = hare.redirectionTarget.target;
+      if (hare == factory) {
+        return true;
+      }
+      if (hare is! RedirectingFactoryBuilder) {
+        return false;
+      }
+      hare = hare.redirectionTarget.target;
+      if (hare == factory) {
+        return true;
+      }
+      // Tortoise moves one step forward. No need to test type of tortoise
+      // as it follows hare which already checked types.
+      tortoise =
+          (tortoise as RedirectingFactoryBuilder).redirectionTarget.target;
+    }
+    // Cycle found, but original factory doesn't belong to a cycle.
+    return false;
+  }
+
+  void addProblemForRedirectingFactory(RedirectingFactoryBuilder factory,
+      Message message, int charOffset, int length) {
+    addProblem(message, charOffset, length);
+    String text = library.loader.target.context
+        .format(
+            message.withLocation(fileUri, charOffset, length), Severity.error)
+        .plain;
+    factory.body = new RedirectingFactoryBody.error(text);
+  }
+
   @override
   void checkRedirectingFactory(
       RedirectingFactoryBuilder factory, TypeEnvironment typeEnvironment) {
+    // Check that factory declaration is not cyclic.
+    if (_isCyclicRedirectingFactory(factory)) {
+      addProblemForRedirectingFactory(
+          factory,
+          templateCyclicRedirectingFactoryConstructors
+              .withArguments("${factory.member.enclosingClass!.name}"
+                  "${factory.name == '' ? '' : '.${factory.name}'}"),
+          factory.charOffset,
+          noLength);
+      return;
+    }
+
     // The factory type cannot contain any type parameters other than those of
     // its enclosing class, because constructors cannot specify type parameters
     // of their own.
@@ -1016,13 +1077,16 @@
 
     // TODO(hillerstrom): It would be preferable to know whether a failure
     // happened during [_computeRedirecteeType].
-    if (redirecteeType == null) return;
+    if (redirecteeType == null) {
+      return;
+    }
 
     // Check whether [redirecteeType] <: [factoryType].
     Loader loader = library.loader;
     if (!typeEnvironment.isSubtypeOf(
         redirecteeType, factoryType, SubtypeCheckMode.ignoringNullabilities)) {
-      addProblem(
+      addProblemForRedirectingFactory(
+          factory,
           templateIncompatibleRedirecteeFunctionType.withArguments(
               redirecteeType, factoryType, library.isNonNullableByDefault),
           factory.redirectionTarget.charOffset,
@@ -1030,7 +1094,8 @@
     } else if (library.isNonNullableByDefault && loader is SourceLoader) {
       if (!typeEnvironment.isSubtypeOf(
           redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
-        addProblem(
+        addProblemForRedirectingFactory(
+            factory,
             templateIncompatibleRedirecteeFunctionType.withArguments(
                 redirecteeType, factoryType, library.isNonNullableByDefault),
             factory.redirectionTarget.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 22e54cb..2abc7cf 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -207,7 +207,7 @@
     if (bodyInternal != null) {
       unexpected("null", "${bodyInternal.runtimeType}", charOffset, fileUri);
     }
-    bodyInternal = new RedirectingFactoryBody(target, typeArguments);
+    bodyInternal = new RedirectingFactoryBody(target, typeArguments, function);
     function.body = bodyInternal;
     bodyInternal?.parent = function;
     if (isPatch) {
@@ -307,7 +307,7 @@
           noLength, fileUri);
     }
 
-    bodyInternal = new RedirectingFactoryBody(target, typeArguments);
+    bodyInternal = new RedirectingFactoryBody(target, typeArguments, function);
     function.body = bodyInternal;
     bodyInternal?.parent = function;
     _procedure.isRedirectingFactory = true;
@@ -436,7 +436,10 @@
             target.enclosingClass!.typeParameters.length, const DynamicType(),
             growable: true);
       }
-      member.function!.body = new RedirectingFactoryBody(target, typeArguments);
+
+      function.body =
+          new RedirectingFactoryBody(target, typeArguments, function);
+      function.body!.parent = function;
     }
     if (_factoryTearOff != null &&
         (target is Constructor || target is Procedure && target.isFactory)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index b550c58..3a6544e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1247,13 +1247,10 @@
       if (redirectingFactoryBody != null) {
         // If the redirection target is itself a redirecting factory, it means
         // that it is unresolved.
-        assert(redirectingFactoryBody.isUnresolved);
-        String errorName = redirectingFactoryBody.unresolvedName!;
-        replacementNode = buildProblem(
-            fasta.templateMethodNotFound.withArguments(errorName),
-            fileOffset,
-            noLength,
-            suppressMessage: true);
+        assert(redirectingFactoryBody.isError);
+        String errorMessage = redirectingFactoryBody.errorMessage!;
+        replacementNode = new InvalidExpression(errorMessage)
+          ..fileOffset = fileOffset;
       } else {
         Substitution substitution = Substitution.fromPairs(
             initialTarget.function.typeParameters, arguments.types);
@@ -2373,10 +2370,8 @@
       push(forest.createStringLiteral(offsetForToken(token), value));
     } else {
       int count = 1 + interpolationCount * 2;
-      List<Object>? parts = const FixedNullableList<Object>().popNonNullable(
-          stack,
-          count,
-          /* dummyValue = */ 0);
+      List<Object>? parts = const FixedNullableList<Object>()
+          .popNonNullable(stack, count, /* dummyValue = */ 0);
       if (parts == null) {
         push(new ParserRecovery(endToken.charOffset));
         return;
@@ -6427,12 +6422,8 @@
           allowPotentiallyConstantType: allowPotentiallyConstantType);
       if (message == null) return unresolved;
       return new UnresolvedType(
-          new NamedTypeBuilder(
-              typeParameter.name!,
-              builder.nullabilityBuilder,
-              /* arguments = */ null,
-              unresolved.fileUri,
-              unresolved.charOffset)
+          new NamedTypeBuilder(typeParameter.name!, builder.nullabilityBuilder,
+              /* arguments = */ null, unresolved.fileUri, unresolved.charOffset)
             ..bind(new InvalidTypeDeclarationBuilder(
                 typeParameter.name!, message)),
           unresolved.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 4f63d8b..9debfe6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -31,48 +31,63 @@
 /// the redirection target in a factory method body.
 const String varNamePrefix = "#typeArg";
 
-class RedirectingFactoryBody extends ExpressionStatement {
-  RedirectingFactoryBody.internal(Expression value,
-      [List<DartType>? typeArguments])
-      : super(new Let(new VariableDeclaration(letName, initializer: value),
-            encodeTypeArguments(typeArguments)));
+class RedirectingFactoryBody extends ReturnStatement {
+  RedirectingFactoryBody._internal(Expression value) : super(value);
 
-  RedirectingFactoryBody(Member target, [List<DartType>? typeArguments])
-      : this.internal(new StaticGet(target), typeArguments);
+  RedirectingFactoryBody(
+      Member target, List<DartType> typeArguments, FunctionNode function)
+      : this._internal(_makeForwardingCall(target, typeArguments, function));
 
-  RedirectingFactoryBody.unresolved(String name)
-      : this.internal(new StringLiteral(name));
+  RedirectingFactoryBody.error(String errorMessage)
+      : this._internal(new InvalidExpression(errorMessage));
 
   Member? get target {
-    dynamic value = getValue(expression);
-    return value is StaticGet ? value.target : null;
+    final Expression? value = this.expression;
+    if (value is StaticInvocation) {
+      return value.target;
+    } else if (value is ConstructorInvocation) {
+      return value.target;
+    }
+    return null;
   }
 
-  String? get unresolvedName {
-    dynamic value = getValue(expression);
-    return value is StringLiteral ? value.value : null;
+  String? get errorMessage {
+    final Expression? value = this.expression;
+    return value is InvalidExpression ? value.message : null;
   }
 
-  bool get isUnresolved => unresolvedName != null;
+  bool get isError => errorMessage != null;
 
   List<DartType>? get typeArguments {
-    if (expression is Let) {
-      Let bodyExpression = expression as Let;
-      if (bodyExpression.variable.name == letName) {
-        return decodeTypeArguments(bodyExpression.body);
-      }
+    final Expression? value = this.expression;
+    if (value is InvocationExpression) {
+      return value.arguments.types;
     }
     return null;
   }
 
-  static getValue(Expression expression) {
-    if (expression is Let) {
-      VariableDeclaration variable = expression.variable;
-      if (variable.name == letName) {
-        return variable.initializer;
-      }
+  static Expression _makeForwardingCall(
+      Member target, List<DartType> typeArguments, FunctionNode function) {
+    final List<Expression> positional = function.positionalParameters
+        .map((v) => new VariableGet(v)..fileOffset = v.fileOffset)
+        .toList();
+    final List<NamedExpression> named = function.namedParameters
+        .map((v) => new NamedExpression(
+            v.name!, new VariableGet(v)..fileOffset = v.fileOffset)
+          ..fileOffset = v.fileOffset)
+        .toList();
+    final Arguments args =
+        new Arguments(positional, named: named, types: typeArguments);
+    if (target is Procedure) {
+      return new StaticInvocation(target, args)
+        ..fileOffset = function.fileOffset;
+    } else if (target is Constructor) {
+      return new ConstructorInvocation(target, args)
+        ..fileOffset = function.fileOffset;
+    } else {
+      throw 'Unexpected target for redirecting factory:'
+          ' ${target.runtimeType} $target';
     }
-    return null;
   }
 
   static void restoreFromDill(Procedure factory) {
@@ -80,41 +95,51 @@
     // dill files. See `ClassBuilder.addRedirectingConstructor` in
     // [kernel_class_builder.dart](kernel_class_builder.dart).
     FunctionNode function = factory.function;
-    ExpressionStatement statement = function.body as ExpressionStatement;
-    List<DartType>? typeArguments;
-    if (statement.expression is Let) {
-      Let expression = statement.expression as Let;
-      typeArguments = decodeTypeArguments(expression.body);
-    }
-    function.body = new RedirectingFactoryBody.internal(
-        getValue(statement.expression), typeArguments)
+    Expression value = (function.body as ReturnStatement).expression!;
+    function.body = new RedirectingFactoryBody._internal(value)
       ..parent = function;
   }
 
   static bool hasRedirectingFactoryBodyShape(Procedure factory) {
-    if (factory.function.body is! ExpressionStatement) return false;
-    Expression body = (factory.function.body as ExpressionStatement).expression;
-    if (body is Let &&
-        body.variable.name == letName &&
-        body.variable.type is DynamicType &&
-        body.variable.initializer is StaticGet) {
-      Expression currentArgument = body.body;
-      int argumentCount = 0;
-      while (currentArgument is! InvalidExpression) {
-        Expression argument = currentArgument;
-        if (argument is Let) {
-          String argumentName = "${varNamePrefix}${argumentCount}";
-          if (argument.variable.name != argumentName) {
-            return false;
-          }
-          if (argument.variable.initializer is! NullLiteral) {
-            return false;
-          }
-          currentArgument = argument.body;
-          ++argumentCount;
-        } else {
+    final FunctionNode function = factory.function;
+    final Statement? body = function.body;
+    if (body is! ReturnStatement) return false;
+    final Expression? value = body.expression;
+    if (body is InvalidExpression) {
+      return true;
+    } else if (value is StaticInvocation || value is ConstructorInvocation) {
+      // Verify that invocation forwards all arguments.
+      final Arguments args = (value as InvocationExpression).arguments;
+      if (args.positional.length != function.positionalParameters.length) {
+        return false;
+      }
+      int i = 0;
+      for (Expression arg in args.positional) {
+        if (arg is! VariableGet) {
           return false;
         }
+        if (arg.variable != function.positionalParameters[i]) {
+          return false;
+        }
+        ++i;
+      }
+      if (args.named.length != function.namedParameters.length) {
+        return false;
+      }
+      i = 0;
+      for (NamedExpression arg in args.named) {
+        final Expression value = arg.value;
+        if (value is! VariableGet) {
+          return false;
+        }
+        final VariableDeclaration param = function.namedParameters[i];
+        if (value.variable != param) {
+          return false;
+        }
+        if (arg.name != param.name) {
+          return false;
+        }
+        ++i;
       }
       return true;
     } else {
@@ -122,33 +147,6 @@
     }
   }
 
-  static Expression encodeTypeArguments(List<DartType>? typeArguments) {
-    Expression result = new InvalidExpression(null);
-    if (typeArguments == null) {
-      return result;
-    }
-    for (int i = typeArguments.length - 1; i >= 0; i--) {
-      result = new Let(
-          new VariableDeclaration("$varNamePrefix$i",
-              type: typeArguments[i], initializer: new NullLiteral()),
-          result);
-    }
-    return result;
-  }
-
-  static List<DartType>? decodeTypeArguments(Expression encoded) {
-    if (encoded is InvalidExpression) {
-      return null;
-    }
-    List<DartType> result = <DartType>[];
-    while (encoded is Let) {
-      Let head = encoded;
-      result.add(head.variable.type);
-      encoded = head.body;
-    }
-    return result;
-  }
-
   @override
   String toString() {
     return "RedirectingFactoryBody(${toStringInternal()})";
@@ -194,10 +192,10 @@
   helper.ensureLoaded(hare);
   RedirectingFactoryBody? hareBody = getRedirectingFactoryBody(hare);
   while (tortoise != hare) {
-    if (tortoiseBody?.isUnresolved ?? true) {
+    if (tortoiseBody == null || tortoiseBody.isError) {
       return new RedirectionTarget(tortoise, typeArguments);
     }
-    Member nextTortoise = tortoiseBody!.target!;
+    Member nextTortoise = tortoiseBody.target!;
     helper.ensureLoaded(nextTortoise);
     List<DartType>? nextTypeArguments = tortoiseBody.typeArguments;
     if (nextTypeArguments != null) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 7c313ec..0a3ac49 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -29,10 +29,7 @@
 import '../type_inference/type_schema.dart' show UnknownType;
 
 import 'redirecting_factory_body.dart'
-    show
-        RedirectingFactoryBody,
-        getRedirectingFactoryBody,
-        isRedirectingFactory;
+    show RedirectingFactoryBody, isRedirectingFactory;
 
 List<LocatedMessage> verifyComponent(Component component, Target target,
     {bool? isOutline, bool? afterConst, bool skipPlatform: false}) {
@@ -284,13 +281,11 @@
     bool hasBody = isRedirectingFactory(node) ||
         RedirectingFactoryBody.hasRedirectingFactoryBodyShape(node);
     bool hasFlag = node.isRedirectingFactory;
-    if (hasBody != hasFlag) {
-      String hasBodyString = hasBody ? "has" : "doesn't have";
-      String hasFlagString = hasFlag ? "has" : "doesn't have";
+    if (hasFlag && !hasBody) {
       problem(
           node,
-          "Procedure '${node.name}' ${hasBodyString} a body "
-          "of a redirecting factory, but ${hasFlagString} the "
+          "Procedure '${node.name}' doesn't have a body "
+          "of a redirecting factory, but has the "
           "'isRedirectingFactory' bit set.");
     }
 
@@ -429,10 +424,6 @@
   void visitStaticInvocation(StaticInvocation node) {
     enterTreeNode(node);
     super.visitStaticInvocation(node);
-    RedirectingFactoryBody? body = getRedirectingFactoryBody(node.target);
-    if (body != null) {
-      problem(node, "Attempt to invoke redirecting factory.");
-    }
     exitTreeNode(node);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 84ae1c4..28f7373 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -39,7 +39,6 @@
 import '../kernel/combined_member_signature.dart';
 import '../kernel/kernel_builder.dart' show compareProcedures;
 import '../kernel/kernel_target.dart' show KernelTarget;
-import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
 import '../kernel/redirecting_factory_body.dart' show redirectingName;
 import '../kernel/type_algorithms.dart'
     show Variance, computeTypeVariableBuilderVariance;
@@ -937,42 +936,44 @@
                 _addRedirectingConstructor(
                     declaration, library, getterReference);
               }
+              Member? targetNode;
               if (targetBuilder is FunctionBuilder) {
-                List<DartType> typeArguments = declaration.typeArguments ??
-                    new List<DartType>.filled(
-                        targetBuilder
-                            .member.enclosingClass!.typeParameters.length,
-                        const UnknownType());
-                declaration.setRedirectingFactoryBody(
-                    targetBuilder.member, typeArguments);
+                targetNode = targetBuilder.member;
               } else if (targetBuilder is DillMemberBuilder) {
-                List<DartType> typeArguments = declaration.typeArguments ??
-                    new List<DartType>.filled(
-                        targetBuilder
-                            .member.enclosingClass!.typeParameters.length,
-                        const UnknownType());
-                declaration.setRedirectingFactoryBody(
-                    targetBuilder.member, typeArguments);
+                targetNode = targetBuilder.member;
               } else if (targetBuilder is AmbiguousBuilder) {
-                addProblem(
+                addProblemForRedirectingFactory(
+                    declaration,
                     templateDuplicatedDeclarationUse
                         .withArguments(redirectionTarget.fullNameForErrors),
                     redirectionTarget.charOffset,
                     noLength);
-                // CoreTypes aren't computed yet, and this is the outline
-                // phase. So we can't and shouldn't create a method body.
-                declaration.body = new RedirectingFactoryBody.unresolved(
-                    redirectionTarget.fullNameForErrors);
               } else {
-                addProblem(
+                addProblemForRedirectingFactory(
+                    declaration,
                     templateRedirectionTargetNotFound
                         .withArguments(redirectionTarget.fullNameForErrors),
                     redirectionTarget.charOffset,
                     noLength);
-                // CoreTypes aren't computed yet, and this is the outline
-                // phase. So we can't and shouldn't create a method body.
-                declaration.body = new RedirectingFactoryBody.unresolved(
-                    redirectionTarget.fullNameForErrors);
+              }
+              if (targetNode != null &&
+                  targetNode is Constructor &&
+                  targetNode.enclosingClass.isAbstract) {
+                addProblemForRedirectingFactory(
+                    declaration,
+                    templateAbstractRedirectedClassInstantiation
+                        .withArguments(redirectionTarget.fullNameForErrors),
+                    redirectionTarget.charOffset,
+                    noLength);
+                targetNode = null;
+              }
+              if (targetNode != null) {
+                List<DartType> typeArguments = declaration.typeArguments ??
+                    new List<DartType>.filled(
+                        targetNode.enclosingClass!.typeParameters.length,
+                        const UnknownType());
+                declaration.setRedirectingFactoryBody(
+                    targetNode, typeArguments);
               }
             }
           }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 8eb1f8d..a9154ac 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -169,6 +169,8 @@
 CyclicClassHierarchy/part_wrapped_script2: Fail
 CyclicClassHierarchy/script1: Fail # We report an error for each class involved in the cycle.
 CyclicClassHierarchy/script2: Fail # We report an error for each class involved in the cycle.
+CyclicRedirectingFactoryConstructors/part_wrapped_script: Fail # Error is reported for each factory involved in the cycle.
+CyclicRedirectingFactoryConstructors/script: Fail # Error is reported for each factory involved in the cycle.
 CyclicTypedef/example: Fail
 DefaultListConstructorError/analyzerCode: Fail
 DefaultListConstructorError/example: Fail
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index 25fc133..83361a2 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -33,7 +33,6 @@
 front_end/lib/src/fasta/scanner/token/ImportsTwice: Fail
 front_end/lib/src/fasta/scanner/utf8_bytes_scanner/ImportsTwice: Fail
 front_end/lib/src/fasta/source/scope_listener/Exports: Fail
-front_end/lib/src/fasta/source/source_class_builder/ImportsTwice: Fail
 front_end/lib/src/fasta/source/value_kinds/ImportsTwice: Fail
 front_end/lib/src/testing/id_testing_helper/Exports: Fail
 kernel/lib/ast/Exports: Fail
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
index cfec78a..04e78be 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.expect
@@ -12,7 +12,7 @@
   static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
     return new self::A::•<self::A::fact::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
 }
 static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
 static const field () → self::A<core::int> b = #C2;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
index d84286f..04e78be 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
     return new self::A::•<self::A::fact::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let Never #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
 }
 static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
 static const field () → self::A<core::int> b = #C2;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
index 7412c43..0d1f1e3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.expect
@@ -12,7 +12,7 @@
   static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
     return new self::A::•<self::A::fact::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
 }
 static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
 static const field () → self::A<core::int> b = #C2;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
index b93adae..960caf1 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.outline.expect
@@ -11,7 +11,7 @@
   static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
     ;
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
 }
 static const field <T extends core::Object? = dynamic>() → self::A<T%> a = self::A::•;
 static const field () → self::A<core::int> b = self::A::•<core::int>;
@@ -54,4 +54,4 @@
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:29:11 -> InstantiationConstant(A.fact<int*>)
 Evaluated: TypedefTearOff @ org-dartlang-testcase:///const_tear_off.dart:30:11 -> TypedefTearOffConstant(<T>A.redirect<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///const_tear_off.dart:31:11 -> InstantiationConstant(A.redirect<int*>)
-Extra constant evaluation: evaluated: 23, effectively constant: 18
+Extra constant evaluation: evaluated: 21, effectively constant: 18
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
index 0a0394c..0d1f1e3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
   static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
     return new self::A::•<self::A::fact::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let Never #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
 }
 static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C1;
 static const field () → self::A<core::int> b = #C2;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
index 331bcc5..8954e19 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.expect
@@ -96,6 +96,6 @@
     : super core::Object::•()
     ;
   static factory •() → self::E4
-    let dynamic #redirecting_factory = self::E4::_ in invalid-expression;
+    return new self::E4::_();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
index fdbc0b6..8954e19 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.strong.transformed.expect
@@ -96,6 +96,6 @@
     : super core::Object::•()
     ;
   static factory •() → self::E4
-    let Never #redirecting_factory = self::E4::_ in invalid-expression;
+    return new self::E4::_();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
index 331bcc5..8954e19 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.expect
@@ -96,6 +96,6 @@
     : super core::Object::•()
     ;
   static factory •() → self::E4
-    let dynamic #redirecting_factory = self::E4::_ in invalid-expression;
+    return new self::E4::_();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
index 34ae47c..d7f841c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.outline.expect
@@ -86,7 +86,7 @@
   constructor _() → self::E4
     ;
   static factory •() → self::E4
-    let dynamic #redirecting_factory = self::E4::_ in invalid-expression;
+    return new self::E4::_();
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
index fdbc0b6..8954e19 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.transformed.expect
@@ -96,6 +96,6 @@
     : super core::Object::•()
     ;
   static factory •() → self::E4
-    let Never #redirecting_factory = self::E4::_ in invalid-expression;
+    return new self::E4::_();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
index 613a456..287832b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.expect
@@ -194,7 +194,7 @@
   static method _#named#tearOff() → mai::Class2
     return new mai::Class2::named();
   static factory redirect() → mai::Class2
-    let dynamic #redirecting_factory = mai::Class2::named in invalid-expression;
+    return new mai::Class2::named();
   static method _#redirect#tearOff() → mai::Class2
     return new mai::Class2::named();
 }
@@ -218,7 +218,7 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
     return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::redirect::T%>
-    let dynamic #redirecting_factory = mai::Class4::_ in let mai::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::Class4::_<mai::Class4::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#redirect#tearOff::T%>
     return new mai::Class4::_<mai::Class4::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
index 0a6f706..bcf1164 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.strong.transformed.expect
@@ -194,7 +194,7 @@
   static method _#named#tearOff() → mai::Class2
     return new mai::Class2::named();
   static factory redirect() → mai::Class2
-    let Never #redirecting_factory = mai::Class2::named in invalid-expression;
+    return new mai::Class2::named();
   static method _#redirect#tearOff() → mai::Class2
     return new mai::Class2::named();
 }
@@ -218,7 +218,7 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
     return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::redirect::T%>
-    let Never #redirecting_factory = mai::Class4::_ in let mai::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::Class4::_<mai::Class4::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#redirect#tearOff::T%>
     return new mai::Class4::_<mai::Class4::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
index 613a456..287832b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.expect
@@ -194,7 +194,7 @@
   static method _#named#tearOff() → mai::Class2
     return new mai::Class2::named();
   static factory redirect() → mai::Class2
-    let dynamic #redirecting_factory = mai::Class2::named in invalid-expression;
+    return new mai::Class2::named();
   static method _#redirect#tearOff() → mai::Class2
     return new mai::Class2::named();
 }
@@ -218,7 +218,7 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
     return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::redirect::T%>
-    let dynamic #redirecting_factory = mai::Class4::_ in let mai::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::Class4::_<mai::Class4::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#redirect#tearOff::T%>
     return new mai::Class4::_<mai::Class4::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
index a682b15..f714802 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.outline.expect
@@ -29,7 +29,7 @@
   static method _#named#tearOff() → self2::Class2
     return new self2::Class2::named();
   static factory redirect() → self2::Class2
-    let dynamic #redirecting_factory = self2::Class2::named in invalid-expression;
+    return new self2::Class2::named();
   static method _#redirect#tearOff() → self2::Class2
     return new self2::Class2::named();
 }
@@ -51,7 +51,7 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::_#new#tearOff::T%>
     return self2::Class4::•<self2::Class4::_#new#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::redirect::T%>
-    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class4::_<self2::Class4::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::_#redirect#tearOff::T%>
     return new self2::Class4::_<self2::Class4::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
index 0a6f706..bcf1164 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.transformed.expect
@@ -194,7 +194,7 @@
   static method _#named#tearOff() → mai::Class2
     return new mai::Class2::named();
   static factory redirect() → mai::Class2
-    let Never #redirecting_factory = mai::Class2::named in invalid-expression;
+    return new mai::Class2::named();
   static method _#redirect#tearOff() → mai::Class2
     return new mai::Class2::named();
 }
@@ -218,7 +218,7 @@
   static method _#new#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#new#tearOff::T%>
     return mai::Class4::•<mai::Class4::_#new#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::redirect::T%>
-    let Never #redirecting_factory = mai::Class4::_ in let mai::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::Class4::_<mai::Class4::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::Class4<mai::Class4::_#redirect#tearOff::T%>
     return new mai::Class4::_<mai::Class4::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
index e617e7d..31fe515 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.expect
@@ -42,7 +42,7 @@
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
     return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
   static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
-    let dynamic #redirecting_factory = self::Class1::_ in let self::Class1::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class1::_<self::Class1::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
@@ -54,7 +54,7 @@
   static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
     return new self::Class2::_<self::Class2::_#_#tearOff::T>();
   static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
-    let dynamic #redirecting_factory = self::Class2::_ in let self::Class2::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class2::_<self::Class2::•::T>();
   static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
@@ -66,7 +66,7 @@
   static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
     return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
   static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
-    let dynamic #redirecting_factory = self::Class3::_ in let self::Class3::•::T% #typeArg0 = null in let self::Class3::•::S% #typeArg1 = null in invalid-expression;
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
   static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
@@ -78,7 +78,7 @@
   static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
     return new self::Class4::_<self::Class4::_#_#tearOff::T>();
   static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
-    let dynamic #redirecting_factory = self::Class4::_ in let self::Class4::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class4::_<self::Class4::•::T>();
   static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
@@ -90,7 +90,7 @@
   static method _#_#tearOff() → self::Class4int
     return new self::Class4int::_();
   static factory •() → self::Class4int
-    let dynamic #redirecting_factory = self::Class4int::_ in invalid-expression;
+    return new self::Class4int::_();
   static method _#new#tearOff() → self::Class4int
     return new self::Class4int::_();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
index 93bb730..2b61e14 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -42,7 +42,7 @@
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
     return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
   static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
-    let Never #redirecting_factory = self::Class1::_ in let self::Class1::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class1::_<self::Class1::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
@@ -54,7 +54,7 @@
   static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
     return new self::Class2::_<self::Class2::_#_#tearOff::T>();
   static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
-    let Never #redirecting_factory = self::Class2::_ in let self::Class2::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class2::_<self::Class2::•::T>();
   static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
@@ -66,7 +66,7 @@
   static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
     return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
   static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
-    let Never #redirecting_factory = self::Class3::_ in let self::Class3::•::T% #typeArg0 = null in let self::Class3::•::S% #typeArg1 = null in invalid-expression;
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
   static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
@@ -78,7 +78,7 @@
   static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
     return new self::Class4::_<self::Class4::_#_#tearOff::T>();
   static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
-    let Never #redirecting_factory = self::Class4::_ in let self::Class4::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class4::_<self::Class4::•::T>();
   static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
@@ -90,7 +90,7 @@
   static method _#_#tearOff() → self::Class4int
     return new self::Class4int::_();
   static factory •() → self::Class4int
-    let Never #redirecting_factory = self::Class4int::_ in invalid-expression;
+    return new self::Class4int::_();
   static method _#new#tearOff() → self::Class4int
     return new self::Class4int::_();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
index e617e7d..31fe515 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.expect
@@ -42,7 +42,7 @@
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
     return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
   static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
-    let dynamic #redirecting_factory = self::Class1::_ in let self::Class1::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class1::_<self::Class1::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
@@ -54,7 +54,7 @@
   static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
     return new self::Class2::_<self::Class2::_#_#tearOff::T>();
   static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
-    let dynamic #redirecting_factory = self::Class2::_ in let self::Class2::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class2::_<self::Class2::•::T>();
   static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
@@ -66,7 +66,7 @@
   static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
     return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
   static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
-    let dynamic #redirecting_factory = self::Class3::_ in let self::Class3::•::T% #typeArg0 = null in let self::Class3::•::S% #typeArg1 = null in invalid-expression;
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
   static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
@@ -78,7 +78,7 @@
   static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
     return new self::Class4::_<self::Class4::_#_#tearOff::T>();
   static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
-    let dynamic #redirecting_factory = self::Class4::_ in let self::Class4::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class4::_<self::Class4::•::T>();
   static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
@@ -90,7 +90,7 @@
   static method _#_#tearOff() → self::Class4int
     return new self::Class4int::_();
   static factory •() → self::Class4int
-    let dynamic #redirecting_factory = self::Class4int::_ in invalid-expression;
+    return new self::Class4int::_();
   static method _#new#tearOff() → self::Class4int
     return new self::Class4int::_();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
index 26553e6..f1a60c8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
     return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
   static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
-    let dynamic #redirecting_factory = self::Class1::_ in let self::Class1::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class1::_<self::Class1::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
@@ -20,7 +20,7 @@
   static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
     return new self::Class2::_<self::Class2::_#_#tearOff::T>();
   static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
-    let dynamic #redirecting_factory = self::Class2::_ in let self::Class2::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class2::_<self::Class2::•::T>();
   static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
@@ -31,7 +31,7 @@
   static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
     return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
   static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
-    let dynamic #redirecting_factory = self::Class3::_ in let self::Class3::•::T% #typeArg0 = null in let self::Class3::•::S% #typeArg1 = null in invalid-expression;
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
   static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
@@ -42,7 +42,7 @@
   static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
     return new self::Class4::_<self::Class4::_#_#tearOff::T>();
   static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
-    let dynamic #redirecting_factory = self::Class4::_ in let self::Class4::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class4::_<self::Class4::•::T>();
   static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
@@ -53,7 +53,7 @@
   static method _#_#tearOff() → self::Class4int
     return new self::Class4int::_();
   static factory •() → self::Class4int
-    let dynamic #redirecting_factory = self::Class4int::_ in invalid-expression;
+    return new self::Class4int::_();
   static method _#new#tearOff() → self::Class4int
     return new self::Class4int::_();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
index 93bb730..2b61e14 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -42,7 +42,7 @@
   static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
     return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
   static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
-    let Never #redirecting_factory = self::Class1::_ in let self::Class1::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class1::_<self::Class1::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
     return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
 }
@@ -54,7 +54,7 @@
   static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
     return new self::Class2::_<self::Class2::_#_#tearOff::T>();
   static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
-    let Never #redirecting_factory = self::Class2::_ in let self::Class2::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class2::_<self::Class2::•::T>();
   static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
     return new self::Class2::_<self::Class2::_#new#tearOff::T>();
 }
@@ -66,7 +66,7 @@
   static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
     return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
   static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
-    let Never #redirecting_factory = self::Class3::_ in let self::Class3::•::T% #typeArg0 = null in let self::Class3::•::S% #typeArg1 = null in invalid-expression;
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
   static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
     return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
 }
@@ -78,7 +78,7 @@
   static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
     return new self::Class4::_<self::Class4::_#_#tearOff::T>();
   static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
-    let Never #redirecting_factory = self::Class4::_ in let self::Class4::•::T #typeArg0 = null in invalid-expression;
+    return new self::Class4::_<self::Class4::•::T>();
   static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
     return new self::Class4::_<self::Class4::_#new#tearOff::T>();
 }
@@ -90,7 +90,7 @@
   static method _#_#tearOff() → self::Class4int
     return new self::Class4int::_();
   static factory •() → self::Class4int
-    let Never #redirecting_factory = self::Class4int::_ in invalid-expression;
+    return new self::Class4int::_();
   static method _#new#tearOff() → self::Class4int
     return new self::Class4int::_();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
index 9277874..abfa7c0 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.expect
@@ -17,7 +17,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
     return self::A::fact<self::A::_#fact#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
index bfa45c0..e5c1801 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
     return self::A::fact<self::A::_#fact#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let Never #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
@@ -115,4 +115,4 @@
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:48:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:50:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:51:3 -> BoolConstant(true)
-Extra constant evaluation: evaluated: 61, effectively constant: 10
+Extra constant evaluation: evaluated: 59, effectively constant: 10
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
index 8e0844f..b2261ef 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.expect
@@ -17,7 +17,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
     return self::A::fact<self::A::_#fact#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
index e433d37..05aae66 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
     return self::A::fact<self::A::_#fact#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
@@ -78,4 +78,4 @@
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:31:13 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:32:13 -> InstantiationConstant(A._#new#tearOff<int*>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:31 -> InstantiationConstant(A._#new#tearOff<int>)
-Extra constant evaluation: evaluated: 32, effectively constant: 15
+Extra constant evaluation: evaluated: 30, effectively constant: 15
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
index 0b3ac45..5829743 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
     return self::A::fact<self::A::_#fact#tearOff::T%>();
   static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
-    let Never #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self::A::•<self::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
     return new self::A::•<self::A::_#redirect#tearOff::T%>();
 }
@@ -118,4 +118,4 @@
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:48:3 -> BoolConstant(false)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:50:3 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:51:3 -> BoolConstant(false)
-Extra constant evaluation: evaluated: 61, effectively constant: 10
+Extra constant evaluation: evaluated: 59, effectively constant: 10
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
index d55e231..cd54bc8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.expect
@@ -24,10 +24,14 @@
   static method constructor() → self::Class
     return new self::Class::_();
   static factory a() → self::Class
-    let dynamic #redirecting_factory = "Class.nonexisting" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
   static method _#a#tearOff() → self::Class;
   static factory b() → self::Class
-    let dynamic #redirecting_factory = "Class.constructor" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
index fe5e039..cd54bc8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.strong.transformed.expect
@@ -24,10 +24,14 @@
   static method constructor() → self::Class
     return new self::Class::_();
   static factory a() → self::Class
-    let core::String* #redirecting_factory = "Class.nonexisting" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
   static method _#a#tearOff() → self::Class;
   static factory b() → self::Class
-    let core::String* #redirecting_factory = "Class.constructor" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
index d55e231..cd54bc8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.expect
@@ -24,10 +24,14 @@
   static method constructor() → self::Class
     return new self::Class::_();
   static factory a() → self::Class
-    let dynamic #redirecting_factory = "Class.nonexisting" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
   static method _#a#tearOff() → self::Class;
   static factory b() → self::Class
-    let dynamic #redirecting_factory = "Class.constructor" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
index 7a6886a..173ec34 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.outline.expect
@@ -23,10 +23,14 @@
   static method constructor() → self::Class
     ;
   static factory a() → self::Class
-    let dynamic #redirecting_factory = "Class.nonexisting" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
   static method _#a#tearOff() → self::Class;
   static factory b() → self::Class
-    let dynamic #redirecting_factory = "Class.constructor" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
index fe5e039..cd54bc8 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.transformed.expect
@@ -24,10 +24,14 @@
   static method constructor() → self::Class
     return new self::Class::_();
   static factory a() → self::Class
-    let core::String* #redirecting_factory = "Class.nonexisting" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
   static method _#a#tearOff() → self::Class;
   static factory b() → self::Class
-    let core::String* #redirecting_factory = "Class.constructor" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
   static method _#b#tearOff() → self::Class;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
index aed844f..8356f0d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.expect
@@ -53,7 +53,7 @@
   static method _#_#tearOff() → self::Class1
     return new self::Class1::_();
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   static method _#new#tearOff() → self::Class1
     return new self::Class1::_();
 }
@@ -69,7 +69,7 @@
   static method _#_#tearOff() → self::Class2
     return self::Class2::_();
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
   static method _#named#tearOff() → self::Class2
     return self::Class2::_();
 }
@@ -82,7 +82,7 @@
   static method _#_#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
   static method _#new#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
 }
@@ -95,7 +95,7 @@
   static method _#_#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
   static factory •([core::int? field = #C1]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
 }
@@ -109,7 +109,7 @@
   static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
@@ -124,7 +124,7 @@
   static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
@@ -138,7 +138,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
     return new self::Class7a::•();
 }
@@ -152,7 +152,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
     return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
index ab369c9..6ee2990 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -53,7 +53,7 @@
   static method _#_#tearOff() → self::Class1
     return new self::Class1::_();
   static factory •() → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   static method _#new#tearOff() → self::Class1
     return new self::Class1::_();
 }
@@ -69,7 +69,7 @@
   static method _#_#tearOff() → self::Class2
     return self::Class2::_();
   static factory named() → self::Class2
-    let () → self::Class2 #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
   static method _#named#tearOff() → self::Class2
     return self::Class2::_();
 }
@@ -82,7 +82,7 @@
   static method _#_#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
   static factory •(core::int field) → self::Class3
-    let Never #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
   static method _#new#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
 }
@@ -95,7 +95,7 @@
   static method _#_#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
   static factory •([core::int? field = #C1]) → self::Class4
-    let Never #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
 }
@@ -109,7 +109,7 @@
   static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let Never #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
@@ -124,7 +124,7 @@
   static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let Never #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
@@ -138,7 +138,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let Never #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
     return new self::Class7a::•();
 }
@@ -152,7 +152,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let Never #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
     return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
index aed844f..8356f0d 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.expect
@@ -53,7 +53,7 @@
   static method _#_#tearOff() → self::Class1
     return new self::Class1::_();
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   static method _#new#tearOff() → self::Class1
     return new self::Class1::_();
 }
@@ -69,7 +69,7 @@
   static method _#_#tearOff() → self::Class2
     return self::Class2::_();
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
   static method _#named#tearOff() → self::Class2
     return self::Class2::_();
 }
@@ -82,7 +82,7 @@
   static method _#_#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
   static method _#new#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
 }
@@ -95,7 +95,7 @@
   static method _#_#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
   static factory •([core::int? field = #C1]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
 }
@@ -109,7 +109,7 @@
   static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
@@ -124,7 +124,7 @@
   static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
@@ -138,7 +138,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
     return new self::Class7a::•();
 }
@@ -152,7 +152,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
     return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
index 0067daa..e104583 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   static method _#_#tearOff() → self::Class1
     return new self::Class1::_();
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   static method _#new#tearOff() → self::Class1
     return new self::Class1::_();
 }
@@ -24,7 +24,7 @@
   static method _#_#tearOff() → self::Class2
     return self::Class2::_();
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
   static method _#named#tearOff() → self::Class2
     return self::Class2::_();
 }
@@ -36,7 +36,7 @@
   static method _#_#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
   static method _#new#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
 }
@@ -48,7 +48,7 @@
   static method _#_#tearOff([core::int? field]) → self::Class4
     return new self::Class4::_(field);
   static factory •([core::int? field]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field]) → self::Class4
     return new self::Class4::_(field);
 }
@@ -61,7 +61,7 @@
   static method _#_#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return new self::Class5::_(field1, field2);
   static factory •(core::int field1, [core::int? field2]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
@@ -75,7 +75,7 @@
   static method _#_#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static factory •(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
@@ -88,7 +88,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
     return new self::Class7a::•();
 }
@@ -101,7 +101,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
     return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
index ab369c9..6ee2990 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -53,7 +53,7 @@
   static method _#_#tearOff() → self::Class1
     return new self::Class1::_();
   static factory •() → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   static method _#new#tearOff() → self::Class1
     return new self::Class1::_();
 }
@@ -69,7 +69,7 @@
   static method _#_#tearOff() → self::Class2
     return self::Class2::_();
   static factory named() → self::Class2
-    let () → self::Class2 #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
   static method _#named#tearOff() → self::Class2
     return self::Class2::_();
 }
@@ -82,7 +82,7 @@
   static method _#_#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
   static factory •(core::int field) → self::Class3
-    let Never #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
   static method _#new#tearOff(core::int field) → self::Class3
     return new self::Class3::_(field);
 }
@@ -95,7 +95,7 @@
   static method _#_#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
   static factory •([core::int? field = #C1]) → self::Class4
-    let Never #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
   static method _#new#tearOff([core::int? field = #C1]) → self::Class4
     return new self::Class4::_(field);
 }
@@ -109,7 +109,7 @@
   static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let Never #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
   static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
     return new self::Class5::_(field1, field2);
 }
@@ -124,7 +124,7 @@
   static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let Never #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
   static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
     return new self::Class6::_(field1, field2: field2, field3: field3);
 }
@@ -138,7 +138,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let Never #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
   static method _#new#tearOff() → self::Class7b
     return new self::Class7a::•();
 }
@@ -152,7 +152,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let Never #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
   static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
     return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
index 8d0766c..c7984a5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.expect
@@ -24,7 +24,7 @@
   static method _#_#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
   static factory •([core::int field = #C2]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
 }
@@ -37,7 +37,7 @@
   static method _#_#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
   static factory •({core::int field = #C2}) → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
index 726cb47..9f46561 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
   static method _#_#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
   static factory •([core::int field = #C2]) → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
 }
@@ -37,7 +37,7 @@
   static method _#_#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
   static factory •({core::int field = #C2}) → self::Class2
-    let Never #redirecting_factory = self::Class2::_ in invalid-expression;
+    return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
index 8d0766c..c7984a5 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.expect
@@ -24,7 +24,7 @@
   static method _#_#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
   static factory •([core::int field = #C2]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
 }
@@ -37,7 +37,7 @@
   static method _#_#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
   static factory •({core::int field = #C2}) → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
index e6fbbd5..1cd9ef2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
@@ -10,7 +10,7 @@
   static method _#_#tearOff([core::int field]) → self::Class1
     return new self::Class1::_(field);
   static factory •([core::int field]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_(field);
   static method _#new#tearOff([core::int field]) → self::Class1
     return new self::Class1::_(field);
 }
@@ -22,7 +22,7 @@
   static method _#_#tearOff({core::int field}) → self::Class2
     return new self::Class2::_(field: field);
   static factory •({core::int field}) → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field}) → self::Class2
     return new self::Class2::_(field: field);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
index 726cb47..9f46561 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.transformed.expect
@@ -24,7 +24,7 @@
   static method _#_#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
   static factory •([core::int field = #C2]) → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_(field);
   static method _#new#tearOff([core::int field = #C1]) → self::Class1
     return new self::Class1::_(field);
 }
@@ -37,7 +37,7 @@
   static method _#_#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
   static factory •({core::int field = #C2}) → self::Class2
-    let Never #redirecting_factory = self::Class2::_ in invalid-expression;
+    return new self::Class2::_(field: field);
   static method _#new#tearOff({core::int field = #C1}) → self::Class2
     return new self::Class2::_(field: field);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
index dcd89ad..c019108 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.expect
@@ -53,37 +53,37 @@
   static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalSame([core::int field1 = #C3, core::int field2 = #C3]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalFewer1([core::int field1 = #C3]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedSame({core::int field1 = #C3, core::int field2 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedReorder({core::int field2 = #C3, core::int field1 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static factory redirectNamedFewer1({core::int field1 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field1: field1);
   static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named();
   static method _#redirectNamedFewer3#tearOff() → self::Class1
     return new self::Class1::named();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
index e90c3708..ffa443b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.strong.transformed.expect
@@ -53,37 +53,37 @@
   static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalSame([core::int field1 = #C3, core::int field2 = #C3]) → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalFewer1([core::int field1 = #C3]) → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedSame({core::int field1 = #C3, core::int field2 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedReorder({core::int field2 = #C3, core::int field1 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static factory redirectNamedFewer1({core::int field1 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field1: field1);
   static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named();
   static method _#redirectNamedFewer3#tearOff() → self::Class1
     return new self::Class1::named();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
index dcd89ad..c019108 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.expect
@@ -53,37 +53,37 @@
   static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalSame([core::int field1 = #C3, core::int field2 = #C3]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalFewer1([core::int field1 = #C3]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedSame({core::int field1 = #C3, core::int field2 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedReorder({core::int field2 = #C3, core::int field1 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static factory redirectNamedFewer1({core::int field1 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field1: field1);
   static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named();
   static method _#redirectNamedFewer3#tearOff() → self::Class1
     return new self::Class1::named();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
index 9ef35eb..c33110b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
@@ -13,37 +13,37 @@
   static method _#positional#tearOff([core::int field1, core::int field2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalSame([core::int field1, core::int field2]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1, core::int field2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalFewer1([core::int field1]) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1, core::int field2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedSame({core::int field1, core::int field2}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1, core::int field2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedReorder({core::int field2, core::int field1}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2, core::int field1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static factory redirectNamedFewer1({core::int field1}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1}) → self::Class1
     return new self::Class1::named(field1: field1);
   static factory redirectNamedFewer2({core::int field2}) → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named();
   static method _#redirectNamedFewer3#tearOff() → self::Class1
     return new self::Class1::named();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
index e90c3708..ffa443b 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.transformed.expect
@@ -53,37 +53,37 @@
   static method _#positional#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalSame([core::int field1 = #C3, core::int field2 = #C3]) → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1, field2);
   static method _#redirectPositionalSame#tearOff([core::int field1 = #C1, core::int field2 = #C2]) → self::Class1
     return new self::Class1::positional(field1, field2);
   static factory redirectPositionalFewer1([core::int field1 = #C3]) → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional(field1);
   static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C1]) → self::Class1
     return new self::Class1::positional(field1);
   static factory redirectPositionalFewer2() → self::Class1
-    let Never #redirecting_factory = self::Class1::positional in invalid-expression;
+    return new self::Class1::positional();
   static method _#redirectPositionalFewer2#tearOff() → self::Class1
     return new self::Class1::positional();
   static method _#named#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedSame({core::int field1 = #C3, core::int field2 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1, field2: field2);
   static method _#redirectNamedSame#tearOff({core::int field1 = #C1, core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field1: field1, field2: field2);
   static factory redirectNamedReorder({core::int field2 = #C3, core::int field1 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2, field1: field1);
   static method _#redirectNamedReorder#tearOff({core::int field2 = #C2, core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field2: field2, field1: field1);
   static factory redirectNamedFewer1({core::int field1 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field1: field1);
   static method _#redirectNamedFewer1#tearOff({core::int field1 = #C1}) → self::Class1
     return new self::Class1::named(field1: field1);
   static factory redirectNamedFewer2({core::int field2 = #C3}) → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named(field2: field2);
   static method _#redirectNamedFewer2#tearOff({core::int field2 = #C2}) → self::Class1
     return new self::Class1::named(field2: field2);
   static factory redirectNamedFewer3() → self::Class1
-    let Never #redirecting_factory = self::Class1::named in invalid-expression;
+    return new self::Class1::named();
   static method _#redirectNamedFewer3#tearOff() → self::Class1
     return new self::Class1::named();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
index 2dc1f69..ad13134 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
-    let dynamic #redirecting_factory = mai::A::• in let mai::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::A::•<mai::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
     return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
index a5b6962..ad13134 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.strong.transformed.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
-    let Never #redirecting_factory = mai::A::• in let mai::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::A::•<mai::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
     return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
index 2dc1f69..ad13134 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
-    let dynamic #redirecting_factory = mai::A::• in let mai::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::A::•<mai::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
     return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
index f1af048..cd0b2f3 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.outline.expect
@@ -48,7 +48,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b, core::int c}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
-    let dynamic #redirecting_factory = mai::A::• in let mai::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::A::•<mai::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
     return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
index a5b6962..ad13134 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.transformed.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(mai::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → mai::A<mai::A::_#fact#tearOff::T%>
     return mai::A::fact<mai::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → mai::A<mai::A::redirect::T%>
-    let Never #redirecting_factory = mai::A::• in let mai::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new mai::A::•<mai::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → mai::A<mai::A::_#redirect#tearOff::T%>
     return new mai::A::•<mai::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
index 3e82a43..4a19911 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
-    let dynamic #redirecting_factory = typ::A::• in let typ::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new typ::A::•<typ::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
     return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
index f7eae91..4a19911 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.strong.transformed.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
-    let Never #redirecting_factory = typ::A::• in let typ::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new typ::A::•<typ::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
     return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
index 3e82a43..4a19911 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
-    let dynamic #redirecting_factory = typ::A::• in let typ::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new typ::A::•<typ::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
     return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
index feafdc3..cca6cc2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.outline.expect
@@ -48,7 +48,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b, core::int c}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
-    let dynamic #redirecting_factory = typ::A::• in let typ::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new typ::A::•<typ::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
     return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
index f7eae91..4a19911 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.transformed.expect
@@ -100,7 +100,7 @@
   static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::_#fact#tearOff::T%>
     return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
   static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
-    let Never #redirecting_factory = typ::A::• in let typ::A::redirect::T% #typeArg0 = null in invalid-expression;
+    return new typ::A::•<typ::A::redirect::T%>();
   static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
     return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
index b589af6..0ed236c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
@@ -15,11 +15,11 @@
     : super core::Object::•()
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory redirectingTwice() → self::A
-    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+    return self::A::redirectingFactory();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
index a3c5d1d..0ed236c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
@@ -15,11 +15,11 @@
     : super core::Object::•()
     ;
   static factory redirectingFactory() → self::A
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory redirectingTwice() → self::A
-    let () → self::A #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+    return self::A::redirectingFactory();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
index b589af6..0ed236c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
@@ -15,11 +15,11 @@
     : super core::Object::•()
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory redirectingTwice() → self::A
-    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+    return self::A::redirectingFactory();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
index e80d672..0b5088f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
@@ -7,11 +7,11 @@
   constructor •() → self::A
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory redirectingTwice() → self::A
-    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+    return self::A::redirectingFactory();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
index a3c5d1d..0ed236c 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
@@ -15,11 +15,11 @@
     : super core::Object::•()
     ;
   static factory redirectingFactory() → self::A
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory redirectingTwice() → self::A
-    let () → self::A #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+    return self::A::redirectingFactory();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
index 4cbaccd..1ff3758 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.expect
@@ -51,7 +51,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
 }
 class Class2 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
@@ -61,7 +61,7 @@
   static factory _() → self::Class2
     return new self::Class2::__();
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
 }
 class Class3 extends core::Object {
   final field core::int field;
@@ -70,7 +70,7 @@
     : self::Class3::field = field, super core::Object::•()
     ;
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
 }
 class Class4 extends core::Object {
   final field core::int? field;
@@ -79,7 +79,7 @@
     : self::Class4::field = field, super core::Object::•()
     ;
   static factory •([core::int? field = #C1]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
@@ -89,7 +89,7 @@
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
@@ -100,7 +100,7 @@
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
   constructor •() → self::Class7a
@@ -110,7 +110,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
 }
 class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
   constructor •() → self::Class8a<self::Class8a::T%>
@@ -120,7 +120,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
index 9650d39..83c7798 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.strong.transformed.expect
@@ -51,7 +51,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
 }
 class Class2 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
@@ -61,7 +61,7 @@
   static factory _() → self::Class2
     return new self::Class2::__();
   static factory named() → self::Class2
-    let () → self::Class2 #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
 }
 class Class3 extends core::Object {
   final field core::int field;
@@ -70,7 +70,7 @@
     : self::Class3::field = field, super core::Object::•()
     ;
   static factory •(core::int field) → self::Class3
-    let Never #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
 }
 class Class4 extends core::Object {
   final field core::int? field;
@@ -79,7 +79,7 @@
     : self::Class4::field = field, super core::Object::•()
     ;
   static factory •([core::int? field = #C1]) → self::Class4
-    let Never #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
@@ -89,7 +89,7 @@
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let Never #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
@@ -100,7 +100,7 @@
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let Never #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
   constructor •() → self::Class7a
@@ -110,7 +110,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let Never #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
 }
 class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
   constructor •() → self::Class8a<self::Class8a::T%>
@@ -120,7 +120,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let Never #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
index 4cbaccd..1ff3758 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.expect
@@ -51,7 +51,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
 }
 class Class2 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
@@ -61,7 +61,7 @@
   static factory _() → self::Class2
     return new self::Class2::__();
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
 }
 class Class3 extends core::Object {
   final field core::int field;
@@ -70,7 +70,7 @@
     : self::Class3::field = field, super core::Object::•()
     ;
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
 }
 class Class4 extends core::Object {
   final field core::int? field;
@@ -79,7 +79,7 @@
     : self::Class4::field = field, super core::Object::•()
     ;
   static factory •([core::int? field = #C1]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
@@ -89,7 +89,7 @@
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
@@ -100,7 +100,7 @@
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
   constructor •() → self::Class7a
@@ -110,7 +110,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
 }
 class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
   constructor •() → self::Class8a<self::Class8a::T%>
@@ -120,7 +120,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
 }
 static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
index d972b38..3714e57 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   constructor _() → self::Class1
     ;
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
 }
 class Class2 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
@@ -16,7 +16,7 @@
   static factory _() → self::Class2
     ;
   static factory named() → self::Class2
-    let dynamic #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
 }
 class Class3 extends core::Object {
   final field core::int field;
@@ -24,7 +24,7 @@
   constructor _(core::int field) → self::Class3
     ;
   static factory •(core::int field) → self::Class3
-    let dynamic #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
 }
 class Class4 extends core::Object {
   final field core::int? field;
@@ -32,7 +32,7 @@
   constructor _([core::int? field]) → self::Class4
     ;
   static factory •([core::int? field]) → self::Class4
-    let dynamic #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
@@ -41,7 +41,7 @@
   constructor _(core::int field1, [core::int? field2]) → self::Class5
     ;
   static factory •(core::int field1, [core::int? field2]) → self::Class5
-    let dynamic #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
@@ -51,7 +51,7 @@
   constructor _(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
     ;
   static factory •(core::int field1, {core::int? field2, required core::int field3}) → self::Class6
-    let dynamic #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
   constructor •() → self::Class7a
@@ -60,7 +60,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let dynamic #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
 }
 class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
   constructor •() → self::Class8a<self::Class8a::T%>
@@ -69,7 +69,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let dynamic #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
 }
 static final field core::bool inSoundMode;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
index 9650d39..83c7798 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.transformed.expect
@@ -51,7 +51,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::Class1
-    let Never #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
 }
 class Class2 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class2::named]/*isLegacy*/;
@@ -61,7 +61,7 @@
   static factory _() → self::Class2
     return new self::Class2::__();
   static factory named() → self::Class2
-    let () → self::Class2 #redirecting_factory = self::Class2::_ in invalid-expression;
+    return self::Class2::_();
 }
 class Class3 extends core::Object {
   final field core::int field;
@@ -70,7 +70,7 @@
     : self::Class3::field = field, super core::Object::•()
     ;
   static factory •(core::int field) → self::Class3
-    let Never #redirecting_factory = self::Class3::_ in invalid-expression;
+    return new self::Class3::_(field);
 }
 class Class4 extends core::Object {
   final field core::int? field;
@@ -79,7 +79,7 @@
     : self::Class4::field = field, super core::Object::•()
     ;
   static factory •([core::int? field = #C1]) → self::Class4
-    let Never #redirecting_factory = self::Class4::_ in invalid-expression;
+    return new self::Class4::_(field);
 }
 class Class5 extends core::Object {
   final field core::int field1;
@@ -89,7 +89,7 @@
     : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
     ;
   static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
-    let Never #redirecting_factory = self::Class5::_ in invalid-expression;
+    return new self::Class5::_(field1, field2);
 }
 class Class6 extends core::Object {
   final field core::int field1;
@@ -100,7 +100,7 @@
     : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
     ;
   static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
-    let Never #redirecting_factory = self::Class6::_ in invalid-expression;
+    return new self::Class6::_(field1, field2: field2, field3: field3);
 }
 class Class7a extends core::Object implements self::Class7b {
   constructor •() → self::Class7a
@@ -110,7 +110,7 @@
 class Class7b extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class7b::•]/*isLegacy*/;
   static factory •() → self::Class7b
-    let Never #redirecting_factory = self::Class7a::• in invalid-expression;
+    return new self::Class7a::•();
 }
 class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
   constructor •() → self::Class8a<self::Class8a::T%>
@@ -120,7 +120,7 @@
 class Class8b<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Class8b::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
-    let Never #redirecting_factory = self::Class8a::• in let self::Class8b::•::T% #typeArg0 = null in invalid-expression;
+    return new self::Class8a::•<self::Class8b::•::T%>();
 }
 static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
index 50ef75f8..87df92f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
@@ -11,9 +11,9 @@
     : this self::A::•()
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
index 44b6f22..87df92f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
@@ -11,9 +11,9 @@
     : this self::A::•()
     ;
   static factory redirectingFactory() → self::A
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
index 50ef75f8..87df92f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
@@ -11,9 +11,9 @@
     : this self::A::•()
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
index b0b2882..0041523 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
@@ -9,9 +9,9 @@
   constructor redirecting() → self::A
     ;
   static factory redirectingFactory() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
index 44b6f22..87df92f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
@@ -11,9 +11,9 @@
     : this self::A::•()
     ;
   static factory redirectingFactory() → self::A
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory redirectingFactoryChild() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
 }
 class B extends self::A {
   synthetic constructor •() → self::B
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
index 3d26130..36647b1 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
+//   factory B() = A;
+//                 ^
+//
 // pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
 //  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
@@ -12,10 +16,6 @@
 //   new A();
 //       ^
 //
-// pkg/front_end/testcases/general/abstract_instantiation.dart:8:11: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
-//   factory B() = A;
-//           ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -27,10 +27,18 @@
 abstract class B extends core::Object implements self::A {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •() → self::B
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
 }
 static method test() → dynamic {
   throw new core::AbstractClassInstantiationError::•("A");
-  throw new core::AbstractClassInstantiationError::•("A");
+  invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
index abaa3b2..ff08754 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.outline.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
+//   factory B() = A;
+//                 ^
+//
 // pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
 //  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
@@ -18,7 +22,11 @@
 abstract class B extends core::Object implements self::A {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •() → self::B
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
 }
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
index 593c025..36647b1 100644
--- a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.transformed.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
+//   factory B() = A;
+//                 ^
+//
 // pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
 //  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
@@ -12,10 +16,6 @@
 //   new A();
 //       ^
 //
-// pkg/front_end/testcases/general/abstract_instantiation.dart:8:11: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
-//   factory B() = A;
-//           ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -27,10 +27,18 @@
 abstract class B extends core::Object implements self::A {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •() → self::B
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
 }
 static method test() → dynamic {
   throw new core::AbstractClassInstantiationError::•("A");
-  throw new core::AbstractClassInstantiationError::•("A");
+  invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
index 3cddf53..d0e5d30 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
@@ -38,7 +38,7 @@
     return throw "unsupported";
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
-    let dynamic #redirecting_factory = test::Class::_internal in invalid-expression;
+    return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
index 62a00f1..8534e61 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
@@ -26,7 +26,7 @@
   external static factory 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
-    let dynamic #redirecting_factory = self2::Class::_internal in invalid-expression;
+    return new self2::Class::_internal(defaultValue: defaultValue);
 }
 
 
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
index 3cddf53..d0e5d30 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
@@ -38,7 +38,7 @@
     return throw "unsupported";
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
-    let dynamic #redirecting_factory = test::Class::_internal in invalid-expression;
+    return new test::Class::_internal(defaultValue: defaultValue);
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
index f95725e..a73f4c5 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.expect
@@ -78,7 +78,7 @@
   static factory fact() → self::C*
     return null;
   static factory fact2() → self::C*
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   static method staticFunction(core::int* i) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
index c096df0..6da6ddb 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.outline.expect
@@ -13,7 +13,7 @@
   static factory fact() → self::C*
     ;
   static factory fact2() → self::C*
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   static method staticFunction(core::int* i) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
index 36b9317..7ea1c1e 100644
--- a/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.transformed.expect
@@ -78,7 +78,7 @@
   static factory fact() → self::C*
     return null;
   static factory fact2() → self::C*
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   static method staticFunction(core::int* i) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.expect
index e023b92..bf4d0eb 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.expect
@@ -5,7 +5,7 @@
 class A<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•];
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::A::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
index 7d7ca21..04afde7 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class A<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•];
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::A::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
index 485cd83..bf4d0eb 100644
--- a/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 class A<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•];
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let Never #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::A::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
index ed97aea..56f882f 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.expect
@@ -23,7 +23,7 @@
     : super core::Object::•()
     ;
   static factory bar() → foo::Foo
-    let dynamic #redirecting_factory = bar::Bar::• in let dynamic #typeArg0 = null in invalid-expression;
+    return new bar::Bar::•<dynamic>();
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
index e71f7a0..db7011d 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.outline.expect
@@ -25,7 +25,7 @@
     : super core::Object::•()
     ;
   static factory bar() → foo::Foo
-    let dynamic #redirecting_factory = bar::Bar::• in let dynamic #typeArg0 = null in invalid-expression;
+    return new bar::Bar::•<dynamic>();
 }
 
 library /*isNonNullableByDefault*/;
@@ -44,4 +44,4 @@
 
 Extra constant evaluation status:
 Evaluated: SetLiteral @ org-dartlang-testcase:///main.dart:7:27 -> InstanceConstant(const _UnmodifiableSet<Foo*>{_UnmodifiableSet._map: const _ImmutableMap<Foo*, Null>{_ImmutableMap._kvPairs: const <dynamic>[const Bar<dynamic>{}, null]}})
-Extra constant evaluation: evaluated: 6, effectively constant: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
index f7ed607..56f882f 100644
--- a/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
     : super core::Object::•()
     ;
   static factory bar() → foo::Foo
-    let Never #redirecting_factory = bar::Bar::• in let Null #typeArg0 = null in invalid-expression;
+    return new bar::Bar::•<dynamic>();
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
index 05d8566..dcbf1e1 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.expect
@@ -18,7 +18,7 @@
     : super core::Object::•()
     ;
   static factory foo() → self::A
-    let dynamic #redirecting_factory = self::B::• in let dynamic #typeArg0 = null in invalid-expression;
+    return new self::B::•<dynamic>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
index 25cabc79..a916713 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.outline.expect
@@ -18,7 +18,7 @@
     : super core::Object::•()
     ;
   static factory foo() → self::A
-    let dynamic #redirecting_factory = self::B::• in let dynamic #typeArg0 = null in invalid-expression;
+    return new self::B::•<dynamic>();
 }
 static method main() → dynamic
   ;
@@ -26,4 +26,4 @@
 
 Extra constant evaluation status:
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue45003_2.dart:6:30 -> InstanceConstant(const B<dynamic>{})
-Extra constant evaluation: evaluated: 6, effectively constant: 1
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
index 862829d..dcbf1e1 100644
--- a/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.transformed.expect
@@ -18,7 +18,7 @@
     : super core::Object::•()
     ;
   static factory foo() → self::A
-    let Never #redirecting_factory = self::B::• in let Null #typeArg0 = null in invalid-expression;
+    return new self::B::•<dynamic>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
index 16d5138..651a6e4 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.expect
@@ -34,7 +34,7 @@
   static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
-    let dynamic #redirecting_factory = self2::_ArraySize::• in let self2::Array::•::T* #typeArg0 = null in invalid-expression;
+    return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
index 68f366e..7c8d05d 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
@@ -35,7 +35,7 @@
   static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
   @_in::patch
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
-    let dynamic #redirecting_factory = self2::_ArraySize::• in let self2::Array::•::T* #typeArg0 = null in invalid-expression;
+    return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -53,4 +53,4 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:10:1 -> InstanceConstant(const _Patch{})
 Evaluated: ConstructorInvocation @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const pragma{pragma.name: "vm:entry-point", pragma.options: null})
 Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:14:17 -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 9, effectively constant: 3
+Extra constant evaluation: evaluated: 8, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
index 16d5138..651a6e4 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
   static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
   @#C1
   static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
-    let dynamic #redirecting_factory = self2::_ArraySize::• in let self2::Array::•::T* #typeArg0 = null in invalid-expression;
+    return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.weak.transformed.expect
index 92a8aa8..f7a04b0 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.weak.transformed.expect
@@ -108,7 +108,7 @@
 Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" in #t1.{self::ClassWithProperty::property}{self::EmptyClass*}{<unresolved>}.+(2);
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final invalid-type #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final Never #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
 Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/general/named_function_scope.dart.weak.transformed.expect
index c14d8e6..2f3683b 100644
--- a/pkg/front_end/testcases/general/named_function_scope.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.weak.transformed.expect
@@ -140,7 +140,7 @@
         ^" in null;
   }
   {
-    () →* Null x = let final invalid-type #t1 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
               ^" in let final () →* Null T = () → Null {} in T;
   }
@@ -150,7 +150,7 @@
       ^";
   }
   {
-    <T extends core::Object* = dynamic>() →* Null x = let final invalid-type #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final Never #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
             ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.expect b/pkg/front_end/testcases/general/private_members.dart.weak.expect
index 7320fdc..bf194cb 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.expect
@@ -18,7 +18,7 @@
     : super core::Object::•()
     ;
   static factory _privateRedirectingFactory() → self::_Class
-    let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+    return new self::_Class::_privateConstructor();
   method _privateMethod() → void {}
   get _privateGetter() → core::int
     return 42;
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
index f9f6839..fdc9a0e 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   constructor _privateConstructor() → self::_Class
     ;
   static factory _privateRedirectingFactory() → self::_Class
-    let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+    return new self::_Class::_privateConstructor();
   method _privateMethod() → void
     ;
   get _privateGetter() → core::int
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
index fd8fbf9..bf194cb 100644
--- a/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.transformed.expect
@@ -18,7 +18,7 @@
     : super core::Object::•()
     ;
   static factory _privateRedirectingFactory() → self::_Class
-    let Never #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
+    return new self::_Class::_privateConstructor();
   method _privateMethod() → void {}
   get _privateGetter() → core::int
     return 42;
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.expect b/pkg/front_end/testcases/general/qualified.dart.weak.expect
index 6bf765c..4deccd1 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.expect
@@ -81,7 +81,7 @@
     : super core::Object::•()
     ;
   static factory b<T extends core::Object* = dynamic>() → self::C<self::C::b::T*>*
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+    return lib::C::b<self::C::b::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -122,7 +122,7 @@
     : super self::C::•()
     ;
   static factory b<T extends core::Object* = dynamic>() → lib::C<lib::C::b::T*>*
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+    return new lib::C::a<lib::C::b::T*>();
 }
 class Supertype extends core::Object {
   synthetic constructor •() → lib::Supertype*
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect b/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
index 2102d04..7528cb9 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.outline.expect
@@ -79,7 +79,7 @@
   constructor a() → self::C<self::C::T*>*
     ;
   static factory b<T extends core::Object* = dynamic>() → self::C<self::C::b::T*>*
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+    return lib::C::b<self::C::b::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -109,7 +109,7 @@
   constructor a() → lib::C<lib::C::T*>*
     ;
   static factory b<T extends core::Object* = dynamic>() → lib::C<lib::C::b::T*>*
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+    return new lib::C::a<lib::C::b::T*>();
 }
 class Supertype extends core::Object {
   synthetic constructor •() → lib::Supertype*
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect b/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
index ea5014d..a982723 100644
--- a/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.transformed.expect
@@ -82,7 +82,7 @@
     : super core::Object::•()
     ;
   static factory b<T extends core::Object* = dynamic>() → self::C<self::C::b::T*>*
-    let <T extends core::Object* = dynamic>() →* lib::C<T*>* #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+    return lib::C::b<self::C::b::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -123,7 +123,7 @@
     : super self::C::•()
     ;
   static factory b<T extends core::Object* = dynamic>() → lib::C<lib::C::b::T*>*
-    let Never #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+    return new lib::C::a<lib::C::b::T*>();
 }
 class Supertype extends core::Object {
   synthetic constructor •() → lib::Supertype*
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
index 7443e13..0173839 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory fisk() → self::A*
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
index 6128d70..94296d3 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   constructor •() → self::A*
     ;
   static factory fisk() → self::A*
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
index c381d2d..0173839 100644
--- a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory fisk() → self::A*
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
index aa4bbfe..6155d9d 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.expect
@@ -15,7 +15,11 @@
   static final field dynamic _redirecting# = <dynamic>[self::FooBase::•];
   abstract get x() → core::int*;
   static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
-    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -30,7 +34,7 @@
 abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
   static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
   static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
-    let dynamic #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+    return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -64,7 +68,11 @@
     : super core::Object::•()
     ;
   method method() → dynamic {
-    return new self::Bar::•<core::String*, self::Builder::X*>(4);
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -80,7 +88,7 @@
 class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
   static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
-    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+    return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -95,7 +103,7 @@
 class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
   static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
-    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+    return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -158,7 +166,11 @@
     ;
 }
 static method main() → dynamic {
-  core::print(new self::Bar::•<core::String*, core::double*>(4).{self::FooBase::x}{core::int*});
+  core::print(invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^".{self::FooBase::x}{core::int*});
   new self::SimpleCaseImpl2::•<core::int*, core::double*>();
   new self::Mix::•<core::double*>();
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
index 9a9214d..611e0cc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.outline.expect
@@ -15,7 +15,11 @@
   static final field dynamic _redirecting# = <dynamic>[self::FooBase::•];
   abstract get x() → core::int*;
   static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
-    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -30,7 +34,7 @@
 abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
   static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
   static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
-    let dynamic #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+    return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -76,7 +80,7 @@
 class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
   static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
-    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+    return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -91,7 +95,7 @@
 class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
   static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
-    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+    return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
index e22b2b0..0f768e15 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.transformed.expect
@@ -15,7 +15,11 @@
   static final field dynamic _redirecting# = <dynamic>[self::FooBase::•];
   abstract get x() → core::int*;
   static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
-    let <T extends core::Object* = dynamic>(core::int*) →* self::Foo<T*>* #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -30,7 +34,7 @@
 abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
   static final field dynamic _redirecting# = <dynamic>[self::Foo::•];
   static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
-    let Never #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+    return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -64,7 +68,11 @@
     : super core::Object::•()
     ;
   method method() → dynamic {
-    return new self::Bar::•<core::String*, self::Builder::X*>(4);
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -80,7 +88,7 @@
 class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
   static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
-    let <Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() →* self::SimpleCaseImpl<Ai*, Bi*>* #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+    return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -95,7 +103,7 @@
 class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
   static final field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
   static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
-    let Never #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+    return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -158,7 +166,11 @@
     ;
 }
 static method main() → dynamic {
-  core::print(new self::Bar::•<core::String*, core::double*>(4).{self::FooBase::x}{core::int*});
+  core::print(invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^".{self::FooBase::x}{core::int*});
   new self::SimpleCaseImpl2::•<core::int*, core::double*>();
   new self::Mix::•<core::double*>();
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
index 88615ec..16a9cdc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.expect
@@ -8,9 +8,9 @@
     : super core::Object::•()
     ;
   static factory first() → self::A*
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory second() → self::A*
-    let dynamic #redirecting_factory = self::A::first in invalid-expression;
+    return self::A::first();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
index 7df5d5f..3f90310 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.outline.expect
@@ -7,9 +7,9 @@
   constructor •() → self::A*
     ;
   static factory first() → self::A*
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory second() → self::A*
-    let dynamic #redirecting_factory = self::A::first in invalid-expression;
+    return self::A::first();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
index 35892f43..16a9cdc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.transformed.expect
@@ -8,9 +8,9 @@
     : super core::Object::•()
     ;
   static factory first() → self::A*
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   static factory second() → self::A*
-    let () →* self::A* #redirecting_factory = self::A::first in invalid-expression;
+    return self::A::first();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
index 3841bc7..f2aaee2 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.expect
@@ -5,7 +5,7 @@
 class _X<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::_X::•];
   static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+    return new self::_Y::•<self::_X::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
index 23d11ab..aed68b9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class _X<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::_X::•];
   static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+    return new self::_Y::•<self::_X::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
index ce397b6..f2aaee2 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 class _X<T extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::_X::•];
   static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
-    let Never #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+    return new self::_Y::•<self::_X::•::T*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
index 1e7a7cc4..f1030db 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.expect
@@ -17,7 +17,7 @@
     : self::A::field = field, super core::Object::•()
     ;
   static factory redirect([core::int field]) → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•(field);
 }
 static method main() → dynamic {
   self::expect(42, new self::A::•().{self::A::field}{core::int});
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
index 352e5d1..c031d22 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
@@ -8,7 +8,7 @@
   constructor •([core::int field]) → self::A
     ;
   static factory redirect([core::int field]) → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•(field);
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
index 6b1dd68..f1030db 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
     : self::A::field = field, super core::Object::•()
     ;
   static factory redirect([core::int field]) → self::A
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•(field);
 }
 static method main() → dynamic {
   self::expect(42, new self::A::•().{self::A::field}{core::int});
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
index 1ce6e05..27d959b 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.expect
@@ -106,7 +106,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   get getter() → core::int
     return 0;
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
index 83aea2e..8977ba1 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.outline.expect
@@ -8,7 +8,7 @@
   constructor _() → self::Class1
     ;
   static factory •() → self::Class1
-    let dynamic #redirecting_factory = self::Class1::_ in invalid-expression;
+    return new self::Class1::_();
   get getter() → core::int
     ;
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
index 5da2827..9cea1c8 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.expect
@@ -9,7 +9,7 @@
     ;
   @#C1
   static factory •(@#C2 @#C3 dynamic p) → self::Foo*
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+    return new self::Foo::named(p);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
index a83d25d..f807177 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     ;
   @self::forFactoryItself
   static factory •(dynamic p) → self::Foo*
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+    return new self::Foo::named(p);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
index f7a4f91..9cea1c8 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
     ;
   @#C1
   static factory •(@#C2 @#C3 dynamic p) → self::Foo*
-    let Never #redirecting_factory = self::Foo::named in invalid-expression;
+    return new self::Foo::named(p);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
index de93fd8..ca460af 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory redir() → self::A*
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
index 43d5697..8549d41 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   constructor •() → self::A*
     ;
   static factory redir() → self::A*
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
index e4b7dde..ca460af 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory redir() → self::A*
-    let Never #redirecting_factory = self::A::• in invalid-expression;
+    return new self::A::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
index 05a7185..b3ec99a 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
@@ -28,7 +28,7 @@
     : super core::Object::•()
     ;
   static factory redir() → self::A*
-    let dynamic #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::Y*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
index 3cc1659..fedbec2 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
@@ -25,7 +25,7 @@
   constructor •() → self::A*
     ;
   static factory redir() → self::A*
-    let dynamic #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::Y*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
index 5fac4ba..b3ec99a 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
@@ -28,7 +28,7 @@
     : super core::Object::•()
     ;
   static factory redir() → self::A*
-    let Never #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::Y*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
index 19f5ced..d5fafac 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
index edba967..3bf6457 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
   static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
index aab753d..d5fafac 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
   static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let Never #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
index 521ea4e..6b9f76b 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.expect
@@ -28,7 +28,7 @@
     : super core::Object::•()
     ;
   static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
index 2551eab..522c0dc 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.outline.expect
@@ -25,7 +25,7 @@
   constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
   static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
index a07765d..6b9f76b 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.transformed.expect
@@ -28,7 +28,7 @@
     : super core::Object::•()
     ;
   static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
-    let Never #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
index e9d6519..45971e6 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::num*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -29,7 +29,7 @@
     : super self::A::empty()
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::String*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
index abc8779..97f2aa7 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   constructor empty() → self::A<self::A::T*>*
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::num*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -26,7 +26,7 @@
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::String*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
index 44022ca..45971e6 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let <U extends core::Object* = dynamic, W extends core::Object* = dynamic>() →* self::B<U*, W*>* #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::num*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -29,7 +29,7 @@
     : super self::A::empty()
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let Never #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::String*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
index 8f23e49..21aa750 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::List<self::A::•::T*>*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -29,7 +29,7 @@
     : super self::A::empty()
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::Map<self::B::•::U*, self::B::•::W*>*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
index 9e95322..fc699bb 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   constructor empty() → self::A<self::A::T*>*
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::List<self::A::•::T*>*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -26,7 +26,7 @@
   constructor empty() → self::B<self::B::U*, self::B::W*>*
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::Map<self::B::•::U*, self::B::•::W*>*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
index 7d52b3b..21aa750 100644
--- a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
-    let <U extends core::Object* = dynamic, W extends core::Object* = dynamic>() →* self::B<U*, W*>* #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+    return self::B::•<self::A::•::T*, core::List<self::A::•::T*>*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -29,7 +29,7 @@
     : super self::A::empty()
     ;
   static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
-    let Never #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::Map<self::B::•::U*, self::B::•::W*>*>();
 }
 class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
   constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
index ed8ef82..e858e7d 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::A*
-    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+    return new self::B::•<core::String*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
index ca134d1..0d1b358 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.outline.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::A*
-    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+    return new self::B::•<core::String*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
index c1c3aa5..e858e7d 100644
--- a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
     : super core::Object::•()
     ;
   static factory •() → self::A*
-    let Never #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+    return new self::B::•<core::String*>();
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect b/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
index cde35c2..39507e3 100644
--- a/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/changing_modules_8.yaml.world.1.expect
@@ -14,7 +14,7 @@
   abstract class XSet extends dart.core::Object {
     static final field dynamic _redirecting# = <dynamic>[lib1::XSet::identity];
     static factory identity() → lib1::XSet*
-      let dynamic #redirecting_factory = lib2::XLinkedHashSet::identity in invalid-expression;
+      return lib2::XLinkedHashSet::identity();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -35,7 +35,7 @@
   class XLinkedHashSet extends dart.core::Object implements lib1::XSet {
     static final field dynamic _redirecting# = <dynamic>[lib2::XLinkedHashSet::identity];
     static factory identity() → lib2::XLinkedHashSet*
-      let dynamic #redirecting_factory = lib3::XIdentityHashSet::• in invalid-expression;
+      return new lib3::XIdentityHashSet::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
index 3b0a7e5..71134e0 100644
--- a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.1.expect
@@ -14,7 +14,7 @@
       : super dart.core::Object::•()
       ;
     static factory e4() → lib::C*
-      let dynamic #redirecting_factory = lib::C::• in invalid-expression;
+      return new lib::C::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
index bec03e7..9a40608 100644
--- a/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_test_1.yaml.world.2.expect
@@ -14,7 +14,7 @@
       : super dart.core::Object::•()
       ;
     static factory e4() → lib::C*
-      let dynamic #redirecting_factory = lib::C::• in invalid-expression;
+      return new lib::C::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
index 7d948ed..e334a8f 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.1.expect
@@ -50,7 +50,7 @@
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
-      let dynamic #redirecting_factory = foo::Bar::_ in invalid-expression;
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
     static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
@@ -60,7 +60,7 @@
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return #C11;
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      let dynamic #redirecting_factory = foo::Baz::__ in invalid-expression;
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
index b101e36..c1f530e 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.2.expect
@@ -50,7 +50,7 @@
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
-      let dynamic #redirecting_factory = foo::Bar::_ in invalid-expression;
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
     static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
@@ -60,7 +60,7 @@
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return #C11;
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      let dynamic #redirecting_factory = foo::Baz::__ in invalid-expression;
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
diff --git a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
index 7d948ed..e334a8f 100644
--- a/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/flutter_widget_transform_const.yaml.world.3.expect
@@ -50,7 +50,7 @@
       : super fra::Widget::•($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4)
       ;
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Bar
-      let dynamic #redirecting_factory = foo::Bar::_ in invalid-expression;
+      return new foo::Bar::_($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Baz extends fra::Widget /*hasConstConstructor*/  {
     static final field dynamic _redirecting# = <dynamic>[foo::Baz::_]/*isLegacy*/;
@@ -60,7 +60,7 @@
     static factory •({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
       return #C11;
     static factory _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Baz
-      let dynamic #redirecting_factory = foo::Baz::__ in invalid-expression;
+      return new foo::Baz::__($creationLocationd_0dea112b090073317d4: $creationLocationd_0dea112b090073317d4);
   }
   class Boz extends fra::Widget /*hasConstConstructor*/  {
     const constructor _({wid::_Location? $creationLocationd_0dea112b090073317d4 = #C1}) → foo::Boz
diff --git a/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
index d9b1730..008ff7a 100644
--- a/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/issue_41976.yaml.world.1.expect
@@ -7,7 +7,7 @@
       : super dart.core::Object::•()
       ;
     static factory •(dart.core::String* value) → foo::Key*
-      let dynamic #redirecting_factory = foo::ValueKey::• in invalid-expression;
+      return new foo::ValueKey::•(value);
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
index 5157f4f..02964ab 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.1.expect
@@ -6,7 +6,7 @@
   class Foo extends dart.core::Object {
     static final field dynamic _redirecting# = <dynamic>[lib1::Foo::•];
     static factory •() → lib1::Foo*
-      let dynamic #redirecting_factory = lib2::Bar::• in invalid-expression;
+      return new lib2::Bar::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
index e289c2a..14d998a 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_11.yaml.world.2.expect
@@ -6,7 +6,7 @@
   class Foo extends dart.core::Object {
     static final field dynamic _redirecting# = <dynamic>[lib1::Foo::•];
     static factory •() → lib1::Foo*
-      let dynamic #redirecting_factory = lib2::Bar::• in invalid-expression;
+      return new lib2::Bar::•();
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
index 47fdc2b..8cde08e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.1.expect
@@ -7,7 +7,7 @@
       : super dart.core::Object::•()
       ;
     static factory bar() → main::Foo*
-      let dynamic #redirecting_factory = main::Baz::• in invalid-expression;
+      return new main::Baz::•();
     method bar() → void {}
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
index 47fdc2b..8cde08e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_45_flutter_prime_1.yaml.world.2.expect
@@ -7,7 +7,7 @@
       : super dart.core::Object::•()
       ;
     static factory bar() → main::Foo*
-      let dynamic #redirecting_factory = main::Baz::• in invalid-expression;
+      return new main::Baz::•();
     method bar() → void {}
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
index d10efba..e347a7d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return new self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
index 024beff..1056c97 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return new self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
index 39e8848..e347a7d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let Never #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return new self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
index ac3f37a..2f9257b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
index 9f89adf..6eaaeb2 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
index 9bae319..2f9257b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   abstract get t() → self::C::T*;
   abstract set t(generic-covariant-impl self::C::T* x) → void;
   static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
-    let <T extends core::Object* = dynamic>(T*) →* self::CImpl<T*>* #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+    return self::CImpl::•<self::C::•::T*>(t);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
index c6656a8..26a075c 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.expect
@@ -136,15 +136,15 @@
     : super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor3 in invalid-expression;
+    return new self::A::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor4 in invalid-expression;
+    return new self::A::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor5 in invalid-expression;
+    return new self::A::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor6 in invalid-expression;
+    return new self::A::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor7 in invalid-expression;
+    return new self::A::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::A
     return new self::A::constructor3();
   static factory factory9({core::int i = #C1}) → self::A
@@ -197,15 +197,15 @@
     : self::C::i = i, super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor3 in invalid-expression;
+    return new self::C::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor4 in invalid-expression;
+    return new self::C::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor5 in invalid-expression;
+    return new self::C::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor6 in invalid-expression;
+    return new self::C::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor7 in invalid-expression;
+    return new self::C::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::C
     return new self::C::constructor3();
   static factory factory9({core::int i = #C1}) → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
index f3893aa..b672730 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.strong.transformed.expect
@@ -136,15 +136,15 @@
     : super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::A
-    let Never #redirecting_factory = self::A::constructor3 in invalid-expression;
+    return new self::A::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor4 in invalid-expression;
+    return new self::A::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::A
-    let Never #redirecting_factory = self::A::constructor5 in invalid-expression;
+    return new self::A::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor6 in invalid-expression;
+    return new self::A::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor7 in invalid-expression;
+    return new self::A::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::A
     return new self::A::constructor3();
   static factory factory9({core::int i = #C1}) → self::A
@@ -197,15 +197,15 @@
     : self::C::i = i, super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::C
-    let Never #redirecting_factory = self::C::constructor3 in invalid-expression;
+    return new self::C::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor4 in invalid-expression;
+    return new self::C::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::C
-    let Never #redirecting_factory = self::C::constructor5 in invalid-expression;
+    return new self::C::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor6 in invalid-expression;
+    return new self::C::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor7 in invalid-expression;
+    return new self::C::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::C
     return new self::C::constructor3();
   static factory factory9({core::int i = #C1}) → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
index c6656a8..26a075c 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.expect
@@ -136,15 +136,15 @@
     : super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor3 in invalid-expression;
+    return new self::A::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor4 in invalid-expression;
+    return new self::A::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor5 in invalid-expression;
+    return new self::A::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor6 in invalid-expression;
+    return new self::A::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor7 in invalid-expression;
+    return new self::A::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::A
     return new self::A::constructor3();
   static factory factory9({core::int i = #C1}) → self::A
@@ -197,15 +197,15 @@
     : self::C::i = i, super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor3 in invalid-expression;
+    return new self::C::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor4 in invalid-expression;
+    return new self::C::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor5 in invalid-expression;
+    return new self::C::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor6 in invalid-expression;
+    return new self::C::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor7 in invalid-expression;
+    return new self::C::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::C
     return new self::C::constructor3();
   static factory factory9({core::int i = #C1}) → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
index b2b3256..0040b41 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.outline.expect
@@ -107,15 +107,15 @@
   external constructor constructor9({core::int i}) → self::A
     ;
   static factory factory3([core::int i]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor3 in invalid-expression;
+    return new self::A::constructor3(i);
   static factory factory4({core::int i}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor4 in invalid-expression;
+    return new self::A::constructor4(i: i);
   static factory factory5([core::int? i]) → self::A
-    let dynamic #redirecting_factory = self::A::constructor5 in invalid-expression;
+    return new self::A::constructor5(i);
   static factory factory6({core::int? i}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor6 in invalid-expression;
+    return new self::A::constructor6(i: i);
   static factory factory7({required core::int i}) → self::A
-    let dynamic #redirecting_factory = self::A::constructor7 in invalid-expression;
+    return new self::A::constructor7(i: i);
   static factory factory8([core::int i]) → self::A
     ;
   static factory factory9({core::int i}) → self::A
@@ -161,15 +161,15 @@
   constructor constructor7({required core::int i}) → self::C
     ;
   static factory factory3([core::int i]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor3 in invalid-expression;
+    return new self::C::constructor3(i);
   static factory factory4({core::int i}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor4 in invalid-expression;
+    return new self::C::constructor4(i: i);
   static factory factory5([core::int? i]) → self::C
-    let dynamic #redirecting_factory = self::C::constructor5 in invalid-expression;
+    return new self::C::constructor5(i);
   static factory factory6({core::int? i}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor6 in invalid-expression;
+    return new self::C::constructor6(i: i);
   static factory factory7({required core::int i}) → self::C
-    let dynamic #redirecting_factory = self::C::constructor7 in invalid-expression;
+    return new self::C::constructor7(i: i);
   static factory factory8([core::int i]) → self::C
     ;
   static factory factory9({core::int i}) → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
index a487c1a..94f4fab 100644
--- a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.transformed.expect
@@ -136,15 +136,15 @@
     : super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::A
-    let Never #redirecting_factory = self::A::constructor3 in invalid-expression;
+    return new self::A::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor4 in invalid-expression;
+    return new self::A::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::A
-    let Never #redirecting_factory = self::A::constructor5 in invalid-expression;
+    return new self::A::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor6 in invalid-expression;
+    return new self::A::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::A
-    let Never #redirecting_factory = self::A::constructor7 in invalid-expression;
+    return new self::A::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::A
     return new self::A::constructor3();
   static factory factory9({core::int i = #C1}) → self::A
@@ -197,15 +197,15 @@
     : self::C::i = i, super core::Object::•()
     ;
   static factory factory3([core::int i = #C1]) → self::C
-    let Never #redirecting_factory = self::C::constructor3 in invalid-expression;
+    return new self::C::constructor3(i);
   static factory factory4({core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor4 in invalid-expression;
+    return new self::C::constructor4(i: i);
   static factory factory5([core::int? i = #C1]) → self::C
-    let Never #redirecting_factory = self::C::constructor5 in invalid-expression;
+    return new self::C::constructor5(i);
   static factory factory6({core::int? i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor6 in invalid-expression;
+    return new self::C::constructor6(i: i);
   static factory factory7({required core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::constructor7 in invalid-expression;
+    return new self::C::constructor7(i: i);
   static factory factory8([core::int i = #C1]) → self::C
     return new self::C::constructor3();
   static factory factory9({core::int i = #C1}) → self::C
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
index ed2262c..0c168d7 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.expect
@@ -13,7 +13,7 @@
   field Never n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(Never n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   field Never n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
index 6cf3739..0c168d7 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
   field Never n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(Never n) → self::C
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   field Never n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
index ed2262c..0c168d7 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.expect
@@ -13,7 +13,7 @@
   field Never n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(Never n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   field Never n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
index 08fff2c..18f72ef 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.outline.expect
@@ -6,7 +6,7 @@
   field Never n;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(Never n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   field Never n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
index 6cf3739..0c168d7 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
   field Never n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(Never n) → self::C
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   field Never n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
index 9f4202d..bd950c6 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.expect
@@ -14,7 +14,7 @@
   final field dynamic n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(dynamic n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   final field dynamic n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
index 6347dde..bd950c6 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
   final field dynamic n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(dynamic n) → self::C
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   final field dynamic n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
index 9f4202d..bd950c6 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.expect
@@ -14,7 +14,7 @@
   final field dynamic n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(dynamic n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   final field dynamic n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
index afe3abd..53f7e37 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.outline.expect
@@ -6,7 +6,7 @@
   final field dynamic n;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(dynamic n) → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   final field dynamic n;
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
index 6347dde..bd950c6 100644
--- a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
   final field dynamic n = null;
   static final field dynamic _redirecting# = <dynamic>[self::C::•]/*isLegacy*/;
   static factory •(dynamic n) → self::C
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•(n);
 }
 class D extends core::Object implements self::C {
   final field dynamic n;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index 19e109d..a02c4ef 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -228,7 +228,7 @@
     self::D<core::String>? b;
   }
   static factory redirect(self::A<self::A<Null>>? a) → self::C
-    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+    return new self::C::internal(a);
   static factory fact(self::A<self::A<Null>>? a) → self::C {
     self::A<self::A<Null>>? b;
     self::D<core::String>? c;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index 48a5a0a..a02c4ef 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -228,7 +228,7 @@
     self::D<core::String>? b;
   }
   static factory redirect(self::A<self::A<Null>>? a) → self::C
-    let Never #redirecting_factory = self::C::internal in invalid-expression;
+    return new self::C::internal(a);
   static factory fact(self::A<self::A<Null>>? a) → self::C {
     self::A<self::A<Null>>? b;
     self::D<core::String>? c;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index 19e109d..a02c4ef 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -228,7 +228,7 @@
     self::D<core::String>? b;
   }
   static factory redirect(self::A<self::A<Null>>? a) → self::C
-    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+    return new self::C::internal(a);
   static factory fact(self::A<self::A<Null>>? a) → self::C {
     self::A<self::A<Null>>? b;
     self::D<core::String>? c;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
index aef5c33..39eaec6 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
@@ -125,7 +125,7 @@
   constructor internal(dynamic _) → self::C
     ;
   static factory redirect(self::A<self::A<Null>>? a) → self::C
-    let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+    return new self::C::internal(a);
   static factory fact(self::A<self::A<Null>>? a) → self::C
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index 48a5a0a..a02c4ef 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -228,7 +228,7 @@
     self::D<core::String>? b;
   }
   static factory redirect(self::A<self::A<Null>>? a) → self::C
-    let Never #redirecting_factory = self::C::internal in invalid-expression;
+    return new self::C::internal(a);
   static factory fact(self::A<self::A<Null>>? a) → self::C {
     self::A<self::A<Null>>? b;
     self::D<core::String>? c;
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
index d62d171..fd4ab1f 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.expect
@@ -24,7 +24,7 @@
     return new self::C::gen();
   }
   static factory redirect({core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::gen in invalid-expression;
+    return new self::C::gen(i: i);
 }
 class D extends core::Object {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
index 25804c8..fd4ab1f 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
     return new self::C::gen();
   }
   static factory redirect({core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::gen in invalid-expression;
+    return new self::C::gen(i: i);
 }
 class D extends core::Object {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
index d62d171..fd4ab1f 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.expect
@@ -24,7 +24,7 @@
     return new self::C::gen();
   }
   static factory redirect({core::int i = #C1}) → self::C
-    let dynamic #redirecting_factory = self::C::gen in invalid-expression;
+    return new self::C::gen(i: i);
 }
 class D extends core::Object {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
index ac7b8e7..bff1a1e 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.outline.expect
@@ -22,7 +22,7 @@
   static factory fact({core::int i}) → self::C
     ;
   static factory redirect({core::int i}) → self::C
-    let dynamic #redirecting_factory = self::C::gen in invalid-expression;
+    return new self::C::gen(i: i);
 }
 class D extends core::Object {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
index 25804c8..fd4ab1f 100644
--- a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.transformed.expect
@@ -24,7 +24,7 @@
     return new self::C::gen();
   }
   static factory redirect({core::int i = #C1}) → self::C
-    let Never #redirecting_factory = self::C::gen in invalid-expression;
+    return new self::C::gen(i: i);
 }
 class D extends core::Object {
   synthetic constructor •() → self::D
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
index 152826c..e038284 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.expect
@@ -5,7 +5,7 @@
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
-    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_A::•<self::A::•::T%>(value);
 }
 class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
   constructor •(self::_A::T% value) → self::_A<self::_A::T%>
@@ -15,7 +15,7 @@
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
-    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_B::•<self::B::•::T%>(value);
 }
 class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
   constructor •(core::int value) → self::_B<self::_B::T%>
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
index 3ebf619..e038284 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
-    let Never #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_A::•<self::A::•::T%>(value);
 }
 class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
   constructor •(self::_A::T% value) → self::_A<self::_A::T%>
@@ -15,7 +15,7 @@
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
-    let Never #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_B::•<self::B::•::T%>(value);
 }
 class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
   constructor •(core::int value) → self::_B<self::_B::T%>
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
index 152826c..e038284 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.expect
@@ -5,7 +5,7 @@
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
-    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_A::•<self::A::•::T%>(value);
 }
 class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
   constructor •(self::_A::T% value) → self::_A<self::_A::T%>
@@ -15,7 +15,7 @@
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
-    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_B::•<self::B::•::T%>(value);
 }
 class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
   constructor •(core::int value) → self::_B<self::_B::T%>
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
index 1b9a3e0..a50e08b 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
-    let dynamic #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_A::•<self::A::•::T%>(value);
 }
 class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
   constructor •(self::_A::T% value) → self::_A<self::_A::T%>
@@ -14,7 +14,7 @@
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
-    let dynamic #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_B::•<self::B::•::T%>(value);
 }
 class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
   constructor •(core::int value) → self::_B<self::_B::T%>
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
index 3ebf619..e038284 100644
--- a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 abstract class A<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
-    let Never #redirecting_factory = self::_A::• in let self::A::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_A::•<self::A::•::T%>(value);
 }
 class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
   constructor •(self::_A::T% value) → self::_A<self::_A::T%>
@@ -15,7 +15,7 @@
 abstract class B<T extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
   static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
-    let Never #redirecting_factory = self::_B::• in let self::B::•::T% #typeArg0 = null in invalid-expression;
+    return new self::_B::•<self::B::•::T%>(value);
 }
 class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
   constructor •(core::int value) → self::_B<self::_B::T%>
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
index 661f38d..2640926 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
@@ -64,7 +64,10 @@
 class C1 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
   static factory •() → self::C1
-    let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
 }
 class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
@@ -77,6 +80,9 @@
     : super core::Object::•()
     ;
   static factory bar(core::num? x) → self::D
-    let dynamic #redirecting_factory = self::D::foo in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
index 1ac0b20..2640926 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
@@ -64,7 +64,10 @@
 class C1 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
   static factory •() → self::C1
-    let Never #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
 }
 class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
@@ -77,6 +80,9 @@
     : super core::Object::•()
     ;
   static factory bar(core::num? x) → self::D
-    let Never #redirecting_factory = self::D::foo in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
index 661f38d..2640926 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
@@ -64,7 +64,10 @@
 class C1 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
   static factory •() → self::C1
-    let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
 }
 class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
@@ -77,6 +80,9 @@
     : super core::Object::•()
     ;
   static factory bar(core::num? x) → self::D
-    let dynamic #redirecting_factory = self::D::foo in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
index c5c7f90..1f2f60e 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
@@ -64,7 +64,10 @@
 class C1 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
   static factory •() → self::C1
-    let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
 }
 class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
@@ -75,7 +78,10 @@
   constructor foo(core::num x) → self::D
     ;
   static factory bar(core::num? x) → self::D
-    let dynamic #redirecting_factory = self::D::foo in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
index 1ac0b20..2640926 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
@@ -64,7 +64,10 @@
 class C1 extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C1::•]/*isLegacy*/;
   static factory •() → self::C1
-    let Never #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
 }
 class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
@@ -77,6 +80,9 @@
     : super core::Object::•()
     ;
   static factory bar(core::num? x) → self::D
-    let Never #redirecting_factory = self::D::foo in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
index 03c441d..9f5ab6a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.expect
@@ -8,6 +8,6 @@
     : super core::Object::•()
     ;
   static factory redirect() → self::Class
-    let dynamic #redirecting_factory = self::Class::• in invalid-expression;
+    return new self::Class::•();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
index 8527d75..2dad0b1 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.outline.expect
@@ -7,7 +7,7 @@
   constructor •() → self::Class
     ;
   static factory redirect() → self::Class
-    let dynamic #redirecting_factory = self::Class::• in invalid-expression;
+    return new self::Class::•();
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
index f2556e6..9f5ab6a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.transformed.expect
@@ -8,6 +8,6 @@
     : super core::Object::•()
     ;
   static factory redirect() → self::Class
-    let Never #redirecting_factory = self::Class::• in invalid-expression;
+    return new self::Class::•();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
index e1d738d..34cee4f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
@@ -39,9 +39,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
-    let dynamic #redirecting_factory = opt::Class1::_ in let opt::Class1::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class1::_<opt::Class1::redirect::T%>();
   static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
-    let dynamic #redirecting_factory = opt::Class1::_ in let opt::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class1::_<opt::Class1::constRedirect::T%>();
   static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
@@ -51,9 +51,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
-    let dynamic #redirecting_factory = opt::Class2::_ in let opt::Class2::redirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class2::_<opt::Class2::redirect::T>();
   static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
-    let dynamic #redirecting_factory = opt::Class2::_ in let opt::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class2::_<opt::Class2::constRedirect::T>();
   static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
@@ -63,9 +63,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
-    let dynamic #redirecting_factory = opt::Class3::_ in let opt::Class3::redirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class3::_<opt::Class3::redirect::T>();
   static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
-    let dynamic #redirecting_factory = opt::Class3::_ in let opt::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class3::_<opt::Class3::constRedirect::T>();
   static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
@@ -75,9 +75,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::redirect::T%>
-    let dynamic #redirecting_factory = opt::Class4::_ in let opt::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class4::_<opt::Class4::redirect::T%>();
   static factory constRedirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::constRedirect::T%>
-    let dynamic #redirecting_factory = opt::Class4::_ in let opt::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class4::_<opt::Class4::constRedirect::T%>();
   static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
@@ -87,9 +87,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
-    let dynamic #redirecting_factory = opt::Class5::_ in let opt::Class5::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class5::_<opt::Class5::redirect::T%>();
   static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
-    let dynamic #redirecting_factory = opt::Class5::_ in let opt::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class5::_<opt::Class5::constRedirect::T%>();
   static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
     return new opt::Class5::_<opt::Class5::fact::T%>();
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
index f70672f..958ab4c 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
@@ -16,9 +16,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
-    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class1::_<self2::Class1::redirect::T%>();
   static factory constRedirect<T extends core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
-    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class1::_<self2::Class1::constRedirect::T%>();
   static factory fact<T extends core::Object?>() → self2::Class1<self2::Class1::fact::T%>
     ;
 }
@@ -28,9 +28,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object>() → self2::Class2<self2::Class2::redirect::T>
-    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::redirect::T #typeArg0 = null in invalid-expression;
+    return new self2::Class2::_<self2::Class2::redirect::T>();
   static factory constRedirect<T extends core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
-    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new self2::Class2::_<self2::Class2::constRedirect::T>();
   static factory fact<T extends core::Object>() → self2::Class2<self2::Class2::fact::T>
     ;
 }
@@ -40,9 +40,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::String>() → self2::Class3<self2::Class3::redirect::T>
-    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::redirect::T #typeArg0 = null in invalid-expression;
+    return new self2::Class3::_<self2::Class3::redirect::T>();
   static factory constRedirect<T extends core::String>() → self2::Class3<self2::Class3::constRedirect::T>
-    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new self2::Class3::_<self2::Class3::constRedirect::T>();
   static factory fact<T extends core::String>() → self2::Class3<self2::Class3::fact::T>
     ;
 }
@@ -52,9 +52,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::redirect::T%>
-    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class4::_<self2::Class4::redirect::T%>();
   static factory constRedirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::constRedirect::T%>
-    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class4::_<self2::Class4::constRedirect::T%>();
   static factory fact<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::fact::T%>
     ;
 }
@@ -64,9 +64,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends dynamic>() → self2::Class5<self2::Class5::redirect::T%>
-    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::redirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class5::_<self2::Class5::redirect::T%>();
   static factory constRedirect<T extends dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
-    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new self2::Class5::_<self2::Class5::constRedirect::T%>();
   static factory fact<T extends dynamic>() → self2::Class5<self2::Class5::fact::T%>
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
index e67696e..34cee4f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
@@ -39,9 +39,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
-    let Never #redirecting_factory = opt::Class1::_ in let opt::Class1::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class1::_<opt::Class1::redirect::T%>();
   static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
-    let Never #redirecting_factory = opt::Class1::_ in let opt::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class1::_<opt::Class1::constRedirect::T%>();
   static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
@@ -51,9 +51,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
-    let Never #redirecting_factory = opt::Class2::_ in let opt::Class2::redirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class2::_<opt::Class2::redirect::T>();
   static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
-    let Never #redirecting_factory = opt::Class2::_ in let opt::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class2::_<opt::Class2::constRedirect::T>();
   static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
@@ -63,9 +63,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
-    let Never #redirecting_factory = opt::Class3::_ in let opt::Class3::redirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class3::_<opt::Class3::redirect::T>();
   static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
-    let Never #redirecting_factory = opt::Class3::_ in let opt::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
+    return new opt::Class3::_<opt::Class3::constRedirect::T>();
   static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
@@ -75,9 +75,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::redirect::T%>
-    let Never #redirecting_factory = opt::Class4::_ in let opt::Class4::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class4::_<opt::Class4::redirect::T%>();
   static factory constRedirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::constRedirect::T%>
-    let Never #redirecting_factory = opt::Class4::_ in let opt::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class4::_<opt::Class4::constRedirect::T%>();
   static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
@@ -87,9 +87,9 @@
     : super core::Object::•()
     ;
   static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
-    let Never #redirecting_factory = opt::Class5::_ in let opt::Class5::redirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class5::_<opt::Class5::redirect::T%>();
   static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
-    let Never #redirecting_factory = opt::Class5::_ in let opt::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
+    return new opt::Class5::_<opt::Class5::constRedirect::T%>();
   static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
     return new opt::Class5::_<opt::Class5::fact::T%>();
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
index 0c9e63d..2cb6f54 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
@@ -55,7 +55,7 @@
     : super opt::P::_(token)
     ;
   static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
-    let dynamic #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
+    return new opt::CP::_<opt::CP::•::T>(type);
 }
 class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
@@ -68,7 +68,7 @@
     : super opt::P::_(token)
     ;
   static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
-    let dynamic #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
+    return new opt::VP::_<opt::VP::forToken::T>(token, useValue);
 }
 class M extends core::Object /*hasConstConstructor*/  {
   final field core::List<opt::P<core::Object>> list;
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
index 06c295f..ee92a0d 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
@@ -55,7 +55,7 @@
     : super opt::P::_(token)
     ;
   static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
-    let dynamic #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
+    return new opt::CP::_<opt::CP::•::T>(type);
 }
 class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
@@ -68,7 +68,7 @@
     : super opt::P::_(token)
     ;
   static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
-    let dynamic #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
+    return new opt::VP::_<opt::VP::forToken::T>(token, useValue);
 }
 class M extends core::Object /*hasConstConstructor*/  {
   final field core::List<opt::P<core::Object>> list;
@@ -82,4 +82,4 @@
 Evaluated: ListLiteral @ org-dartlang-testcase:///main.dart:15:14 -> ListConstant(const <P<Object*>*>[const CP<Object*>{P.token: Class*}, const VP<Object*>{P.token: const XToken{}}])
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main.dart:20:11 -> InstanceConstant(const M{M.list: const <P<Object*>*>[const CP<Object*>{P.token: Class*}, const VP<Object*>{P.token: const XToken{}}]})
 Evaluated: ListLiteral @ org-dartlang-testcase:///opt_in_lib.dart:36:24 -> ListConstant(const <P<Object*>*>[])
-Extra constant evaluation: evaluated: 17, effectively constant: 3
+Extra constant evaluation: evaluated: 16, effectively constant: 3
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
index 7b1f0d6..2cb6f54 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
@@ -55,7 +55,7 @@
     : super opt::P::_(token)
     ;
   static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
-    let Never #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
+    return new opt::CP::_<opt::CP::•::T>(type);
 }
 class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
@@ -68,7 +68,7 @@
     : super opt::P::_(token)
     ;
   static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
-    let Never #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
+    return new opt::VP::_<opt::VP::forToken::T>(token, useValue);
 }
 class M extends core::Object /*hasConstConstructor*/  {
   final field core::List<opt::P<core::Object>> list;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
index 435aedb..3df2a9b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.expect
@@ -6,9 +6,9 @@
 class A extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
   static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory named() → self::A
-    let dynamic #redirecting_factory = self::B::named in invalid-expression;
+    return new self::B::named();
 }
 class B extends core::Object implements self::A {
   constructor •() → self::B
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
index b58ffcf..3df2a9b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.strong.transformed.expect
@@ -6,9 +6,9 @@
 class A extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
   static factory •() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory named() → self::A
-    let Never #redirecting_factory = self::B::named in invalid-expression;
+    return new self::B::named();
 }
 class B extends core::Object implements self::A {
   constructor •() → self::B
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
index 435aedb..3df2a9b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.expect
@@ -6,9 +6,9 @@
 class A extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
   static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory named() → self::A
-    let dynamic #redirecting_factory = self::B::named in invalid-expression;
+    return new self::B::named();
 }
 class B extends core::Object implements self::A {
   constructor •() → self::B
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
index 65b2862..978eeea 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.outline.expect
@@ -6,9 +6,9 @@
 class A extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
   static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory named() → self::A
-    let dynamic #redirecting_factory = self::B::named in invalid-expression;
+    return new self::B::named();
 }
 class B extends core::Object implements self::A {
   constructor •() → self::B
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
index b58ffcf..3df2a9b 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.transformed.expect
@@ -6,9 +6,9 @@
 class A extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::A::•, self::A::named]/*isLegacy*/;
   static factory •() → self::A
-    let Never #redirecting_factory = self::B::• in invalid-expression;
+    return new self::B::•();
   static factory named() → self::A
-    let Never #redirecting_factory = self::B::named in invalid-expression;
+    return new self::B::named();
 }
 class B extends core::Object implements self::A {
   constructor •() → self::B
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
index 88129af..45b7e1ee7 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.expect
@@ -75,7 +75,7 @@
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
     return new self::C::foo<self::C::•::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
-    let dynamic #redirecting_factory = self::C::• in let self::C::bar::X% #typeArg0 = null in invalid-expression;
+    return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
@@ -85,7 +85,7 @@
   static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
     return new self::D::•<self::D::foo::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
-    let dynamic #redirecting_factory = self::D::• in let self::D::bar::X% #typeArg0 = null in invalid-expression;
+    return new self::D::•<self::D::bar::X%>();
 }
 static method test() → dynamic {
   self::C::•<(self::C<Never>) → self::C<core::Object?>>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
index eab7fa2..45b7e1ee7 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.strong.transformed.expect
@@ -75,7 +75,7 @@
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
     return new self::C::foo<self::C::•::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
-    let <X extends core::Object? = dynamic>() → self::C<X%> #redirecting_factory = self::C::• in let self::C::bar::X% #typeArg0 = null in invalid-expression;
+    return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
@@ -85,7 +85,7 @@
   static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
     return new self::D::•<self::D::foo::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
-    let Never #redirecting_factory = self::D::• in let self::D::bar::X% #typeArg0 = null in invalid-expression;
+    return new self::D::•<self::D::bar::X%>();
 }
 static method test() → dynamic {
   self::C::•<(self::C<Never>) → self::C<core::Object?>>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
index 88129af..45b7e1ee7 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.expect
@@ -75,7 +75,7 @@
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
     return new self::C::foo<self::C::•::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
-    let dynamic #redirecting_factory = self::C::• in let self::C::bar::X% #typeArg0 = null in invalid-expression;
+    return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
@@ -85,7 +85,7 @@
   static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
     return new self::D::•<self::D::foo::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
-    let dynamic #redirecting_factory = self::D::• in let self::D::bar::X% #typeArg0 = null in invalid-expression;
+    return new self::D::•<self::D::bar::X%>();
 }
 static method test() → dynamic {
   self::C::•<(self::C<Never>) → self::C<core::Object?>>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
index 5bcbed2..b89222a 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.outline.expect
@@ -12,7 +12,7 @@
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
     ;
   static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
-    let dynamic #redirecting_factory = self::C::• in let self::C::bar::X% #typeArg0 = null in invalid-expression;
+    return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
@@ -21,7 +21,7 @@
   static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
     ;
   static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
-    let dynamic #redirecting_factory = self::D::• in let self::D::bar::X% #typeArg0 = null in invalid-expression;
+    return new self::D::•<self::D::bar::X%>();
 }
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
index eab7fa2..45b7e1ee7 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.transformed.expect
@@ -75,7 +75,7 @@
   static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
     return new self::C::foo<self::C::•::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
-    let <X extends core::Object? = dynamic>() → self::C<X%> #redirecting_factory = self::C::• in let self::C::bar::X% #typeArg0 = null in invalid-expression;
+    return self::C::•<self::C::bar::X%>();
 }
 class D<X extends core::Object? = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
@@ -85,7 +85,7 @@
   static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
     return new self::D::•<self::D::foo::X%>();
   static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
-    let Never #redirecting_factory = self::D::• in let self::D::bar::X% #typeArg0 = null in invalid-expression;
+    return new self::D::•<self::D::bar::X%>();
 }
 static method test() → dynamic {
   self::C::•<(self::C<Never>) → self::C<core::Object?>>();
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
index 6c4e211..4ca626f 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.expect
@@ -77,7 +77,9 @@
 class D extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::•];
   static factory •() → self::D*
-    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -93,7 +95,7 @@
   new self::A::•();
   new self::B::•();
   new self::C::•();
-  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:19:7: Error: Method not found: 'Missing'.
-  new D();
-      ^";
+  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
 }
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
index 11d42be..5a0190f 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.outline.expect
@@ -75,7 +75,9 @@
 class D extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::•];
   static factory •() → self::D*
-    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
index 3915deb..4ca626f 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.transformed.expect
@@ -77,7 +77,9 @@
 class D extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::D::•];
   static factory •() → self::D*
-    let core::String* #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -93,7 +95,7 @@
   new self::A::•();
   new self::B::•();
   new self::C::•();
-  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:19:7: Error: Method not found: 'Missing'.
-  new D();
-      ^";
+  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
 }
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
index e0f9879..900f8a7 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.expect
@@ -78,11 +78,18 @@
     : super core::Object::•()
     ;
   static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
-    let dynamic #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+    return self::B::a<self::A::a::T*>();
   static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
-    let dynamic #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
   static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
-    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -100,9 +107,14 @@
     : super self::A::internal()
     ;
   static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+    return new self::C::•<self::B::a::S*>();
   static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
-    let dynamic #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
 }
 class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
   constructor •() → self::C<self::C::U*>*
@@ -111,10 +123,20 @@
 }
 static method main() → dynamic {
   new self::C::•<self::C3*>();
-  new self::C::•<self::C1*>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
   new self::C::•<self::C3*>();
-  new self::C::•<self::C2*>();
-  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:35:7: Error: Method not found: 'Missing'.
-  new A<C3>.c();
-      ^";
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
 }
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
index 7dad5eb..12ffeef 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.outline.expect
@@ -74,11 +74,18 @@
   constructor internal() → self::A<self::A::T*>*
     ;
   static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
-    let dynamic #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+    return self::B::a<self::A::a::T*>();
   static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
-    let dynamic #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
   static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
-    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -95,9 +102,14 @@
   constructor internal() → self::B<self::B::S*>*
     ;
   static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
-    let dynamic #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+    return new self::C::•<self::B::a::S*>();
   static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
-    let dynamic #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
 }
 class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
   constructor •() → self::C<self::C::U*>*
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
index 93c8bd0..900f8a7 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.transformed.expect
@@ -78,11 +78,18 @@
     : super core::Object::•()
     ;
   static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
-    let <S extends core::Object* = dynamic>() →* self::B<S*>* #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+    return self::B::a<self::A::a::T*>();
   static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
-    let <S extends core::Object* = dynamic>() →* self::B<S*>* #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
   static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
-    let core::String* #redirecting_factory = "Missing" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -100,9 +107,14 @@
     : super self::A::internal()
     ;
   static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
-    let Never #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+    return new self::C::•<self::B::a::S*>();
   static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
-    let Never #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
 }
 class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
   constructor •() → self::C<self::C::U*>*
@@ -111,10 +123,20 @@
 }
 static method main() → dynamic {
   new self::C::•<self::C3*>();
-  new self::C::•<self::C1*>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
   new self::C::•<self::C3*>();
-  new self::C::•<self::C2*>();
-  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:35:7: Error: Method not found: 'Missing'.
-  new A<C3>.c();
-      ^";
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
index 3d0aa6b..1ba20e7 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.expect
@@ -74,7 +74,7 @@
   C.missingFactoryKeyword() = C.constant;
                               ^";
   static factory good() → self::C*
-    let dynamic #redirecting_factory = self::C::constant in invalid-expression;
+    return new self::C::constant();
   method notEvenAConstructor(dynamic a) → self::C*
     return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
index f560daf..49eadbc 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.outline.expect
@@ -36,7 +36,7 @@
   constructor missingFactoryKeyword() → self::C*
     ;
   static factory good() → self::C*
-    let dynamic #redirecting_factory = self::C::constant in invalid-expression;
+    return new self::C::constant();
   method notEvenAConstructor(dynamic a) → self::C*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
index 0a767f0..b3609c5 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.transformed.expect
@@ -74,7 +74,7 @@
   C.missingFactoryKeyword() = C.constant;
                               ^";
   static factory good() → self::C*
-    let Never #redirecting_factory = self::C::constant in invalid-expression;
+    return new self::C::constant();
   method notEvenAConstructor(dynamic a) → self::C*
     return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
index 033c0fd..3f594b7 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.expect
@@ -10,7 +10,7 @@
   constructor •() → self::A*
     : super core::Object::•() {}
   static factory foo() → self::A*
-    let dynamic #redirecting_factory = self::C::bar in invalid-expression;
+    return self::C::bar();
   method m() → core::int* {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -28,7 +28,7 @@
   constructor •() → self::C*
     : super self::A::•() {}
   static factory bar() → self::C*
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   method m() → core::int* {
     return 1;
   }
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
index 7f34682..b498bf4 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   constructor •() → self::A*
     ;
   static factory foo() → self::A*
-    let dynamic #redirecting_factory = self::C::bar in invalid-expression;
+    return self::C::bar();
   method m() → core::int*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -28,7 +28,7 @@
   constructor •() → self::C*
     ;
   static factory bar() → self::C*
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   method m() → core::int*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
index d34604a..3f594b7 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
   constructor •() → self::A*
     : super core::Object::•() {}
   static factory foo() → self::A*
-    let () →* self::C* #redirecting_factory = self::C::bar in invalid-expression;
+    return self::C::bar();
   method m() → core::int* {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -28,7 +28,7 @@
   constructor •() → self::C*
     : super self::A::•() {}
   static factory bar() → self::C*
-    let Never #redirecting_factory = self::D::• in invalid-expression;
+    return new self::D::•();
   method m() → core::int* {
     return 1;
   }
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
index c62b784..89937c2 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.expect
@@ -35,7 +35,9 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
+  factory Supertype() = Unresolved;
+                        ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
index 3c59d21..e164c58 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.outline.expect
@@ -31,7 +31,9 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
+  factory Supertype() = Unresolved;
+                        ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
index a6ad0e6..89937c2 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.transformed.expect
@@ -35,7 +35,9 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let core::String* #redirecting_factory = "Unresolved" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
+  factory Supertype() = Unresolved;
+                        ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
index c2a8e0e..27e321c 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.expect
@@ -19,7 +19,7 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+    return new self::X::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
index 474004e..5198fda 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.outline.expect
@@ -15,7 +15,7 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+    return new self::X::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
index e341499..27e321c 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
 class Supertype extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Supertype::•];
   static factory •() → self::Supertype*
-    let Never #redirecting_factory = self::X::• in invalid-expression;
+    return new self::X::•();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
index 698e95b..6e380a7 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.expect
@@ -22,7 +22,7 @@
     : super self::C::•()
     ;
   static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::B::foo::T*>();
 }
 class C<K extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C::bar];
@@ -30,7 +30,9 @@
     : super core::Object::•()
     ;
   static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
-    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -43,7 +45,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:17:7: Error: Method not found: 'B.foo'.
-  new C.bar();
-      ^";
+  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
 }
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
index 7f77682..b64319b 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.outline.expect
@@ -21,14 +21,16 @@
   constructor •() → self::B<self::B::T*>*
     ;
   static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::B::foo::T*>();
 }
 class C<K extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C::bar];
   constructor •() → self::C<self::C::K*>*
     ;
   static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
-    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
index 68f6e8a..6e380a7 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
     : super self::C::•()
     ;
   static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
-    let Never #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
+    return new self::B::•<self::B::foo::T*>();
 }
 class C<K extends core::Object* = dynamic> extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::C::bar];
@@ -30,7 +30,9 @@
     : super core::Object::•()
     ;
   static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
-    let core::String* #redirecting_factory = "B.foo" in invalid-expression;
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -43,7 +45,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:17:7: Error: Method not found: 'B.foo'.
-  new C.bar();
-      ^";
+  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
 }
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index a74ac1b..4f9feaa 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -99,6 +99,7 @@
 general/override_check_basic: TypeCheckError # Issue #31620
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
+general/redirecting_factory: RuntimeError
 general/redirecting_factory_invocation_in_invalid: TypeCheckError
 general/spread_collection: RuntimeError # Should be fixed as part of implementing spread collection support
 general/type_parameter_type_named_int: RuntimeError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index d6c353b..264d1d2 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -105,6 +105,7 @@
 general/override_check_basic: TypeCheckError # Issue #31620
 general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 general/override_setter_with_field: TypeCheckError
+general/redirecting_factory: RuntimeError
 general/redirecting_factory_invocation_in_invalid: TypeCheckError
 general/spread_collection: RuntimeError
 general/type_parameter_type_named_int: RuntimeError # Expected
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 53ff2cd..401b4ef 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -479,7 +479,7 @@
   @override
   DartType visitInvalidExpression(InvalidExpression node) {
     // Don't type check `node.expression`.
-    return const InvalidType();
+    return const NeverType.nonNullable();
   }
 
   @override
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 15da3e3..81fd808 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,7 @@
+## master
+
+* Add `@UseResult.unless`.
+
 ## 1.7.0
 
 * Restore `TargetKindExtension` and `get displayString`.
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index d776f33..f9e8fe3 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -51,6 +51,12 @@
 
   @override
   defaultMember(Member node) {
+    if (node is Procedure && node.isRedirectingFactory) {
+      // Keep bodies of redirecting factories unchanged because
+      // front-end expects them to have a certain shape.
+      return node;
+    }
+
     _currentMember = node;
     _cachedStaticTypeContext = null;
 
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index d2a4144..3c1a964 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,12 +1,5 @@
 # Changelog
 
-## 7.2.0
-- Update to version `3.50` of the spec.
-- Added `CpuSamples` event kind, and `cpuSamples` property to `Event`.
-- Added `returnType`, `parameters`, and `typeParameters` to `InstanceRef`,
-  and `implicit` to `FunctionRef`.
-- Added `Parameter` type.
-
 ## 7.1.1
 - Update to version `3.48` of the spec.
 - Added `shows` and `hides` properties to `LibraryDependency`.
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 5677862..5aad6b6 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
   A library to communicate with a service implementing the Dart VM
   service protocol.
 
-version: 7.2.0
+version: 7.1.1
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index a40c522..ac183b8 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -70,12 +70,12 @@
     } as_array;
     struct {
       Dart_TypedData_Type type;
-      intptr_t length;
+      intptr_t length; /* in elements, not bytes */
       uint8_t* values;
     } as_typed_data;
     struct {
       Dart_TypedData_Type type;
-      intptr_t length;
+      intptr_t length; /* in elements, not bytes */
       uint8_t* data;
       void* peer;
       Dart_HandleFinalizer callback;
diff --git a/runtime/vm/heap/become_test.cc b/runtime/vm/heap/become_test.cc
index bddba7f..031e497b 100644
--- a/runtime/vm/heap/become_test.cc
+++ b/runtime/vm/heap/become_test.cc
@@ -73,6 +73,63 @@
   EXPECT_EQ(peer, heap->GetPeer(after_obj.ptr()));
 }
 
+ISOLATE_UNIT_TEST_CASE(BecomeForwardObjectId) {
+  Heap* heap = IsolateGroup::Current()->heap();
+
+  const Array& before_obj = Array::Handle(Array::New(0, Heap::kOld));
+  const Array& after_obj = Array::Handle(Array::New(0, Heap::kOld));
+  EXPECT(before_obj.ptr() != after_obj.ptr());
+
+  intptr_t id = 42;
+  intptr_t no_id = 0;
+  heap->SetObjectId(before_obj.ptr(), id);
+  EXPECT_EQ(id, heap->GetObjectId(before_obj.ptr()));
+  EXPECT_EQ(no_id, heap->GetObjectId(after_obj.ptr()));
+
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, before_obj);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, after_obj);
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(before_obj.ptr() == after_obj.ptr());
+  EXPECT_EQ(id, heap->GetObjectId(before_obj.ptr()));
+  EXPECT_EQ(id, heap->GetObjectId(after_obj.ptr()));
+}
+
+ISOLATE_UNIT_TEST_CASE(BecomeForwardMessageId) {
+  Isolate* isolate = Isolate::Current();
+  isolate->set_forward_table_new(new WeakTable());
+  isolate->set_forward_table_old(new WeakTable());
+
+  const Array& before_obj = Array::Handle(Array::New(0, Heap::kOld));
+  const Array& after_obj = Array::Handle(Array::New(0, Heap::kOld));
+  EXPECT(before_obj.ptr() != after_obj.ptr());
+
+  intptr_t id = 42;
+  intptr_t no_id = 0;
+  isolate->forward_table_old()->SetValueExclusive(before_obj.ptr(), id);
+  EXPECT_EQ(id,
+            isolate->forward_table_old()->GetValueExclusive(before_obj.ptr()));
+  EXPECT_EQ(no_id,
+            isolate->forward_table_old()->GetValueExclusive(after_obj.ptr()));
+
+  const Array& before = Array::Handle(Array::New(1, Heap::kOld));
+  before.SetAt(0, before_obj);
+  const Array& after = Array::Handle(Array::New(1, Heap::kOld));
+  after.SetAt(0, after_obj);
+  Become::ElementsForwardIdentity(before, after);
+
+  EXPECT(before_obj.ptr() == after_obj.ptr());
+  EXPECT_EQ(id,
+            isolate->forward_table_old()->GetValueExclusive(before_obj.ptr()));
+  EXPECT_EQ(id,
+            isolate->forward_table_old()->GetValueExclusive(after_obj.ptr()));
+
+  isolate->set_forward_table_new(nullptr);
+  isolate->set_forward_table_old(nullptr);
+}
+
 ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) {
   const String& new_element = String::Handle(String::New("new", Heap::kNew));
   const String& old_element = String::Handle(String::New("old", Heap::kOld));
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 51c2b28..e8b7bc9 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -920,12 +920,21 @@
     }
   }
 
-  // We only come here during hot reload, in which case we assume that none of
-  // the isolates is in the middle of sending messages.
   isolate_group()->ForEachIsolate(
       [&](Isolate* isolate) {
-        RELEASE_ASSERT(isolate->forward_table_new() == nullptr);
-        RELEASE_ASSERT(isolate->forward_table_old() == nullptr);
+        auto before_table = !before_object->IsSmiOrOldObject()
+                                ? isolate->forward_table_new()
+                                : isolate->forward_table_old();
+        if (before_table != nullptr) {
+          intptr_t entry = before_table->RemoveValueExclusive(before_object);
+          if (entry != 0) {
+            auto after_table = !after_object->IsSmiOrOldObject()
+                                   ? isolate->forward_table_new()
+                                   : isolate->forward_table_old();
+            ASSERT(after_table != nullptr);
+            after_table->SetValueExclusive(after_object, entry);
+          }
+        }
       },
       /*at_safepoint=*/true);
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3ef9c62..b1a7315 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2493,25 +2493,6 @@
     ServiceIsolate::SendIsolateShutdownMessage();
 #if !defined(PRODUCT)
     debugger()->Shutdown();
-    // Cleanup profiler state.
-    SampleBlock* cpu_block = current_sample_block();
-    if (cpu_block != nullptr) {
-      cpu_block->release_block();
-    }
-    SampleBlock* allocation_block = current_allocation_sample_block();
-    if (allocation_block != nullptr) {
-      allocation_block->release_block();
-    }
-
-    // Process the previously assigned sample blocks if we're using the
-    // profiler's sample buffer. Some tests create their own SampleBlockBuffer
-    // and handle block processing themselves.
-    if ((cpu_block != nullptr || allocation_block != nullptr) &&
-        Profiler::sample_block_buffer() != nullptr) {
-      StackZone zone(thread);
-      HandleScope handle_scope(thread);
-      Profiler::sample_block_buffer()->ProcessCompletedBlocks();
-    }
 #endif
   }
 
@@ -2570,6 +2551,26 @@
   // requests anymore.
   Thread::ExitIsolate();
 
+#if !defined(PRODUCT)
+  // Cleanup profiler state.
+  SampleBlock* cpu_block = isolate->current_sample_block();
+  if (cpu_block != nullptr) {
+    cpu_block->release_block();
+  }
+  SampleBlock* allocation_block = isolate->current_allocation_sample_block();
+  if (allocation_block != nullptr) {
+    allocation_block->release_block();
+  }
+
+  // Process the previously assigned sample blocks if we're using the
+  // profiler's sample buffer. Some tests create their own SampleBlockBuffer
+  // and handle block processing themselves.
+  if ((cpu_block != nullptr || allocation_block != nullptr) &&
+      Profiler::sample_block_buffer() != nullptr) {
+    Profiler::sample_block_buffer()->ProcessCompletedBlocks();
+  }
+#endif  // !defined(PRODUCT)
+
   // Now it's safe to delete the isolate.
   delete isolate;
 
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index 3eca655..1c5e2db 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -1631,7 +1631,7 @@
       Dart_CObject* data = d->Allocate(Dart_CObject_kTypedData);
       intptr_t length = d->ReadUnsigned();
       data->value.as_typed_data.type = type;
-      data->value.as_typed_data.length = length * element_size;
+      data->value.as_typed_data.length = length;
       if (length == 0) {
         data->value.as_typed_data.values = NULL;
       } else {
@@ -1741,7 +1741,6 @@
   }
 
   void ReadNodesApi(ApiMessageDeserializer* d) {
-    intptr_t element_size = ExternalTypedData::ElementSizeInBytes(cid_);
     Dart_TypedData_Type type;
     switch (cid_) {
       case kExternalTypedDataInt8ArrayCid:
@@ -1796,7 +1795,7 @@
       intptr_t length = d->ReadUnsigned();
       FinalizableData finalizable_data = d->finalizable_data()->Get();
       data->value.as_typed_data.type = type;
-      data->value.as_typed_data.length = length * element_size;
+      data->value.as_typed_data.length = length;
       data->value.as_typed_data.values =
           reinterpret_cast<uint8_t*>(finalizable_data.data);
       d->AssignRef(data);
@@ -1905,7 +1904,6 @@
   }
 
   void PostLoadApi(ApiMessageDeserializer* d) {
-    intptr_t element_size = TypedDataView::ElementSizeInBytes(cid_);
     Dart_TypedData_Type type;
     switch (cid_) {
       case kTypedDataInt8ArrayViewCid:
@@ -1959,22 +1957,10 @@
       if (view->typed_data->type == Dart_CObject_kTypedData) {
         view->type = Dart_CObject_kTypedData;
         view->value.as_typed_data.type = type;
-        //            view->typed_data->value.as_typed_data.type;
-        view->value.as_typed_data.length =
-            view->length->value.as_int32 * element_size;
+        view->value.as_typed_data.length = view->length->value.as_int32;
         view->value.as_typed_data.values =
             view->typed_data->value.as_typed_data.values +
             view->offset_in_bytes->value.as_int32;
-      } else if (view->typed_data->type == Dart_CObject_kExternalTypedData) {
-        UNREACHABLE();  ///???
-        view->type = Dart_CObject_kTypedData;
-        view->value.as_typed_data.type = type;
-        //            view->typed_data->value.as_external_typed_data.type;
-        view->value.as_typed_data.length =
-            view->length->value.as_int32 * element_size;
-        view->value.as_typed_data.values =
-            view->typed_data->value.as_external_typed_data.data +
-            view->offset_in_bytes->value.as_int32;
       } else {
         UNREACHABLE();
       }
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index cdd8783..2436574 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -226,9 +226,7 @@
   int64_t start = Dart_TimelineGetMicros();
   for (intptr_t i = 0; i < capacity_; ++i) {
     SampleBlock* block = &blocks_[i];
-    // Only evict blocks owned by the current thread.
-    if (block->owner() == thread->isolate() && block->is_full() &&
-        !block->evictable()) {
+    if (block->is_full() && !block->evictable()) {
       if (Service::profiler_stream.enabled()) {
         Profile profile(block->owner());
         profile.Build(thread, nullptr, block);
@@ -332,12 +330,8 @@
     isolate->set_current_sample_block(next);
   }
   next->set_is_allocation_block(allocation_sample);
-  bool scheduled = can_process_block_.exchange(true);
-  // We don't process samples on the kernel isolate.
-  if (!isolate->is_kernel_isolate() && !isolate->is_service_isolate() &&
-      !scheduled) {
-    isolate->mutator_thread()->ScheduleInterrupts(Thread::kVMInterrupt);
-  }
+  can_process_block_.store(true);
+  isolate->mutator_thread()->ScheduleInterrupts(Thread::kVMInterrupt);
   return ReserveSampleImpl(isolate, allocation_sample);
 }
 
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 8affadb..9c488ee 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1776,13 +1776,13 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},       {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 512},      {Dart_TypedData_kUint16, 512},
-          {Dart_TypedData_kInt32, 1024},     {Dart_TypedData_kUint32, 1024},
-          {Dart_TypedData_kInt64, 2048},     {Dart_TypedData_kUint64, 2048},
-          {Dart_TypedData_kFloat32, 1024},   {Dart_TypedData_kFloat64, 2048},
-          {Dart_TypedData_kInt32x4, 4096},   {Dart_TypedData_kFloat32x4, 4096},
-          {Dart_TypedData_kFloat64x2, 4096}, {Dart_TypedData_kInvalid, -1}};
+          {Dart_TypedData_kInt8, 256},      {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 256},     {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt32, 256},     {Dart_TypedData_kUint32, 256},
+          {Dart_TypedData_kInt64, 256},     {Dart_TypedData_kUint64, 256},
+          {Dart_TypedData_kFloat32, 256},   {Dart_TypedData_kFloat64, 256},
+          {Dart_TypedData_kInt32x4, 256},   {Dart_TypedData_kFloat32x4, 256},
+          {Dart_TypedData_kFloat64x2, 256}, {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
@@ -1804,31 +1804,31 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},       {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 512},      {Dart_TypedData_kUint16, 512},
-          {Dart_TypedData_kInt32, 1024},     {Dart_TypedData_kUint32, 1024},
-          {Dart_TypedData_kInt64, 2048},     {Dart_TypedData_kUint64, 2048},
-          {Dart_TypedData_kFloat32, 1024},   {Dart_TypedData_kFloat64, 2048},
-          {Dart_TypedData_kInt32x4, 4096},   {Dart_TypedData_kFloat32x4, 4096},
-          {Dart_TypedData_kFloat64x2, 4096},
+          {Dart_TypedData_kInt8, 256},      {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 256},     {Dart_TypedData_kUint16, 256},
+          {Dart_TypedData_kInt32, 256},     {Dart_TypedData_kUint32, 256},
+          {Dart_TypedData_kInt64, 256},     {Dart_TypedData_kUint64, 256},
+          {Dart_TypedData_kFloat32, 256},   {Dart_TypedData_kFloat64, 256},
+          {Dart_TypedData_kInt32x4, 256},   {Dart_TypedData_kFloat32x4, 256},
+          {Dart_TypedData_kFloat64x2, 256},
 
-          {Dart_TypedData_kInt8, 512},       {Dart_TypedData_kUint8, 512},
-          {Dart_TypedData_kInt8, 1024},      {Dart_TypedData_kUint8, 1024},
-          {Dart_TypedData_kInt8, 2048},      {Dart_TypedData_kUint8, 2048},
-          {Dart_TypedData_kInt8, 1024},      {Dart_TypedData_kUint8, 1024},
-          {Dart_TypedData_kInt8, 2048},      {Dart_TypedData_kUint8, 2048},
-          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
-          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
-          {Dart_TypedData_kInt8, 4096},      {Dart_TypedData_kUint8, 4096},
+          {Dart_TypedData_kInt8, 512},      {Dart_TypedData_kUint8, 512},
+          {Dart_TypedData_kInt8, 1024},     {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},     {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 1024},     {Dart_TypedData_kUint8, 1024},
+          {Dart_TypedData_kInt8, 2048},     {Dart_TypedData_kUint8, 2048},
+          {Dart_TypedData_kInt8, 4096},     {Dart_TypedData_kUint8, 4096},
+          {Dart_TypedData_kInt8, 4096},     {Dart_TypedData_kUint8, 4096},
+          {Dart_TypedData_kInt8, 4096},     {Dart_TypedData_kUint8, 4096},
 
-          {Dart_TypedData_kInt16, 256},      {Dart_TypedData_kUint16, 256},
-          {Dart_TypedData_kInt16, 1024},     {Dart_TypedData_kUint16, 1024},
-          {Dart_TypedData_kInt16, 2048},     {Dart_TypedData_kUint16, 2048},
-          {Dart_TypedData_kInt16, 1024},     {Dart_TypedData_kUint16, 1024},
-          {Dart_TypedData_kInt16, 2048},     {Dart_TypedData_kUint16, 2048},
-          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
-          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
-          {Dart_TypedData_kInt16, 4096},     {Dart_TypedData_kUint16, 4096},
+          {Dart_TypedData_kInt16, 128},     {Dart_TypedData_kUint16, 128},
+          {Dart_TypedData_kInt16, 512},     {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt16, 1024},    {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 512},     {Dart_TypedData_kUint16, 512},
+          {Dart_TypedData_kInt16, 1024},    {Dart_TypedData_kUint16, 1024},
+          {Dart_TypedData_kInt16, 2048},    {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 2048},    {Dart_TypedData_kUint16, 2048},
+          {Dart_TypedData_kInt16, 2048},    {Dart_TypedData_kUint16, 2048},
 
           {Dart_TypedData_kInvalid, -1}};
 
@@ -1852,13 +1852,13 @@
         Dart_TypedData_Type type;
         int size;
       } expected[] = {
-          {Dart_TypedData_kInt8, 256},      {Dart_TypedData_kUint8, 256},
-          {Dart_TypedData_kInt16, 256},     {Dart_TypedData_kUint16, 256},
-          {Dart_TypedData_kInt32, 256},     {Dart_TypedData_kUint32, 256},
-          {Dart_TypedData_kInt64, 256},     {Dart_TypedData_kUint64, 256},
-          {Dart_TypedData_kFloat32, 256},   {Dart_TypedData_kFloat64, 256},
-          {Dart_TypedData_kInt32x4, 256},   {Dart_TypedData_kFloat32x4, 256},
-          {Dart_TypedData_kFloat64x2, 256}, {Dart_TypedData_kInvalid, -1}};
+          {Dart_TypedData_kInt8, 256},     {Dart_TypedData_kUint8, 256},
+          {Dart_TypedData_kInt16, 128},    {Dart_TypedData_kUint16, 128},
+          {Dart_TypedData_kInt32, 64},     {Dart_TypedData_kUint32, 64},
+          {Dart_TypedData_kInt64, 32},     {Dart_TypedData_kUint64, 32},
+          {Dart_TypedData_kFloat32, 64},   {Dart_TypedData_kFloat64, 32},
+          {Dart_TypedData_kInt32x4, 16},   {Dart_TypedData_kFloat32x4, 16},
+          {Dart_TypedData_kFloat64x2, 16}, {Dart_TypedData_kInvalid, -1}};
 
       int i = 0;
       while (expected[i].type != Dart_TypedData_kInvalid) {
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 74217b6..09a3b25 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -450,15 +450,11 @@
     }
 
 #if !defined(PRODUCT)
-    // Don't block the kernel isolate to process CPU samples as we can
-    // potentially deadlock when trying to compile source for the main isolate.
-    if (!isolate()->is_kernel_isolate() && !isolate()->is_service_isolate()) {
-      // Processes completed SampleBlocks and sends CPU sample events over the
-      // service protocol when applicable.
-      SampleBlockBuffer* sample_buffer = Profiler::sample_block_buffer();
-      if (sample_buffer != nullptr && sample_buffer->process_blocks()) {
-        sample_buffer->ProcessCompletedBlocks();
-      }
+    // Processes completed SampleBlocks and sends CPU sample events over the
+    // service protocol when applicable.
+    SampleBlockBuffer* sample_buffer = Profiler::sample_block_buffer();
+    if (sample_buffer != nullptr && sample_buffer->process_blocks()) {
+      sample_buffer->ProcessCompletedBlocks();
     }
 #endif  // !defined(PRODUCT)
   }
diff --git a/tests/language/constructor/default_factory2_test.dart b/tests/language/constructor/default_factory2_test.dart
index a8b56b8..3de8111 100644
--- a/tests/language/constructor/default_factory2_test.dart
+++ b/tests/language/constructor/default_factory2_test.dart
@@ -22,6 +22,4 @@
 
 main() {
   var result = new IA<String>();
-  //               ^
-  // [cfe] Type argument 'String' doesn't conform to the bound 'Foo' of the type variable 'T' on 'A'.
 }
diff --git a/tests/language/factory/factory_test.dart b/tests/language/factory/factory_test.dart
index 7b0c2a8..56987b9 100644
--- a/tests/language/factory/factory_test.dart
+++ b/tests/language/factory/factory_test.dart
@@ -54,10 +54,7 @@
   LinkFactory._();
 }
 
-
 main() {
   FactoryTest.testMain();
   var a = new Link<int>.create();
-  //          ^
-  // [cfe] Expected 0 type arguments.
 }
diff --git a/tests/language/factory/redirection3_cyclic_test.dart b/tests/language/factory/redirection3_cyclic_test.dart
index ab115cc..289d71b 100644
--- a/tests/language/factory/redirection3_cyclic_test.dart
+++ b/tests/language/factory/redirection3_cyclic_test.dart
@@ -6,8 +6,6 @@
 
 class A {
   factory A.foo() = B;
-  //      ^
-  // [cfe] Cyclic definition of factory 'A.foo'.
 }
 
 class B implements A {
@@ -16,9 +14,13 @@
 
 class C implements B {
   factory C.bar() = C.foo;
+  //      ^
+  // [cfe] Cyclic definition of factory 'C.bar'.
   //                ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
   factory C.foo() = C.bar();
+  //      ^
+  // [cfe] Cyclic definition of factory 'C.foo'.
   //                ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
   //                  ^^^
diff --git a/tests/language/interface/interface_test.dart b/tests/language/interface/interface_test.dart
index b05e0a6..1a825cb 100644
--- a/tests/language/interface/interface_test.dart
+++ b/tests/language/interface/interface_test.dart
@@ -9,7 +9,7 @@
 
 abstract class Bi implements Ai {
   factory Bi() = InterfaceTest;
-  //      ^
+  //             ^
   // [cfe] Factory redirects to class 'InterfaceTest', which is abstract and can't be instantiated.
   //             ^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR
diff --git a/tests/language/redirecting/factory_malbounded_test.dart b/tests/language/redirecting/factory_malbounded_test.dart
index 29dd27875..e930ff7 100644
--- a/tests/language/redirecting/factory_malbounded_test.dart
+++ b/tests/language/redirecting/factory_malbounded_test.dart
@@ -11,10 +11,7 @@
   Foo.create() {}
 }
 
-class Bar<
-    T
-            extends num
-    > extends Foo<T> {
+class Bar<T extends num> extends Foo<T> {
   factory Bar() {
     return new Bar<T>.create();
   }
@@ -24,6 +21,4 @@
 
 main() {
   new Foo<String>();
-  //  ^
-  // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Bar'.
 }
diff --git a/tests/language/regress/regress23038_test.dart b/tests/language/regress/regress23038_test.dart
index 0967098..15e6699 100644
--- a/tests/language/regress/regress23038_test.dart
+++ b/tests/language/regress/regress23038_test.dart
@@ -11,7 +11,6 @@
     = C<C<T>>
     //^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
-    // [cfe] The constructor function type 'C<C<T>> Function()' isn't a subtype of 'C<T> Function()'.
   ;
 }
 
diff --git a/tests/language_2/constructor/default_factory2_test.dart b/tests/language_2/constructor/default_factory2_test.dart
index 905b695..cb3de6f 100644
--- a/tests/language_2/constructor/default_factory2_test.dart
+++ b/tests/language_2/constructor/default_factory2_test.dart
@@ -22,6 +22,4 @@
 
 main() {
   var result = new IA<String>();
-  //               ^
-  // [cfe] Type argument 'String' doesn't conform to the bound 'Foo' of the type variable 'T' on 'A'.
 }
diff --git a/tests/language_2/factory/factory_test.dart b/tests/language_2/factory/factory_test.dart
index 423d390..81f556a 100644
--- a/tests/language_2/factory/factory_test.dart
+++ b/tests/language_2/factory/factory_test.dart
@@ -54,10 +54,7 @@
   }
 }
 
-
 main() {
   FactoryTest.testMain();
   var a = new Link<int>.create();
-  //          ^
-  // [cfe] Expected 0 type arguments.
 }
diff --git a/tests/language_2/factory/redirection3_cyclic_test.dart b/tests/language_2/factory/redirection3_cyclic_test.dart
index 5b37ba0..2f36594 100644
--- a/tests/language_2/factory/redirection3_cyclic_test.dart
+++ b/tests/language_2/factory/redirection3_cyclic_test.dart
@@ -8,8 +8,6 @@
 
 class A {
   factory A.foo() = B;
-  //      ^
-  // [cfe] Cyclic definition of factory 'A.foo'.
 }
 
 class B implements A {
@@ -18,9 +16,13 @@
 
 class C implements B {
   factory C.bar() = C.foo;
+  //      ^
+  // [cfe] Cyclic definition of factory 'C.bar'.
   //                ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
   factory C.foo() = C.bar();
+  //      ^
+  // [cfe] Cyclic definition of factory 'C.foo'.
   //                ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
   //                  ^^^
diff --git a/tests/language_2/interface/interface_test.dart b/tests/language_2/interface/interface_test.dart
index 9bc7abd..61033fe 100644
--- a/tests/language_2/interface/interface_test.dart
+++ b/tests/language_2/interface/interface_test.dart
@@ -11,7 +11,7 @@
 
 abstract class Bi implements Ai {
   factory Bi() = InterfaceTest;
-  //      ^
+  //             ^
   // [cfe] Factory redirects to class 'InterfaceTest', which is abstract and can't be instantiated.
   //             ^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR
diff --git a/tests/language_2/redirecting/factory_malbounded_test.dart b/tests/language_2/redirecting/factory_malbounded_test.dart
index d22972f..24225b7 100644
--- a/tests/language_2/redirecting/factory_malbounded_test.dart
+++ b/tests/language_2/redirecting/factory_malbounded_test.dart
@@ -13,10 +13,7 @@
   Foo.create() {}
 }
 
-class Bar<
-    T
-            extends num
-    > extends Foo<T> {
+class Bar<T extends num> extends Foo<T> {
   factory Bar() {
     return new Bar<T>.create();
   }
@@ -26,6 +23,4 @@
 
 main() {
   new Foo<String>();
-  //  ^
-  // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Bar'.
 }
diff --git a/tests/language_2/regress/regress23038_test.dart b/tests/language_2/regress/regress23038_test.dart
index 0b861e1..605f629 100644
--- a/tests/language_2/regress/regress23038_test.dart
+++ b/tests/language_2/regress/regress23038_test.dart
@@ -13,7 +13,6 @@
     = C<C<T>>
     //^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_CONSTRUCTOR_REDIRECT
-    // [cfe] The constructor function type 'C<C<T>> Function()' isn't a subtype of 'C<T> Function()'.
   ;
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index b40e8cf..58a7755 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 380
+PRERELEASE 381
 PRERELEASE_PATCH 0
\ No newline at end of file