diff --git a/DEPS b/DEPS
index 9d89269..4799c7d 100644
--- a/DEPS
+++ b/DEPS
@@ -110,7 +110,7 @@
   "dart_style_rev": "d7b73536a8079331c888b7da539b80e6825270ea",
 
   "dartdoc_rev" : "334072b0cad436c05f6bcecf8a1a59f2f0809b84",
-  "devtools_rev" : "65c40d3f6b3dd03411cb8f4b0c0b1ecaa9148f26",
+  "devtools_rev" : "2a707ca56c1a9d5eeef212c28c573548a051fdd2",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
   "file_rev": "1ebc38852ffed24b564910317982298b56c2cedd",
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
index ac0df68..4522ffc 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/utilities/extensions/range_factory.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
@@ -136,15 +137,49 @@
     await builder.addDartFileEdit(file, (builder) {
       // Convert the parameters.
       for (var parameterData in allParameters) {
+        var keyword = parameterData.finalKeyword;
+
+        void insertSuper() {
+          if (keyword == null) {
+            builder.addSimpleInsertion(parameterData.nameOffset, 'super.');
+          } else {
+            var tokenAfterKeyword = keyword.next!;
+            if (tokenAfterKeyword.offset == parameterData.nameOffset) {
+              builder.addSimpleReplacement(
+                  range.startStart(keyword, tokenAfterKeyword), 'super.');
+            } else {
+              builder.addDeletion(range.startStart(keyword, tokenAfterKeyword));
+              builder.addSimpleInsertion(parameterData.nameOffset, 'super.');
+            }
+          }
+        }
+
         var typeToDelete = parameterData.typeToDelete;
         if (typeToDelete == null) {
-          builder.addSimpleInsertion(parameterData.nameOffset, 'super.');
+          insertSuper();
         } else {
           var primaryRange = typeToDelete.primaryRange;
           if (primaryRange == null) {
+            // This only happens when the type is an inline function type with
+            // no return type, such as `f(int i)`. Inline function types can't
+            // have a `final` keyword unless there's an error in the code.
             builder.addSimpleInsertion(parameterData.nameOffset, 'super.');
           } else {
-            builder.addSimpleReplacement(primaryRange, 'super.');
+            if (keyword == null) {
+              builder.addSimpleReplacement(primaryRange, 'super.');
+            } else {
+              var tokenAfterKeyword = keyword.next!;
+              if (tokenAfterKeyword.offset == primaryRange.offset) {
+                builder.addSimpleReplacement(
+                    range.startOffsetEndOffset(
+                        keyword.offset, primaryRange.end),
+                    'super.');
+              } else {
+                builder
+                    .addDeletion(range.startStart(keyword, tokenAfterKeyword));
+                builder.addSimpleReplacement(primaryRange, 'super.');
+              }
+            }
           }
           var parameterRange = typeToDelete.parameterRange;
           if (parameterRange != null) {
@@ -200,20 +235,24 @@
     if (!typeSystem.isSubtypeOf(thisType, superType)) {
       return null;
     }
-    var identifier = parameter.parameter.identifier;
+
+    var parameterNode = parameter.parameter;
+    var identifier = parameterNode.identifier;
     if (identifier == null) {
       // This condition should never occur, but the test is here to promote the
       // type.
       return null;
     }
+
     // Return the data.
     return _ParameterData(
       argumentIndex: argumentIndex,
-      defaultValueRange: _defaultValueRange(
-          parameter.parameter, superParameter, parameter.element),
+      defaultValueRange:
+          _defaultValueRange(parameterNode, superParameter, parameter.element),
+      finalKeyword: _finalKeyword(parameterNode),
       nameOffset: identifier.offset,
       parameterIndex: parameter.index,
-      typeToDelete: superType == thisType ? _type(parameter.parameter) : null,
+      typeToDelete: superType == thisType ? _type(parameterNode) : null,
     );
   }
 
@@ -235,6 +274,21 @@
     return null;
   }
 
+  /// Return data about the type annotation on the [parameter]. This is the
+  /// information about the ranges of text that need to be removed in order to
+  /// remove the type annotation.
+  Token? _finalKeyword(FormalParameter parameter) {
+    if (parameter is DefaultFormalParameter) {
+      return _finalKeyword(parameter.parameter);
+    } else if (parameter is SimpleFormalParameter) {
+      var keyword = parameter.keyword;
+      if (keyword?.type == Keyword.FINAL) {
+        return keyword;
+      }
+    }
+    return null;
+  }
+
   /// Return the constructor to be converted, or `null` if the cursor is not on
   /// the name of a constructor.
   ConstructorDeclaration? _findConstructor() {
@@ -376,6 +430,10 @@
 
 /// Information used to convert a single parameter.
 class _ParameterData {
+  /// The `final` keyword on the parameter, or `null` if there is no `final`
+  /// keyword.
+  final Token? finalKeyword;
+
   /// The type annotation that should be deleted from the parameter list, or
   /// `null` if there is no type annotation to delete or if the type should not
   /// be deleted.
@@ -397,7 +455,8 @@
 
   /// Initialize a newly create data object.
   _ParameterData(
-      {required this.typeToDelete,
+      {required this.finalKeyword,
+      required this.typeToDelete,
       required this.nameOffset,
       required this.defaultValueRange,
       required this.parameterIndex,
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
index 1bf7f74..1af8888 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
@@ -164,6 +164,70 @@
 ''');
   }
 
+  Future<void> test_final_named_withoutType() async {
+    await resolveTestCode('''
+class A {
+  A({required int x});
+}
+class B extends A {
+  B({required final x}) : super(x: x);
+}
+''');
+    // `dynamic` is not a subtype of `int`
+    await assertNoAssistAt('B(');
+  }
+
+  Future<void> test_final_named_withType() async {
+    await resolveTestCode('''
+class A {
+  A({required int x});
+}
+class B extends A {
+  B({required final int x}) : super(x: x);
+}
+''');
+    await assertHasAssistAt('B(', '''
+class A {
+  A({required int x});
+}
+class B extends A {
+  B({required super.x});
+}
+''');
+  }
+
+  Future<void> test_final_positional_withoutType() async {
+    await resolveTestCode('''
+class A {
+  A(int x);
+}
+class B extends A {
+  B(final x) : super(x);
+}
+''');
+    // `dynamic` is not a subtype of `int`
+    await assertNoAssistAt('B(');
+  }
+
+  Future<void> test_final_positional_withType() async {
+    await resolveTestCode('''
+class A {
+  A(int x);
+}
+class B extends A {
+  B(final int x) : super(x);
+}
+''');
+    await assertHasAssistAt('B(', '''
+class A {
+  A(int x);
+}
+class B extends A {
+  B(super.x);
+}
+''');
+  }
+
   Future<void> test_functionTypedFormalParameter() async {
     await resolveTestCode('''
 class A {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 55ad35e..6a7da07 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -112,6 +112,7 @@
   static const String reportAllMetrics = '--report-all-metrics';
 
   static const String dillDependencies = '--dill-dependencies';
+  static const String sources = '--sources';
   static const String readData = '--read-data';
   static const String writeData = '--write-data';
   static const String noClosedWorldInData = '--no-closed-world-in-data';
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 029efeb..62f3328 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -23,7 +23,6 @@
 import 'deferred_load/program_split_constraints/nodes.dart' as psc
     show ConstraintData;
 import 'deferred_load/program_split_constraints/parser.dart' as psc show Parser;
-import 'diagnostics/code_location.dart';
 import 'diagnostics/messages.dart' show Message;
 import 'dump_info.dart' show DumpInfoTask;
 import 'elements/entities.dart';
@@ -87,8 +86,6 @@
 
   api.CompilerOutput get outputProvider => _outputProvider;
 
-  final List<CodeLocation> _userCodeLocations = <CodeLocation>[];
-
   ir.Component componentForTesting;
   JClosedWorld backendClosedWorldForTesting;
   DataSourceIndices closedWorldIndicesForTesting;
@@ -413,10 +410,7 @@
         }
         await serializationTask.serializeComponent(component);
       }
-      // We currently do not return the trimmed component from [produceKernel]
-      // because downstream phases, in particular modular analysis, currently
-      // depend on the untrimmed dill.
-      return output;
+      return output.withNewComponent(component);
     } else {
       ir.Component component =
           await serializationTask.deserializeComponentAndUpdateOptions();
@@ -431,8 +425,6 @@
       load_kernel.Output output, Set<Uri> moduleLibraries) async {
     ir.Component component = output.component;
     List<Uri> libraries = output.libraries;
-    _userCodeLocations
-        .addAll(moduleLibraries.map((module) => CodeLocation(module)));
     final input = modular_analysis.Input(
         options, reporter, environment, component, libraries, moduleLibraries);
     return await selfTask.measureSubtask(
@@ -541,7 +533,6 @@
     if (options.readClosedWorldUri == null) {
       Uri rootLibraryUri = output.rootLibraryUri;
       Iterable<Uri> libraries = output.libraries;
-      _userCodeLocations.add(CodeLocation(rootLibraryUri));
       JsClosedWorld closedWorld =
           computeClosedWorld(component, moduleData, rootLibraryUri, libraries);
       closedWorldAndIndices = ClosedWorldAndIndices(closedWorld, null);
@@ -819,38 +810,9 @@
     }
   }
 
-  /// Helper for determining whether the current element is declared within
-  /// 'user code'.
-  ///
-  /// See [inUserCode] for what defines 'user code'.
-  bool currentlyInUserCode() {
-    return inUserCode(currentElement);
-  }
-
   /// Helper for determining whether [element] is declared within 'user code'.
-  ///
-  /// What constitutes 'user code' is defined by the URI(s) provided by the
-  /// entry point(s) of compilation or analysis:
-  ///
-  /// If an entrypoint URI uses the 'package' scheme then every library from
-  /// that same package is considered to be in user code. For instance, if
-  /// an entry point URI is 'package:foo/bar.dart' then every library whose
-  /// canonical URI starts with 'package:foo/' is in user code.
-  ///
-  /// If an entrypoint URI uses another scheme than 'package' then every library
-  /// with that scheme is in user code. For instance, an entry point URI is
-  /// 'file:///foo.dart' then every library whose canonical URI scheme is
-  /// 'file' is in user code.
-  ///
-  /// If [assumeInUserCode] is `true`, [element] is assumed to be in user code
-  /// if no entrypoints have been set.
-  bool inUserCode(Entity element, {bool assumeInUserCode = false}) {
-    if (element == null) return assumeInUserCode;
-    Uri libraryUri = _uriFromElement(element);
-    if (libraryUri == null) return false;
-    if (_userCodeLocations.isEmpty && assumeInUserCode) return true;
-    return _userCodeLocations.any(
-        (CodeLocation codeLocation) => codeLocation.inSameLocation(libraryUri));
+  bool inUserCode(Entity element) {
+    return element == null || _uriFromElement(element) != null;
   }
 
   /// Return a canonical URI for the source of [element].
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index b78f0fc..f323ee3 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -133,6 +133,7 @@
   bool showWarnings;
   bool showHints;
   bool enableColors;
+  List<Uri> sources;
   int optimizationLevel = null;
   Uri platformBinaries;
   Map<String, String> environment = Map<String, String>();
@@ -289,11 +290,12 @@
         Uri.base.resolve(extractPath(argument, isDirectory: true));
   }
 
-  void setUriList(String flag, String argument) {
+  List<Uri> setUriList(String flag, String argument) {
     String list = extractParameter(argument);
-    String uriList = list.splitMapJoin(',',
-        onMatch: (_) => ',', onNonMatch: (p) => '${fe.nativeToUri(p)}');
+    List<Uri> uris = list.split(',').map(fe.nativeToUri).toList();
+    String uriList = uris.map((uri) => '$uri').join(',');
     options.add('${flag}=${uriList}');
+    return uris;
   }
 
   void setModularAnalysisInputs(String argument) {
@@ -361,6 +363,10 @@
     setUriList(Flags.dillDependencies, argument);
   }
 
+  void setSources(String argument) {
+    sources = setUriList(Flags.sources, argument);
+  }
+
   void setCfeOnly(String argument) {
     if (writeStrategy == WriteStrategy.toModularAnalysis) {
       fail("Cannot use ${Flags.cfeOnly} "
@@ -547,6 +553,7 @@
     OptionHandler('--library-root=.+', ignoreOption),
     OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
     OptionHandler('${Flags.dillDependencies}=.+', setDillDependencies),
+    OptionHandler('${Flags.sources}=.+', setSources),
     OptionHandler('${Flags.readModularAnalysis}=.+', setModularAnalysisInputs),
     OptionHandler(
         '${Flags.writeModularAnalysis}|${Flags.writeModularAnalysis}=.+',
@@ -761,7 +768,10 @@
     helpAndExit(wantHelp, wantVersion, diagnosticHandler.verbose);
   }
 
-  if (arguments.isEmpty && entryUri == null && inputDillUri == null) {
+  if (arguments.isEmpty &&
+      entryUri == null &&
+      inputDillUri == null &&
+      sources == null) {
     helpAndFail('No Dart file specified.');
   }
 
@@ -787,8 +797,11 @@
   }
 
   // Make [scriptName] a relative path..
-  String scriptName =
-      fe.relativizeUri(Uri.base, inputDillUri ?? entryUri, Platform.isWindows);
+  String scriptName = sources == null
+      ? fe.relativizeUri(Uri.base, inputDillUri ?? entryUri, Platform.isWindows)
+      : sources
+          .map((uri) => fe.relativizeUri(Uri.base, uri, Platform.isWindows))
+          .join(',');
 
   switch (writeStrategy) {
     case WriteStrategy.toJs:
diff --git a/pkg/compiler/lib/src/diagnostics/code_location.dart b/pkg/compiler/lib/src/diagnostics/code_location.dart
deleted file mode 100644
index 515f359..0000000
--- a/pkg/compiler/lib/src/diagnostics/code_location.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2012, 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.
-
-library dart2js.diagnostics.code_location;
-
-import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-
-/// [CodeLocation] divides uris into different classes.
-///
-/// These are used to group uris from user code, platform libraries and
-/// packages.
-abstract class CodeLocation {
-  /// Returns `true` if [uri] is in this code location.
-  bool inSameLocation(Uri uri);
-
-  /// Returns the uri of this location relative to [baseUri].
-  String relativize(Uri baseUri);
-
-  factory CodeLocation(Uri uri) {
-    if (uri.isScheme('package')) {
-      int slashPos = uri.path.indexOf('/');
-      if (slashPos != -1) {
-        String packageName = uri.path.substring(0, slashPos);
-        return PackageLocation(packageName);
-      } else {
-        return UriLocation(uri);
-      }
-    } else {
-      return SchemeLocation(uri);
-    }
-  }
-}
-
-/// A code location defined by the scheme of the uri.
-///
-/// Used for non-package uris, such as 'dart', 'file', and 'http'.
-class SchemeLocation implements CodeLocation {
-  final Uri uri;
-
-  SchemeLocation(this.uri);
-
-  @override
-  bool inSameLocation(Uri uri) {
-    return this.uri.isScheme(uri.scheme);
-  }
-
-  @override
-  String relativize(Uri baseUri) {
-    return fe.relativizeUri(baseUri, uri, false);
-  }
-}
-
-/// A code location defined by the package name.
-///
-/// Used for package uris, separated by their `package names`, that is, the
-/// 'foo' of 'package:foo/bar.dart'.
-class PackageLocation implements CodeLocation {
-  final String packageName;
-
-  PackageLocation(this.packageName);
-
-  @override
-  bool inSameLocation(Uri uri) {
-    return uri.isScheme('package') && uri.path.startsWith('$packageName/');
-  }
-
-  @override
-  String relativize(Uri baseUri) => 'package:$packageName';
-}
-
-/// A code location defined by the whole uri.
-///
-/// Used for package uris with no package name. For instance 'package:foo.dart'.
-class UriLocation implements CodeLocation {
-  final Uri uri;
-
-  UriLocation(this.uri);
-
-  @override
-  bool inSameLocation(Uri uri) => this.uri == uri;
-
-  @override
-  String relativize(Uri baseUri) {
-    return fe.relativizeUri(baseUri, uri, false);
-  }
-}
-
-/// A code location that contains any uri.
-class AnyLocation implements CodeLocation {
-  const AnyLocation();
-
-  @override
-  bool inSameLocation(Uri uri) => true;
-
-  @override
-  String relativize(Uri baseUri) => '$baseUri';
-}
diff --git a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
index 4b895a4..5fab3db 100644
--- a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
+++ b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
@@ -90,7 +90,7 @@
         case api.Diagnostic.WARNING:
         case api.Diagnostic.HINT:
           Entity element = _elementFromSpannable(message.spannable);
-          if (!_compiler.inUserCode(element, assumeInUserCode: true)) {
+          if (!_compiler.inUserCode(element)) {
             Uri uri = _compiler.getCanonicalUri(element);
             if (options.showPackageWarningsFor(uri)) {
               _reportDiagnostic(message, infos, kind);
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index b24e672..554f833 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -171,6 +171,7 @@
   Uri? get compilationTarget => inputDillUri ?? entryUri;
 
   bool get fromDill {
+    if (sources != null) return false;
     var targetPath = compilationTarget!.path;
     return targetPath.endsWith('.dill');
   }
@@ -191,6 +192,9 @@
   /// files for linking.
   List<Uri>? dillDependencies;
 
+  /// A list of sources to compile, only used for modular analysis.
+  List<Uri>? sources;
+
   Uri? writeModularAnalysisUri;
 
   /// Helper to determine if compiler is being run just for modular analysis.
@@ -676,6 +680,7 @@
       ..showInternalProgress = _hasOption(options, Flags.progress)
       ..dillDependencies =
           _extractUriListOption(options, '${Flags.dillDependencies}')
+      ..sources = _extractUriListOption(options, '${Flags.sources}')
       ..readProgramSplit =
           _extractUriOption(options, '${Flags.readProgramSplit}=')
       ..writeModularAnalysisUri =
diff --git a/pkg/compiler/lib/src/phase/load_kernel.dart b/pkg/compiler/lib/src/phase/load_kernel.dart
index 44314a7..e16d5fb 100644
--- a/pkg/compiler/lib/src/phase/load_kernel.dart
+++ b/pkg/compiler/lib/src/phase/load_kernel.dart
@@ -64,6 +64,9 @@
 
   final fe.InitializedCompilerState initializedCompilerState;
 
+  Output withNewComponent(ir.Component component) => Output(component,
+      rootLibraryUri, libraries, moduleLibraries, initializedCompilerState);
+
   Output(this.component, this.rootLibraryUri, this.libraries,
       this.moduleLibraries, this.initializedCompilerState);
 }
@@ -195,8 +198,10 @@
 class _LoadFromSourceResult {
   final ir.Component component;
   final fe.InitializedCompilerState initializedCompilerState;
+  final List<Uri> moduleLibraries;
 
-  _LoadFromSourceResult(this.component, this.initializedCompilerState);
+  _LoadFromSourceResult(
+      this.component, this.initializedCompilerState, this.moduleLibraries);
 }
 
 Future<_LoadFromSourceResult> _loadFromSource(
@@ -215,21 +220,36 @@
       reportFrontEndMessage(reporter, message);
     }
   };
-  fe.CompilerOptions feOptions = fe.CompilerOptions()
-    ..target = target
-    ..librariesSpecificationUri = options.librariesSpecificationUri
-    ..packagesFileUri = options.packageConfig
-    ..explicitExperimentalFlags = options.explicitExperimentalFlags
-    ..verbose = verbose
-    ..fileSystem = fileSystem
-    ..onDiagnostic = onDiagnostic
-    ..verbosity = verbosity;
-  Uri resolvedUri = options.compilationTarget;
-  bool isLegacy = await fe.uriUsesLegacyLanguageVersion(resolvedUri, feOptions);
-  _inferNullSafetyMode(options, !isLegacy);
 
+  // If we are passed a list of sources, then we are performing a modular
+  // compile. In this case, we cannot infer null safety from the source files
+  // and must instead rely on the options passed in on the command line.
+  bool isModularCompile = false;
+  List<Uri> sources = [];
+  if (options.sources != null) {
+    isModularCompile = true;
+    sources.addAll(options.sources);
+  } else {
+    fe.CompilerOptions feOptions = fe.CompilerOptions()
+      ..target = target
+      ..librariesSpecificationUri = options.librariesSpecificationUri
+      ..packagesFileUri = options.packageConfig
+      ..explicitExperimentalFlags = options.explicitExperimentalFlags
+      ..verbose = verbose
+      ..fileSystem = fileSystem
+      ..onDiagnostic = onDiagnostic
+      ..verbosity = verbosity;
+    Uri resolvedUri = options.compilationTarget;
+    bool isLegacy =
+        await fe.uriUsesLegacyLanguageVersion(resolvedUri, feOptions);
+    _inferNullSafetyMode(options, !isLegacy);
+    sources.add(options.compilationTarget);
+  }
+
+  // If we are performing a modular compile, we expect the platform binary to be
+  // supplied along with other dill dependencies.
   List<Uri> dependencies = [];
-  if (options.platformBinaries != null) {
+  if (options.platformBinaries != null && !isModularCompile) {
     dependencies.add(options.platformBinaries
         .resolve(_getPlatformFilename(options, targetName)));
   }
@@ -248,10 +268,17 @@
           options.useLegacySubtyping ? fe.NnbdMode.Weak : fe.NnbdMode.Strong,
       invocationModes: options.cfeInvocationModes,
       verbosity: verbosity);
-  ir.Component component = await fe.compile(
-      initializedCompilerState, verbose, fileSystem, onDiagnostic, resolvedUri);
+  ir.Component component = await fe.compile(initializedCompilerState, verbose,
+      fileSystem, onDiagnostic, sources, isModularCompile);
   _validateNullSafetyMode(options);
-  return _LoadFromSourceResult(component, initializedCompilerState);
+
+  // We have to compute canonical names on the component here to avoid missing
+  // canonical names downstream.
+  if (isModularCompile) {
+    component.computeCanonicalNames();
+  }
+  return _LoadFromSourceResult(
+      component, initializedCompilerState, isModularCompile ? sources : []);
 }
 
 Output _createOutput(
@@ -336,6 +363,7 @@
         reporter, input.initializedCompilerState, targetName);
     component = result.component;
     initializedCompilerState = result.initializedCompilerState;
+    moduleLibraries = result.moduleLibraries;
   }
   if (component == null) return null;
   if (input.forceSerialization) {
diff --git a/pkg/compiler/test/end_to_end/no_platform_test.dart b/pkg/compiler/test/end_to_end/no_platform_test.dart
index 00578fc..e786f3f 100644
--- a/pkg/compiler/test/end_to_end/no_platform_test.dart
+++ b/pkg/compiler/test/end_to_end/no_platform_test.dart
@@ -30,7 +30,8 @@
         (fe.DiagnosticMessage message) {
       message.plainTextFormatted.forEach(print);
       Expect.notEquals(fe.Severity.error, message.severity);
-    }, Uri.base.resolve('pkg/compiler/test/end_to_end/data/hello_world.dart'));
+    }, [Uri.base.resolve('pkg/compiler/test/end_to_end/data/hello_world.dart')],
+        false);
     Expect.isNotNull(new ir.CoreTypes(component).futureClass);
   }
 
diff --git a/pkg/compiler/test/end_to_end/trim_component_test.dart b/pkg/compiler/test/end_to_end/trim_component_test.dart
new file mode 100644
index 0000000..3673cbf
--- /dev/null
+++ b/pkg/compiler/test/end_to_end/trim_component_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+import '../helpers/memory_compiler.dart';
+
+const memorySourceFiles = const {
+  'main.dart': '''
+// @dart=2.12
+import 'used.dart';
+
+void main() {
+  foo();
+}
+
+''',
+  'used.dart': '''
+// @dart=2.12
+
+void foo() {
+  print('foo');
+}
+''',
+  'unused.dart': '''
+// @dart=2.12
+
+void unused() {
+  throw 'unused';
+}
+'''
+};
+
+void verifyComponent(
+    ir.Component component, List<String> included, List<String> excluded) {
+  Set<String> uris = {};
+  component.libraries
+      .forEach((library) => uris.add(library.importUri.toString()));
+  for (String include in included) {
+    Expect.isTrue(uris.contains(include));
+  }
+  for (String exclude in excluded) {
+    Expect.isFalse(uris.contains(exclude));
+  }
+}
+
+Future<List<int>> buildDillAndVerify(
+    Map<String, dynamic> memorySourceFiles,
+    List<String> flags,
+    List<String> includedLibraries,
+    List<String> excludedLibraries) async {
+  final dillUri = Uri.parse('out.dill');
+  final collector = OutputCollector();
+  CompilationResult result = await runCompiler(
+      memorySourceFiles: memorySourceFiles,
+      options: flags,
+      outputProvider: collector);
+  Expect.isTrue(result.isSuccess);
+  Expect.isTrue(collector.binaryOutputMap.containsKey(dillUri));
+  List<int> bytes = collector.binaryOutputMap[dillUri].list;
+  Expect.isTrue(bytes.isNotEmpty);
+  ir.Component component = ir.Component();
+  BinaryBuilder(bytes).readComponent(component);
+  verifyComponent(component, includedLibraries, excludedLibraries);
+  return bytes;
+}
+
+void verifyComponentTrim() async {
+  List<String> buildDillFromSourceFlags = [
+    '--cfe-only',
+    '--out=out.dill',
+    '--sources=memory:main.dart,memory:used.dart,memory:unused.dart',
+    '--sound-null-safety',
+  ];
+  List<int> bytes = await buildDillAndVerify(
+      memorySourceFiles,
+      buildDillFromSourceFlags,
+      ['memory:main.dart', 'memory:used.dart', 'memory:unused.dart'],
+      []);
+
+  // The combination of `--cfe-only` + `--entry-uri` should trigger the
+  // component trimming logic.
+  List<String> trimDillFlags = [
+    '--input-dill=memory:main.dill',
+    '--cfe-only',
+    '--out=out.dill',
+    '--entry-uri=main.dart',
+    '--sound-null-safety',
+  ];
+  List<int> newBytes = await buildDillAndVerify(
+      {'main.dill': bytes},
+      trimDillFlags,
+      ['memory:main.dart', 'memory:used.dart'],
+      ['memory:unused.dart']);
+  Expect.isTrue(newBytes.length < bytes.length);
+}
+
+void main() async {
+  await verifyComponentTrim();
+}
diff --git a/pkg/compiler/test/model/in_user_code_test.dart b/pkg/compiler/test/model/in_user_code_test.dart
deleted file mode 100644
index 81bee9c..0000000
--- a/pkg/compiler/test/model/in_user_code_test.dart
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2014, 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.
-
-// @dart = 2.7
-
-// Test that the helper [Compiler.inUserCode] works as intended.
-
-import 'dart:async';
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-import 'package:compiler/src/compiler.dart' show Compiler;
-import '../helpers/memory_compiler.dart';
-
-const SOURCE = const {
-  'main.dart': """
-library main;
-
-import 'dart:async';
-import 'foo.dart';
-import 'pkg/sub/bar.dart';
-import 'package:sub/bar.dart';
-import 'package:sup/boz.dart';
-
-main() {}
-""",
-  'foo.dart': """
-library foo;
-""",
-  'pkg/sub/bar.dart': """
-library sub.bar;
-
-import 'package:sup/boz.dart';
-import 'baz.dart';
-
-main() {}
-""",
-  'pkg/sub/baz.dart': """
-library sub.baz;
-""",
-  'pkg/sup/boz.dart': """
-library sup.boz;
-""",
-  '.packages': """
-sub:pkg/sub/
-sup:pkg/sup/
-"""
-};
-
-Future test(Uri entryPoint, Map<String, bool> expectedResults) async {
-  print("Test: $entryPoint");
-  CompilationResult result = await runCompiler(
-      entryPoint: entryPoint,
-      memorySourceFiles: SOURCE,
-      packageConfig: Uri.parse('memory:.packages'));
-  Compiler compiler = result.compiler;
-  expectedResults.forEach((String uri, bool expectedResult) {
-    dynamic element = compiler.frontendStrategy.elementEnvironment
-        .lookupLibrary(Uri.parse(uri));
-    Expect.isNotNull(element, "Unknown library '$uri'.");
-    Expect.equals(
-        expectedResult,
-        compiler.inUserCode(element),
-        expectedResult
-            ? "Library '$uri' expected to be in user code"
-            : "Library '$uri' not expected to be in user code");
-  });
-}
-
-void main() {
-  asyncTest(runTests);
-}
-
-Future runTests() async {
-  await test(Uri.parse('memory:main.dart'), {
-    'memory:main.dart': true,
-    'memory:foo.dart': true,
-    'memory:pkg/sub/bar.dart': true,
-    'memory:pkg/sub/baz.dart': true,
-    'package:sub/bar.dart': false,
-    'package:sub/baz.dart': false,
-    'package:sup/boz.dart': false,
-    'dart:core': false,
-    'dart:async': false
-  });
-  await test(Uri.parse('package:sub/bar.dart'), {
-    'package:sub/bar.dart': true,
-    'package:sub/baz.dart': true,
-    'package:sup/boz.dart': false,
-    'dart:core': false
-  });
-}
diff --git a/pkg/compiler/tool/modular_test_suite.dart b/pkg/compiler/tool/modular_test_suite.dart
index cf0d52c..5730ad6 100644
--- a/pkg/compiler/tool/modular_test_suite.dart
+++ b/pkg/compiler/tool/modular_test_suite.dart
@@ -21,7 +21,8 @@
         options,
         IOPipeline([
           OutlineDillCompilationStep(),
-          FullDillCompilationStep(),
+          FullDillCompilationStep(onlyOnSdk: true),
+          ModularAnalysisStep(onlyOnSdk: true),
           ModularAnalysisStep(),
           ConcatenateDillsStep(useModularAnalysis: true),
           ComputeClosedWorldStep(useModularAnalysis: true),
diff --git a/pkg/compiler/tool/modular_test_suite_helper.dart b/pkg/compiler/tool/modular_test_suite_helper.dart
index 357b1da..7398c3d 100644
--- a/pkg/compiler/tool/modular_test_suite_helper.dart
+++ b/pkg/compiler/tool/modular_test_suite_helper.dart
@@ -51,10 +51,95 @@
   return '{${fields.join(',')}}';
 }
 
-abstract class CFEStep implements IOModularStep {
+String getRootScheme(Module module) {
+  // We use non file-URI schemes for representeing source locations in a
+  // root-agnostic way. This allows us to refer to file across modules and
+  // across steps without exposing the underlying temporary folders that are
+  // created by the framework. In build systems like bazel this is especially
+  // important because each step may be run on a different machine.
+  //
+  // Files in packages are defined in terms of `package:` URIs, while
+  // non-package URIs are defined using the `dart-dev-app` scheme.
+  return module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
+}
+
+String sourceToImportUri(Module module, Uri relativeUri) {
+  if (module.isPackage) {
+    var basePath = module.packageBase.path;
+    var packageRelativePath = basePath == "./"
+        ? relativeUri.path
+        : relativeUri.path.substring(basePath.length);
+    return 'package:${module.name}/$packageRelativePath';
+  } else {
+    return '${getRootScheme(module)}:/$relativeUri';
+  }
+}
+
+List<String> getSources(Module module) {
+  return module.sources.map((uri) => sourceToImportUri(module, uri)).toList();
+}
+
+void writePackageConfig(
+    Module module, Set<Module> transitiveDependencies, Uri root) async {
+  // TODO(joshualitt): Figure out a way to support package configs in
+  // tests/modular.
+  var packageConfig = await loadPackageConfigUri(packageConfigUri);
+
+  // We create both a .packages and package_config.json file which defines
+  // the location of this module if it is a package.  The CFE requires that
+  // if a `package:` URI of a dependency is used in an import, then we need
+  // that package entry in the associated file. However, after it checks that
+  // the definition exists, the CFE will not actually use the resolved URI if
+  // a library for the import URI is already found in one of the provide
+  // .dill files of the dependencies. For that reason, and to ensure that
+  // a step only has access to the files provided in a module, we generate a
+  // config file with invalid folders for other packages.
+  // TODO(sigmund): follow up with the CFE to see if we can remove the need
+  // for these dummy entries..
+  // TODO(joshualitt): Generate just the json file.
+  var packagesJson = [];
+  var packagesContents = StringBuffer();
+  if (module.isPackage) {
+    packagesContents.write('${module.name}:${module.packageBase}\n');
+    packagesJson.add(_packageConfigEntry(
+        module.name, Uri.parse('../${module.packageBase}')));
+  }
+
+  int unusedNum = 0;
+  for (Module dependency in transitiveDependencies) {
+    if (dependency.isPackage) {
+      // rootUri should be ignored for dependent modules, so we pass in a
+      // bogus value.
+      var rootUri = Uri.parse('unused$unusedNum');
+      unusedNum++;
+
+      var dependentPackage = packageConfig[dependency.name];
+      var packageJson = dependentPackage == null
+          ? _packageConfigEntry(dependency.name, rootUri)
+          : _packageConfigEntry(dependentPackage.name, rootUri,
+              version: dependentPackage.languageVersion);
+      packagesJson.add(packageJson);
+      packagesContents.write('${dependency.name}:$rootUri\n');
+    }
+  }
+
+  if (module.isPackage) {
+    await File.fromUri(root.resolve(packageConfigJsonPath))
+        .create(recursive: true);
+    await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
+        '  "configVersion": ${packageConfig.version},'
+        '  "packages": [ ${packagesJson.join(',')} ]'
+        '}');
+  }
+
+  await File.fromUri(root.resolve('.packages'))
+      .writeAsString('$packagesContents');
+}
+
+abstract class CFEStep extends IOModularStep {
   final String stepName;
 
-  CFEStep(this.stepName);
+  CFEStep(this.stepName, this.onlyOnSdk);
 
   @override
   bool get needsSources => true;
@@ -63,86 +148,17 @@
   bool get onlyOnMain => false;
 
   @override
+  final bool onlyOnSdk;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print("\nstep: $stepName on $module");
 
-    // TODO(joshualitt): Figure out a way to support package configs in
-    // tests/modular.
-    var packageConfig = await loadPackageConfigUri(packageConfigUri);
-
-    // We use non file-URI schemes for representeing source locations in a
-    // root-agnostic way. This allows us to refer to file across modules and
-    // across steps without exposing the underlying temporary folders that are
-    // created by the framework. In build systems like bazel this is especially
-    // important because each step may be run on a different machine.
-    //
-    // Files in packages are defined in terms of `package:` URIs, while
-    // non-package URIs are defined using the `dart-dev-app` scheme.
-    String rootScheme = module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
-    String sourceToImportUri(Uri relativeUri) {
-      if (module.isPackage) {
-        var basePath = module.packageBase.path;
-        var packageRelativePath = basePath == "./"
-            ? relativeUri.path
-            : relativeUri.path.substring(basePath.length);
-        return 'package:${module.name}/$packageRelativePath';
-      } else {
-        return '$rootScheme:/$relativeUri';
-      }
-    }
-
-    // We create both a .packages and package_config.json file which defines
-    // the location of this module if it is a package.  The CFE requires that
-    // if a `package:` URI of a dependency is used in an import, then we need
-    // that package entry in the associated file. However, after it checks that
-    // the definition exists, the CFE will not actually use the resolved URI if
-    // a library for the import URI is already found in one of the provide
-    // .dill files of the dependencies. For that reason, and to ensure that
-    // a step only has access to the files provided in a module, we generate a
-    // config file with invalid folders for other packages.
-    // TODO(sigmund): follow up with the CFE to see if we can remove the need
-    // for these dummy entries..
-    // TODO(joshualitt): Generate just the json file.
-    var packagesJson = [];
-    var packagesContents = StringBuffer();
-    if (module.isPackage) {
-      packagesContents.write('${module.name}:${module.packageBase}\n');
-      packagesJson.add(_packageConfigEntry(
-          module.name, Uri.parse('../${module.packageBase}')));
-    }
-
     Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    int unusedNum = 0;
-    for (Module dependency in transitiveDependencies) {
-      if (dependency.isPackage) {
-        // rootUri should be ignored for dependent modules, so we pass in a
-        // bogus value.
-        var rootUri = Uri.parse('unused$unusedNum');
-        unusedNum++;
+    writePackageConfig(module, transitiveDependencies, root);
 
-        var dependentPackage = packageConfig[dependency.name];
-        var packageJson = dependentPackage == null
-            ? _packageConfigEntry(dependency.name, rootUri)
-            : _packageConfigEntry(dependentPackage.name, rootUri,
-                version: dependentPackage.languageVersion);
-        packagesJson.add(packageJson);
-        packagesContents.write('${dependency.name}:$rootUri\n');
-      }
-    }
-
-    if (module.isPackage) {
-      await File.fromUri(root.resolve(packageConfigJsonPath))
-          .create(recursive: true);
-      await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
-          '  "configVersion": ${packageConfig.version},'
-          '  "packages": [ ${packagesJson.join(',')} ]'
-          '}');
-    }
-
-    await File.fromUri(root.resolve('.packages'))
-        .writeAsString('$packagesContents');
-
+    String rootScheme = getRootScheme(module);
     List<String> sources;
     List<String> extraArgs = ['--packages-file', '$rootScheme:/.packages'];
     if (module.isSdk) {
@@ -165,7 +181,7 @@
       ];
       assert(transitiveDependencies.isEmpty);
     } else {
-      sources = module.sources.map(sourceToImportUri).toList();
+      sources = getSources(module);
     }
 
     // TODO(joshualitt): Ensure the kernel worker has some way to specify
@@ -228,7 +244,7 @@
   @override
   DataId get outputData => dillSummaryId;
 
-  OutlineDillCompilationStep() : super('outline-dill-compilation');
+  OutlineDillCompilationStep() : super('outline-dill-compilation', false);
 }
 
 // Step that compiles sources in a module to a .dill file.
@@ -255,42 +271,81 @@
   @override
   DataId get outputData => dillId;
 
-  FullDillCompilationStep() : super('full-dill-compilation');
+  FullDillCompilationStep({bool onlyOnSdk = false})
+      : super('full-dill-compilation', onlyOnSdk);
 }
 
-class ModularAnalysisStep implements IOModularStep {
+class ModularAnalysisStep extends IOModularStep {
   @override
-  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
+  List<DataId> get resultData => [modularDataId, modularUpdatedDillId];
 
   @override
-  bool get needsSources => false;
+  bool get needsSources => !onlyOnSdk;
 
+  /// The SDK has no dependencies, and for all other modules we only need
+  /// summaries.
   @override
-  List<DataId> get dependencyDataNeeded => const [dillId];
+  List<DataId> get dependencyDataNeeded => [dillSummaryId];
 
+  /// All non SDK modules only need sources for module data.
   @override
-  List<DataId> get moduleDataNeeded => const [dillId];
+  List<DataId> get moduleDataNeeded => onlyOnSdk ? [dillId] : const [];
 
   @override
   bool get onlyOnMain => false;
 
   @override
+  final bool onlyOnSdk;
+
+  @override
+  bool get notOnSdk => !onlyOnSdk;
+
+  // TODO(joshualitt): We currently special case the SDK both because it is not
+  // trivial to build it in the same fashion as other modules, and because it is
+  // a special case in other build environments. Eventually, we should
+  // standardize this a bit more and always build the SDK modularly, if we have
+  // to build it.
+  ModularAnalysisStep({this.onlyOnSdk = false});
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print("\nstep: modular analysis on $module");
     Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    Iterable<String> dillDependencies =
-        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> dillDependencies = [];
+    List<String> sources = [];
+    List<String> extraArgs = [];
+    if (!module.isSdk) {
+      writePackageConfig(module, transitiveDependencies, root);
+      String rootScheme = getRootScheme(module);
+      sources = getSources(module);
+      dillDependencies = transitiveDependencies
+          .map((m) => '${toUri(m, dillSummaryId)}')
+          .toList();
+      extraArgs = [
+        '--packages=${root.resolve('.packages')}',
+        '--multi-root=$root',
+        '--multi-root-scheme=$rootScheme',
+      ];
+    }
+
     List<String> args = [
       '--packages=${sdkRoot.toFilePath()}/.packages',
       _dart2jsScript,
+      '--no-sound-null-safety',
       if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.inputDill}=${toUri(module, dillId)}',
+      // If we have sources, then we aren't building the SDK, otherwise we
+      // assume we are building the sdk and pass in a full dill.
+      if (sources.isNotEmpty)
+        '${Flags.sources}=${sources.join(',')}'
+      else
+        '${Flags.inputDill}=${toUri(module, dillId)}',
       if (dillDependencies.isNotEmpty)
         '--dill-dependencies=${dillDependencies.join(',')}',
       '--out=${toUri(module, modularUpdatedDillId)}',
       '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
       for (String flag in flags) '--enable-experiment=$flag',
+      ...extraArgs
     ];
     var result =
         await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
@@ -306,7 +361,7 @@
   }
 }
 
-class ConcatenateDillsStep implements IOModularStep {
+class ConcatenateDillsStep extends IOModularStep {
   final bool useModularAnalysis;
 
   DataId get idForDill => useModularAnalysis ? modularUpdatedDillId : dillId;
@@ -368,7 +423,7 @@
 }
 
 // Step that invokes the dart2js closed world computation.
-class ComputeClosedWorldStep implements IOModularStep {
+class ComputeClosedWorldStep extends IOModularStep {
   final bool useModularAnalysis;
 
   ComputeClosedWorldStep({this.useModularAnalysis});
@@ -429,7 +484,7 @@
 }
 
 // Step that runs the dart2js modular analysis.
-class GlobalAnalysisStep implements IOModularStep {
+class GlobalAnalysisStep extends IOModularStep {
   @override
   List<DataId> get resultData => const [globalDataId];
 
@@ -479,7 +534,7 @@
 // Step that invokes the dart2js code generation on the main module given the
 // results of the global analysis step and produces one shard of the codegen
 // output.
-class Dart2jsCodegenStep implements IOModularStep {
+class Dart2jsCodegenStep extends IOModularStep {
   final ShardDataId codeId;
 
   Dart2jsCodegenStep(this.codeId);
@@ -531,7 +586,7 @@
 
 // Step that invokes the dart2js codegen enqueuer and emitter on the main module
 // given the results of the global analysis step and codegen shards.
-class Dart2jsEmissionStep implements IOModularStep {
+class Dart2jsEmissionStep extends IOModularStep {
   @override
   List<DataId> get resultData => const [jsId];
 
@@ -583,7 +638,7 @@
 }
 
 /// Step that runs the output of dart2js in d8 and saves the output.
-class RunD8 implements IOModularStep {
+class RunD8 extends IOModularStep {
   @override
   List<DataId> get resultData => const [txtId];
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index bd0d2d8..077f5e1 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1327,23 +1327,7 @@
     var fields = c.fields
         .where((f) => f.isStatic && !isRedirectingFactoryField(f))
         .toList();
-    if (c.isEnum) {
-      // We know enum fields can be safely emitted as const fields, as long
-      // as the `values` field is emitted last.
-      var classRef = _emitTopLevelName(c);
-      var valueField = fields.firstWhere((f) => f.name.text == 'values');
-      fields.remove(valueField);
-      fields.add(valueField);
-      for (var f in fields) {
-        assert(f.isConst);
-        body.add(defineValueOnClass(
-                c,
-                classRef,
-                _emitStaticMemberName(f.name.text),
-                _visitInitializer(f.initializer, f.annotations))
-            .toStatement());
-      }
-    } else if (fields.isNotEmpty) {
+    if (fields.isNotEmpty) {
       body.add(_emitLazyFields(_emitTopLevelName(c), fields,
           (n) => _emitStaticMemberName(n.name.text)));
     }
diff --git a/pkg/dev_compiler/test/modular_suite.dart b/pkg/dev_compiler/test/modular_suite.dart
index 0df7a21..eb34432 100644
--- a/pkg/dev_compiler/test/modular_suite.dart
+++ b/pkg/dev_compiler/test/modular_suite.dart
@@ -73,6 +73,12 @@
   bool get onlyOnMain => false;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: source-to-dill on $module');
@@ -163,6 +169,12 @@
   bool get onlyOnMain => false;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: ddc on $module');
@@ -245,6 +257,12 @@
   bool get onlyOnMain => true;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: d8 on $module');
diff --git a/pkg/dev_compiler/test/modular_suite_nnbd.dart b/pkg/dev_compiler/test/modular_suite_nnbd.dart
index 4c7c3b0..4a1f559 100644
--- a/pkg/dev_compiler/test/modular_suite_nnbd.dart
+++ b/pkg/dev_compiler/test/modular_suite_nnbd.dart
@@ -73,6 +73,12 @@
   bool get onlyOnMain => false;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: source-to-dill on $module');
@@ -165,6 +171,12 @@
   bool get onlyOnMain => false;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: ddc on $module');
@@ -249,6 +261,12 @@
   bool get onlyOnMain => true;
 
   @override
+  bool get onlyOnSdk => false;
+
+  @override
+  bool get notOnSdk => false;
+
+  @override
   Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
       List<String> flags) async {
     if (_options.verbose) print('\nstep: d8 on $module');
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 8c9efe1..a44b20b 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -32,6 +32,10 @@
 
   // Parse flags.
   var parser = ArgParser(usageLineLength: 80)
+    ..addOption('arch',
+        abbr: 'a',
+        help: "Target platform's machine architecture.",
+        allowed: ['x64', 'arm64'])
     ..addOption('binary', abbr: 'b', help: 'Runtime binary path.')
     ..addOption('compile-vm-options',
         help: 'DART_VM_OPTIONS for the compilation VM.')
@@ -106,6 +110,7 @@
     printUsage();
     exit(1);
   }
+  var arch = options['arch'] as String;
   var debug = options['debug'] as bool ||
       options['observe'] as bool ||
       options.wasParsed('vm-service-port');
@@ -213,8 +218,7 @@
   }
 
   var sdkRoot = p.dirname(p.dirname(ddcPath));
-  var buildDir =
-      p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out', 'ReleaseX64');
+  var buildDir = resolveBuildDir(sdkRoot, arch);
   var requirePath = p.join(sdkRoot, 'third_party', 'requirejs');
   var sdkOutlineDill = p.join(buildDir,
       soundNullSafety ? 'ddc_outline_sound.dill' : 'ddc_outline.dill');
@@ -371,3 +375,44 @@
   }
   throw UnsupportedError('Unsupported platform.');
 }
+
+/// Maps supported unames to supported architectures.
+final _resolvedUnames = {
+  'arm64': 'arm64',
+  'x86_64': 'x64',
+  'x64': 'x64',
+};
+
+/// Returns the location of the Dart SDK's build directory.
+String resolveBuildDir(String sdkRoot, String architecture) {
+  String platformString;
+  String archString;
+  if (Platform.isMacOS) {
+    platformString = 'xcodebuild';
+    String resolvedArchitecture = architecture;
+    if (architecture == null) {
+      final uname = Process.runSync('uname', ['-m']).stdout.trim();
+      resolvedArchitecture = _resolvedUnames[uname] ?? uname;
+    }
+    if (resolvedArchitecture == 'x64') {
+      archString = 'ReleaseX64';
+    } else if (resolvedArchitecture == 'arm64') {
+      archString = 'ReleaseARM64';
+    } else {
+      throw UnsupportedError(
+          'DDB does not currently support the architecture $architecture '
+          'on MacOS.');
+    }
+  } else if (Platform.isLinux || Platform.isWindows) {
+    platformString = 'out';
+    if (architecture != null && architecture != 'x64') {
+      throw UnsupportedError(
+          'DDB does not currently support the architecture $architecture '
+          'on Windows or Linux.');
+    }
+    archString = 'ReleaseX64';
+  } else {
+    throw UnsupportedError('Unsupported platform.');
+  }
+  return p.join(sdkRoot, platformString, archString);
+}
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 74fd203..014908f 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -172,7 +172,9 @@
     bool verbose,
     FileSystem fileSystem,
     DiagnosticMessageHandler onDiagnostic,
-    Uri input) async {
+    List<Uri> inputs,
+    bool isModularCompile) async {
+  assert(inputs.length == 1 || isModularCompile);
   CompilerOptions options = state.options;
   options
     ..onDiagnostic = onDiagnostic
@@ -181,7 +183,7 @@
 
   ProcessedOptions processedOpts = state.processedOpts;
   processedOpts.inputs.clear();
-  processedOpts.inputs.add(input);
+  processedOpts.inputs.addAll(inputs);
   processedOpts.clearFileSystemCache();
 
   CompilerResult? compilerResult = await CompilerContext.runWithOptions(
@@ -189,9 +191,10 @@
     CompilerResult compilerResult = await generateKernelInternal();
     Component? component = compilerResult.component;
     if (component == null) return null;
-    if (component.mainMethod == null) {
+    if (component.mainMethod == null && !isModularCompile) {
       context.options.report(
-          messageMissingMain.withLocation(input, -1, 0), Severity.error);
+          messageMissingMain.withLocation(inputs.single, -1, 0),
+          Severity.error);
       return null;
     }
     return compilerResult;
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 07a3764..80ca725 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1854,7 +1854,6 @@
 
     List<Expression>? positionalSuperParametersAsArguments;
     List<NamedExpression>? namedSuperParametersAsArguments;
-    Set<String>? namedSuperParameterNames;
     if (formals != null) {
       for (FormalParameterBuilder formal in formals) {
         if (formal.isSuperInitializingFormal) {
@@ -1866,7 +1865,6 @@
                         forNullGuardedAccess: false)
                       ..fileOffset = formal.charOffset)
                   ..fileOffset = formal.charOffset);
-            (namedSuperParameterNames ??= <String>{}).add(formal.name);
           } else {
             (positionalSuperParametersAsArguments ??= <Expression>[]).add(
                 new VariableGetImpl(formal.variable!,
@@ -1888,7 +1886,7 @@
                   superInitializer.fileOffset, noLength))
             ..parent = constructor;
         } else if (libraryBuilder.enableSuperParametersInLibrary) {
-          ArgumentsImpl arguments = superInitializer.arguments as ArgumentsImpl;
+          Arguments arguments = superInitializer.arguments;
 
           if (positionalSuperParametersAsArguments != null) {
             if (arguments.positional.isNotEmpty) {
@@ -1906,14 +1904,12 @@
             } else {
               arguments.positional.addAll(positionalSuperParametersAsArguments);
               setParents(positionalSuperParametersAsArguments, arguments);
-              arguments.positionalAreSuperParameters = true;
             }
           }
           if (namedSuperParametersAsArguments != null) {
             // TODO(cstefantsova): Report name conflicts.
             arguments.named.addAll(namedSuperParametersAsArguments);
             setParents(namedSuperParametersAsArguments, arguments);
-            arguments.namedSuperParameterNames = namedSuperParameterNames;
           }
         }
       } else if (initializers.last is RedirectingInitializer) {
@@ -1962,7 +1958,7 @@
       /// >unless the enclosing class is class Object.
       Constructor? superTarget = lookupConstructor(emptyName, isSuper: true);
       Initializer initializer;
-      ArgumentsImpl arguments;
+      Arguments arguments;
       List<Expression>? positionalArguments;
       List<NamedExpression>? namedArguments;
       if (libraryBuilder.enableSuperParametersInLibrary) {
@@ -1980,7 +1976,6 @@
               forNullGuardedAccess: false)
         ]);
       }
-
       if (positionalArguments != null || namedArguments != null) {
         arguments = forest.createArguments(
             noLocation, positionalArguments ?? <Expression>[],
@@ -1988,11 +1983,6 @@
       } else {
         arguments = forest.createArgumentsEmpty(noLocation);
       }
-
-      arguments.positionalAreSuperParameters =
-          positionalSuperParametersAsArguments != null;
-      arguments.namedSuperParameterNames = namedSuperParameterNames;
-
       if (superTarget == null ||
           checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 3009ba1..354dddc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -493,17 +493,6 @@
 
   List<Object?>? argumentsOriginalOrder;
 
-  /// True if the arguments are passed to the super-constructor in a
-  /// super-initializer, and the positional parameters are super-initializer
-  /// parameters. It is true that either all of the positional parameters are
-  /// super-initializer parameters or none of them, so a simple boolean
-  /// accurately reflects the state.
-  bool positionalAreSuperParameters = false;
-
-  /// Names of the named positional parameters. If none of the parameters are
-  /// super-positional, the field is null.
-  Set<String>? namedSuperParameterNames;
-
   ArgumentsImpl.internal(
       {required List<Expression> positional,
       required List<DartType>? types,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
index 3fe267a..0a19850 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
@@ -250,11 +250,13 @@
   final Member original;
   final Substitution substitution;
   final bool copyReturnType;
+  bool _hasBeenInferred = false;
 
   TypeDependency(this.synthesized, this.original, this.substitution,
       {required this.copyReturnType});
 
   void copyInferred() {
+    if (_hasBeenInferred) return;
     for (int i = 0; i < original.function!.positionalParameters.length; i++) {
       VariableDeclaration synthesizedParameter =
           synthesized.function!.positionalParameters[i];
@@ -275,5 +277,6 @@
       synthesized.function!.returnType =
           substitution.substituteType(original.function!.returnType);
     }
+    _hasBeenInferred = true;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index d90e037..7912ac66 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1088,11 +1088,11 @@
       //..fileEndOffset = cls.fileOffset
       ..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault;
 
+    TypeDependency? typeDependency;
     if (hasTypeDependency) {
-      loader.registerTypeDependency(
-          constructor,
-          new TypeDependency(constructor, superConstructor, substitution,
-              copyReturnType: false));
+      typeDependency = new TypeDependency(
+          constructor, superConstructor, substitution,
+          copyReturnType: false);
     }
 
     Procedure? constructorTearOff = createConstructorTearOffProcedure(
@@ -1107,16 +1107,20 @@
       buildConstructorTearOffProcedure(constructorTearOff, constructor,
           classBuilder.cls, classBuilder.libraryBuilder);
     }
-    return new SyntheticSourceConstructorBuilder(
-        classBuilder, constructor, constructorTearOff,
-        // We pass on the original constructor and the cloned function nodes to
-        // ensure that the default values are computed and cloned for the
-        // outline. It is needed to make the default values a part of the
-        // outline for const constructors, and additionally it is required for
-        // a potential subclass using super initializing parameters that will
-        // required the cloning of the default values.
-        definingConstructor: superConstructorBuilder,
-        delayedDefaultValueCloner: delayedDefaultValueCloner);
+    SyntheticSourceConstructorBuilder constructorBuilder =
+        new SyntheticSourceConstructorBuilder(
+            classBuilder, constructor, constructorTearOff,
+            // We pass on the original constructor and the cloned function nodes
+            // to ensure that the default values are computed and cloned for the
+            // outline. It is needed to make the default values a part of the
+            // outline for const constructors, and additionally it is required
+            // for a potential subclass using super initializing parameters that
+            // will required the cloning of the default values.
+            definingConstructor: superConstructorBuilder,
+            delayedDefaultValueCloner: delayedDefaultValueCloner,
+            typeDependency: typeDependency);
+    loader.registerConstructorToBeInferred(constructor, constructorBuilder);
+    return constructorBuilder;
   }
 
   void finishSynthesizedParameters({bool forOutline = false}) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 15e3b74..25777e5 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -26,7 +26,8 @@
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/expression_generator_helper.dart';
 import '../kernel/hierarchy/class_member.dart' show ClassMember;
-import '../kernel/kernel_helper.dart' show DelayedDefaultValueCloner;
+import '../kernel/kernel_helper.dart'
+    show DelayedDefaultValueCloner, TypeDependency;
 import '../kernel/utils.dart'
     show isRedirectingGenerativeConstructorImplementation;
 import '../messages.dart'
@@ -52,6 +53,9 @@
 
 abstract class SourceConstructorBuilder
     implements ConstructorBuilder, SourceMemberBuilder {
+  /// Infers the types of any untyped initializing formals.
+  void inferFormalTypes(TypeEnvironment typeEnvironment);
+
   void addSuperParameterDefaultValueCloners(
       List<DelayedDefaultValueCloner> delayedDefaultValueCloners);
 }
@@ -224,7 +228,7 @@
     return _constructor;
   }
 
-  /// Infers the types of any untyped initializing formals.
+  @override
   void inferFormalTypes(TypeEnvironment typeEnvironment) {
     if (_hasFormalsInferred) return;
     if (formals != null) {
@@ -321,14 +325,8 @@
     ConstructorBuilder? superTargetBuilder =
         _computeSuperTargetBuilder(initializers);
 
-    if (superTargetBuilder is DeclaredSourceConstructorBuilder) {
+    if (superTargetBuilder is SourceConstructorBuilder) {
       superTargetBuilder.inferFormalTypes(typeEnvironment);
-    } else if (superTargetBuilder is SyntheticSourceConstructorBuilder) {
-      MemberBuilder? superTargetOriginBuilder =
-          superTargetBuilder._effectivelyDefiningConstructor;
-      if (superTargetOriginBuilder is DeclaredSourceConstructorBuilder) {
-        superTargetOriginBuilder.inferFormalTypes(typeEnvironment);
-      }
     }
 
     Constructor superTarget;
@@ -339,10 +337,9 @@
       superFormals = superTargetBuilder.formals!;
     } else if (superTargetBuilder is DillConstructorBuilder) {
       superTarget = superTargetBuilder.constructor;
+      superConstructorFunction = superTargetBuilder.function;
       if (superTargetBuilder is SyntheticSourceConstructorBuilder) {
         superFormals = superTargetBuilder.formals;
-      } else {
-        superConstructorFunction = superTargetBuilder.function;
       }
     } else {
       // The error in this case should be reported elsewhere. Here we perform a
@@ -354,7 +351,27 @@
     List<bool> positionalSuperFormalHasInitializer = [];
     Map<String, DartType?> namedSuperFormalType = {};
     Map<String, bool> namedSuperFormalHasInitializer = {};
-    if (superFormals != null) {
+    // TODO(johnniwinther): Clean this up when [VariableDeclaration] has a
+    // `hasDeclaredInitializer` flag.
+    if (superFormals != null && superConstructorFunction != null) {
+      for (VariableDeclaration formal
+          in superConstructorFunction.positionalParameters) {
+        positionalSuperFormalType.add(formal.type);
+      }
+      for (VariableDeclaration formal
+          in superConstructorFunction.namedParameters) {
+        namedSuperFormalType[formal.name!] = formal.type;
+      }
+      for (FormalParameterBuilder formal in superFormals) {
+        if (formal.isPositional) {
+          positionalSuperFormalHasInitializer
+              .add(formal.hasDeclaredInitializer);
+        } else {
+          namedSuperFormalHasInitializer[formal.name] =
+              formal.hasDeclaredInitializer;
+        }
+      }
+    } else if (superFormals != null) {
       for (FormalParameterBuilder formal in superFormals) {
         if (formal.isPositional) {
           positionalSuperFormalType.add(formal.variable?.type);
@@ -802,19 +819,34 @@
   /// the constructor that effectively defines this constructor.
   MemberBuilder? _immediatelyDefiningConstructor;
   DelayedDefaultValueCloner? _delayedDefaultValueCloner;
+  TypeDependency? _typeDependency;
 
   SyntheticSourceConstructorBuilder(SourceClassBuilder parent,
       Constructor constructor, Procedure? constructorTearOff,
       {MemberBuilder? definingConstructor,
-      DelayedDefaultValueCloner? delayedDefaultValueCloner})
+      DelayedDefaultValueCloner? delayedDefaultValueCloner,
+      TypeDependency? typeDependency})
       : _immediatelyDefiningConstructor = definingConstructor,
         _delayedDefaultValueCloner = delayedDefaultValueCloner,
+        _typeDependency = typeDependency,
         super(constructor, constructorTearOff, parent);
 
   @override
   SourceLibraryBuilder get libraryBuilder =>
       super.libraryBuilder as SourceLibraryBuilder;
 
+  @override
+  void inferFormalTypes(TypeEnvironment typeEnvironment) {
+    if (_immediatelyDefiningConstructor is SourceConstructorBuilder) {
+      (_immediatelyDefiningConstructor as SourceConstructorBuilder)
+          .inferFormalTypes(typeEnvironment);
+    }
+    if (_typeDependency != null) {
+      _typeDependency!.copyInferred();
+      _typeDependency = null;
+    }
+  }
+
   MemberBuilder? get _effectivelyDefiningConstructor {
     MemberBuilder? origin = _immediatelyDefiningConstructor;
     while (origin is SyntheticSourceConstructorBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 084733a..280a71d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -974,7 +974,7 @@
   }
 
   void registerConstructorToBeInferred(
-      Constructor constructor, DeclaredSourceConstructorBuilder builder) {
+      Constructor constructor, SourceConstructorBuilder builder) {
     _typeInferenceEngine!.toBeInferred[constructor] = builder;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 3459623..0327d2c 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -113,14 +113,14 @@
   /// This is represented as a map from a constructor to its library
   /// builder because the builder is used to report errors due to cyclic
   /// inference dependencies.
-  final Map<Constructor, DeclaredSourceConstructorBuilder> toBeInferred = {};
+  final Map<Constructor, SourceConstructorBuilder> toBeInferred = {};
 
   /// A map containing constructors in the process of being inferred.
   ///
   /// This is used to detect cyclic inference dependencies.  It is represented
   /// as a map from a constructor to its library builder because the builder
   /// is used to report errors.
-  final Map<Constructor, DeclaredSourceConstructorBuilder> beingInferred = {};
+  final Map<Constructor, SourceConstructorBuilder> beingInferred = {};
 
   final Map<Member, TypeDependency> typeDependencies = {};
 
@@ -144,7 +144,7 @@
   void finishTopLevelInitializingFormals() {
     // Field types have all been inferred so we don't need to guard against
     // cyclic dependency.
-    for (DeclaredSourceConstructorBuilder builder in toBeInferred.values) {
+    for (SourceConstructorBuilder builder in toBeInferred.values) {
       builder.inferFormalTypes(typeSchemaEnvironment);
     }
     toBeInferred.clear();
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 8dbfdac..a0e094b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -388,8 +388,7 @@
 
   @override
   void inferConstructorParameterTypes(Constructor target) {
-    DeclaredSourceConstructorBuilder? constructor =
-        engine.beingInferred[target];
+    SourceConstructorBuilder? constructor = engine.beingInferred[target];
     if (constructor != null) {
       // There is a cyclic dependency where inferring the types of the
       // initializing formals of a constructor required us to infer the
@@ -494,7 +493,6 @@
       DartType? declaredContextType,
       DartType? runtimeCheckedType,
       bool isVoidAllowed: false,
-      bool coerceExpression: true,
       Template<Message Function(DartType, DartType, bool)>? errorTemplate,
       Template<Message Function(DartType, DartType, bool)>?
           nullabilityErrorTemplate,
@@ -510,7 +508,6 @@
             declaredContextType: declaredContextType,
             runtimeCheckedType: runtimeCheckedType,
             isVoidAllowed: isVoidAllowed,
-            coerceExpression: coerceExpression,
             errorTemplate: errorTemplate,
             nullabilityErrorTemplate: nullabilityErrorTemplate,
             nullabilityNullErrorTemplate: nullabilityNullErrorTemplate,
@@ -529,7 +526,6 @@
       DartType? declaredContextType,
       DartType? runtimeCheckedType,
       bool isVoidAllowed: false,
-      bool coerceExpression: true,
       Template<Message Function(DartType, DartType, bool)>? errorTemplate,
       Template<Message Function(DartType, DartType, bool)>?
           nullabilityErrorTemplate,
@@ -581,8 +577,7 @@
         contextType, inferenceResult.inferredType,
         isNonNullableByDefault: isNonNullableByDefault,
         isVoidAllowed: isVoidAllowed,
-        isExpressionTypePrecise: preciseTypeErrorTemplate != null,
-        coerceExpression: coerceExpression);
+        isExpressionTypePrecise: preciseTypeErrorTemplate != null);
 
     if (assignabilityResult.needsTearOff) {
       TypedTearoff typedTearoff = _tearOffCall(inferenceResult.expression,
@@ -786,8 +781,7 @@
       DartType contextType, DartType expressionType,
       {required bool isNonNullableByDefault,
       required bool isVoidAllowed,
-      required bool isExpressionTypePrecise,
-      required bool coerceExpression}) {
+      required bool isExpressionTypePrecise}) {
     // ignore: unnecessary_null_comparison
     assert(isNonNullableByDefault != null);
     // ignore: unnecessary_null_comparison
@@ -799,7 +793,7 @@
     // should tear off `.call`.
     // TODO(paulberry): use resolveTypeParameter.  See findInterfaceMember.
     bool needsTearoff = false;
-    if (coerceExpression && expressionType is InterfaceType) {
+    if (expressionType is InterfaceType) {
       Class classNode = expressionType.classNode;
       Member? callMember =
           classHierarchy.getInterfaceMember(classNode, callName);
@@ -818,7 +812,7 @@
       }
     }
     ImplicitInstantiation? implicitInstantiation;
-    if (coerceExpression && libraryBuilder.enableConstructorTearOffsInLibrary) {
+    if (libraryBuilder.enableConstructorTearOffsInLibrary) {
       implicitInstantiation =
           computeImplicitInstantiation(expressionType, contextType);
       if (implicitInstantiation != null) {
@@ -872,15 +866,8 @@
       return const AssignabilityResult(AssignabilityKind.unassignablePrecise,
           needsTearOff: false);
     }
-
-    if (coerceExpression) {
-      // Insert an implicit downcast.
-      return new AssignabilityResult(AssignabilityKind.assignableCast,
-          needsTearOff: needsTearoff,
-          implicitInstantiation: implicitInstantiation);
-    }
-
-    return new AssignabilityResult(AssignabilityKind.unassignable,
+    // Insert an implicit downcast.
+    return new AssignabilityResult(AssignabilityKind.assignableCast,
         needsTearOff: needsTearoff,
         implicitInstantiation: implicitInstantiation);
   }
@@ -2630,23 +2617,17 @@
           DartType actualType = actualTypes![i];
           Expression expression;
           NamedExpression? namedExpression;
-          bool coerceExpression;
           if (i < numPositionalArgs) {
             expression = arguments.positional[positionalShift + i];
             positionalArgumentTypes.add(actualType);
-            coerceExpression = !arguments.positionalAreSuperParameters;
           } else {
             namedExpression = arguments.named[i - numPositionalArgs];
             expression = namedExpression.value;
             namedArgumentTypes
                 .add(new NamedType(namedExpression.name, actualType));
-            coerceExpression = !(arguments.namedSuperParameterNames
-                    ?.contains(namedExpression.name) ??
-                false);
           }
           expression = ensureAssignable(expectedType, actualType, expression,
               isVoidAllowed: expectedType is VoidType,
-              coerceExpression: coerceExpression,
               // TODO(johnniwinther): Specialize message for operator
               // invocations.
               errorTemplate: templateArgumentTypeNotAssignable,
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index c09bea1..1d062f6 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -47,7 +47,6 @@
 accounted
 accumulate
 accurate
-accurately
 achieve
 act
 acting
@@ -490,7 +489,6 @@
 closures
 clue
 code
-coerce
 coincides
 coinductively
 collapses
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart b/pkg/front_end/testcases/super_parameters/issue48708.dart
new file mode 100644
index 0000000..5b2395d
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+class Mixin {}
+
+abstract class B<D> {
+  B({
+    required this.field,
+  });
+
+  final D field;
+}
+
+class C extends B<A> with Mixin {
+  C({
+    required super.field,
+  });
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.expect
new file mode 100644
index 0000000..05ade25
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field = #C1}) → self::B<self::B::D%>
+    : self::B::field = field, super core::Object::•()
+    ;
+}
+abstract class _C&B&Mixin = self::B<self::A> with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •({self::A field = #C1}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field = #C1}) → self::C
+    : super self::_C&B&Mixin::•(field: field)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.transformed.expect
new file mode 100644
index 0000000..f71d862
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field = #C1}) → self::B<self::B::D%>
+    : self::B::field = field, super core::Object::•()
+    ;
+}
+abstract class _C&B&Mixin extends self::B<self::A> implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •({self::A field = #C1}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field = #C1}) → self::C
+    : super self::_C&B&Mixin::•(field: field)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline.expect
new file mode 100644
index 0000000..963c4ca
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline.expect
@@ -0,0 +1,18 @@
+class A {}
+
+class Mixin {}
+
+abstract class B<D> {
+  B({
+    required this.field,
+  });
+  final D field;
+}
+
+class C extends B<A> with Mixin {
+  C({
+    required super.field,
+  });
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..429733e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.textual_outline_modelled.expect
@@ -0,0 +1,18 @@
+abstract class B<D> {
+  B({
+    required this.field,
+  });
+  final D field;
+}
+
+class A {}
+
+class C extends B<A> with Mixin {
+  C({
+    required super.field,
+  });
+}
+
+class Mixin {}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.expect
new file mode 100644
index 0000000..05ade25
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field = #C1}) → self::B<self::B::D%>
+    : self::B::field = field, super core::Object::•()
+    ;
+}
+abstract class _C&B&Mixin = self::B<self::A> with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •({self::A field = #C1}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field = #C1}) → self::C
+    : super self::_C&B&Mixin::•(field: field)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.modular.expect
new file mode 100644
index 0000000..05ade25
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field = #C1}) → self::B<self::B::D%>
+    : self::B::field = field, super core::Object::•()
+    ;
+}
+abstract class _C&B&Mixin = self::B<self::A> with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •({self::A field = #C1}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field = #C1}) → self::C
+    : super self::_C&B&Mixin::•(field: field)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.outline.expect
new file mode 100644
index 0000000..4a28ead1
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field}) → self::B<self::B::D%>
+    ;
+}
+abstract class _C&B&Mixin = self::B<self::A> with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •({self::A field}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field}) → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.transformed.expect
new file mode 100644
index 0000000..f71d862
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/issue48708.dart.weak.transformed.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class B<D extends core::Object? = dynamic> extends core::Object {
+  final field self::B::D% field;
+  constructor •({required self::B::D% field = #C1}) → self::B<self::B::D%>
+    : self::B::field = field, super core::Object::•()
+    ;
+}
+abstract class _C&B&Mixin extends self::B<self::A> implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •({self::A field = #C1}) → self::_C&B&Mixin
+    : super self::B::•(field: field)
+    ;
+}
+class C extends self::_C&B&Mixin {
+  constructor •({required self::A field = #C1}) → self::C
+    : super self::_C&B&Mixin::•(field: field)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart b/pkg/front_end/testcases/super_parameters/no_coercions.dart
deleted file mode 100644
index 942256b..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class A1 {
-  A1(int x);
-}
-
-class B1 extends A1 {
-  B1.one(dynamic super.x); // Error.
-  B1.two(dynamic super.x) : super(); // Error.
-}
-
-class A2 {
-  A2({required String x});
-}
-
-class B2 extends A2 {
-  B2.one({required dynamic super.x}); // Error.
-  B2.two({required dynamic super.x}) : super(); // Error.
-}
-
-class A3 {
-  A3(num Function(double) f);
-}
-
-class B3 extends A3 {
-  B3.one(X Function<X>(double) super.f); // Error.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-}
-
-class A4 {
-  A4({required num Function(double) f});
-}
-
-class B4 extends A4 {
-  B4.one({required X Function<X>(double) super.f}); // Error.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-}
-
-abstract class C5 {
-  String call(int x, num y);
-}
-
-class A5 {
-  A5(String Function(int, num) f);
-}
-
-class B5 extends A5 {
-  B5.one(C5 super.f); // Error.
-  B5.two(C5 super.f) : super(); // Error.
-}
-
-class A6 {
-  A6({required String Function(int, num) f});
-}
-
-class B6 extends A6 {
-  B6.one({required C5 super.f}); // Error.
-  B6.two({required C5 super.f}) : super(); // Error.
-}
-
-class A7 {
-  A7({required int x1,
-      required int x2,
-      required bool Function(Object) f1,
-      required bool Function(Object) f2,
-      required void Function(dynamic) g1,
-      required void Function(dynamic) g2});
-}
-
-class B7 extends A7 {
-  B7({required dynamic super.x1, // Error.
-      required dynamic x2,
-      required X Function<X>(Object) super.f1, // Error.
-      required X Function<X>(Object) f2,
-      required void Function<X>(X) super.g1, // Error.
-      required void Function<X>(X) g2}) :
-    super(x2: x2, f2: f2, g2: g2); // Ok.
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.expect
deleted file mode 100644
index 1d154d8..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.expect
+++ /dev/null
@@ -1,206 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.one(dynamic super.x); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.two(dynamic super.x) : super(); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.one({required dynamic super.x}); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.two({required dynamic super.x}) : super(); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.one(X Function<X>(double) super.f); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.two(X Function<X>(double) super.f) : super(); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.one({required X Function<X>(double) super.f}); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.one(C5 super.f); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.two(C5 super.f) : super(); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.one({required C5 super.f}); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.two({required C5 super.f}) : super(); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B7({required dynamic super.x1, // Error.
-//                              ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
-//  - 'Object' is from 'dart:core'.
-//       required X Function<X>(Object) super.f1, // Error.
-//                                            ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-//       required void Function<X>(X) super.g1, // Error.
-//                                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    : super core::Object::•()
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.one(dynamic super.x); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-  constructor two(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.two(dynamic super.x) : super(); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x = #C1}) → self::A2
-    : super core::Object::•()
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.one({required dynamic super.x}); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-  constructor two({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.two({required dynamic super.x}) : super(); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    : super core::Object::•()
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.one(X Function<X>(double) super.f); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f = #C1}) → self::A4
-    : super core::Object::•()
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.one({required X Function<X>(double) super.f}); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    : super core::Object::•()
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    : super core::Object::•()
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.one(C5 super.f); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.two(C5 super.f) : super(); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f = #C1}) → self::A6
-    : super core::Object::•()
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.one({required C5 super.f}); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.two({required C5 super.f}) : super(); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1 = #C1, required core::int x2 = #C1, required (core::Object) → core::bool f1 = #C1, required (core::Object) → core::bool f2 = #C1, required (dynamic) → void g1 = #C1, required (dynamic) → void g2 = #C1}) → self::A7
-    : super core::Object::•()
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1 = #C1, required dynamic x2 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f1 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f2 = #C1, required <X extends core::Object? = dynamic>(X%) → void g1 = #C1, required <X extends core::Object? = dynamic>(X%) → void g2 = #C1}) → self::B7
-    : super self::A7::•(x2: x2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, f2: f2<core::bool>, g2: g2<dynamic>, x1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B7({required dynamic super.x1, // Error.
-                             ^" in x1 as{TypeError,ForNonNullableByDefault} core::int, f1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
- - 'Object' is from 'dart:core'.
-      required X Function<X>(Object) super.f1, // Error.
-                                           ^" in f1 as{TypeError,ForNonNullableByDefault} (core::Object) → core::bool, g1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-      required void Function<X>(X) super.g1, // Error.
-                                         ^" in g1 as{TypeError,ForNonNullableByDefault} (dynamic) → void)
-    ;
-}
-static method main() → dynamic {}
-
-constants  {
-  #C1 = null
-}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.transformed.expect
deleted file mode 100644
index 1d154d8..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.strong.transformed.expect
+++ /dev/null
@@ -1,206 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.one(dynamic super.x); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.two(dynamic super.x) : super(); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.one({required dynamic super.x}); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.two({required dynamic super.x}) : super(); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.one(X Function<X>(double) super.f); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.two(X Function<X>(double) super.f) : super(); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.one({required X Function<X>(double) super.f}); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.one(C5 super.f); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.two(C5 super.f) : super(); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.one({required C5 super.f}); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.two({required C5 super.f}) : super(); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B7({required dynamic super.x1, // Error.
-//                              ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
-//  - 'Object' is from 'dart:core'.
-//       required X Function<X>(Object) super.f1, // Error.
-//                                            ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-//       required void Function<X>(X) super.g1, // Error.
-//                                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    : super core::Object::•()
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.one(dynamic super.x); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-  constructor two(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.two(dynamic super.x) : super(); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x = #C1}) → self::A2
-    : super core::Object::•()
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.one({required dynamic super.x}); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-  constructor two({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.two({required dynamic super.x}) : super(); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    : super core::Object::•()
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.one(X Function<X>(double) super.f); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f = #C1}) → self::A4
-    : super core::Object::•()
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.one({required X Function<X>(double) super.f}); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    : super core::Object::•()
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    : super core::Object::•()
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.one(C5 super.f); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.two(C5 super.f) : super(); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f = #C1}) → self::A6
-    : super core::Object::•()
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.one({required C5 super.f}); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.two({required C5 super.f}) : super(); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1 = #C1, required core::int x2 = #C1, required (core::Object) → core::bool f1 = #C1, required (core::Object) → core::bool f2 = #C1, required (dynamic) → void g1 = #C1, required (dynamic) → void g2 = #C1}) → self::A7
-    : super core::Object::•()
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1 = #C1, required dynamic x2 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f1 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f2 = #C1, required <X extends core::Object? = dynamic>(X%) → void g1 = #C1, required <X extends core::Object? = dynamic>(X%) → void g2 = #C1}) → self::B7
-    : super self::A7::•(x2: x2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, f2: f2<core::bool>, g2: g2<dynamic>, x1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B7({required dynamic super.x1, // Error.
-                             ^" in x1 as{TypeError,ForNonNullableByDefault} core::int, f1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
- - 'Object' is from 'dart:core'.
-      required X Function<X>(Object) super.f1, // Error.
-                                           ^" in f1 as{TypeError,ForNonNullableByDefault} (core::Object) → core::bool, g1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-      required void Function<X>(X) super.g1, // Error.
-                                         ^" in g1 as{TypeError,ForNonNullableByDefault} (dynamic) → void)
-    ;
-}
-static method main() → dynamic {}
-
-constants  {
-  #C1 = null
-}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline.expect
deleted file mode 100644
index 80093ec..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline.expect
+++ /dev/null
@@ -1,80 +0,0 @@
-class A1 {
-  A1(int x);
-}
-
-class B1 extends A1 {
-  B1.one(dynamic super.x);
-  B1.two(dynamic super.x) : super();
-}
-
-class A2 {
-  A2({required String x});
-}
-
-class B2 extends A2 {
-  B2.one({required dynamic super.x});
-  B2.two({required dynamic super.x}) : super();
-}
-
-class A3 {
-  A3(num Function(double) f);
-}
-
-class B3 extends A3 {
-  B3.one(X Function<X>(double) super.f);
-  B3.two(X Function<X>(double) super.f) : super();
-}
-
-class A4 {
-  A4({required num Function(double) f});
-}
-
-class B4 extends A4 {
-  B4.one({required X Function<X>(double) super.f});
-  B4.two({required X Function<X>(double) super.f}) : super();
-}
-
-abstract class C5 {
-  String call(int x, num y);
-}
-
-class A5 {
-  A5(String Function(int, num) f);
-}
-
-class B5 extends A5 {
-  B5.one(C5 super.f);
-  B5.two(C5 super.f) : super();
-}
-
-class A6 {
-  A6({required String Function(int, num) f});
-}
-
-class B6 extends A6 {
-  B6.one({required C5 super.f});
-  B6.two({required C5 super.f}) : super();
-}
-
-class A7 {
-  A7(
-      {required int x1,
-      required int x2,
-      required bool Function(Object) f1,
-      required bool Function(Object) f2,
-      required void Function(dynamic) g1,
-      required void Function(dynamic) g2});
-}
-
-class B7 extends A7 {
-  B7(
-      {required dynamic super.x1,
-      required dynamic x2,
-      required X Function<X>(Object) super.f1,
-      required X Function<X>(Object) f2,
-      required void Function<X>(X) super.g1,
-      required void Function<X>(X) g2})
-      : super(x2: x2, f2: f2, g2: g2);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline_modelled.expect
deleted file mode 100644
index d6b43c6..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.textual_outline_modelled.expect
+++ /dev/null
@@ -1,80 +0,0 @@
-abstract class C5 {
-  String call(int x, num y);
-}
-
-class A1 {
-  A1(int x);
-}
-
-class A2 {
-  A2({required String x});
-}
-
-class A3 {
-  A3(num Function(double) f);
-}
-
-class A4 {
-  A4({required num Function(double) f});
-}
-
-class A5 {
-  A5(String Function(int, num) f);
-}
-
-class A6 {
-  A6({required String Function(int, num) f});
-}
-
-class A7 {
-  A7(
-      {required int x1,
-      required int x2,
-      required bool Function(Object) f1,
-      required bool Function(Object) f2,
-      required void Function(dynamic) g1,
-      required void Function(dynamic) g2});
-}
-
-class B1 extends A1 {
-  B1.one(dynamic super.x);
-  B1.two(dynamic super.x) : super();
-}
-
-class B2 extends A2 {
-  B2.one({required dynamic super.x});
-  B2.two({required dynamic super.x}) : super();
-}
-
-class B3 extends A3 {
-  B3.one(X Function<X>(double) super.f);
-  B3.two(X Function<X>(double) super.f) : super();
-}
-
-class B4 extends A4 {
-  B4.one({required X Function<X>(double) super.f});
-  B4.two({required X Function<X>(double) super.f}) : super();
-}
-
-class B5 extends A5 {
-  B5.one(C5 super.f);
-  B5.two(C5 super.f) : super();
-}
-
-class B6 extends A6 {
-  B6.one({required C5 super.f});
-  B6.two({required C5 super.f}) : super();
-}
-
-class B7 extends A7 {
-  B7(
-      {required dynamic super.x1,
-      required dynamic x2,
-      required X Function<X>(Object) super.f1,
-      required X Function<X>(Object) f2,
-      required void Function<X>(X) super.g1,
-      required void Function<X>(X) g2})
-      : super(x2: x2, f2: f2, g2: g2);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.expect
deleted file mode 100644
index 1d154d8..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.expect
+++ /dev/null
@@ -1,206 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.one(dynamic super.x); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.two(dynamic super.x) : super(); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.one({required dynamic super.x}); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.two({required dynamic super.x}) : super(); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.one(X Function<X>(double) super.f); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.two(X Function<X>(double) super.f) : super(); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.one({required X Function<X>(double) super.f}); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.one(C5 super.f); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.two(C5 super.f) : super(); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.one({required C5 super.f}); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.two({required C5 super.f}) : super(); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B7({required dynamic super.x1, // Error.
-//                              ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
-//  - 'Object' is from 'dart:core'.
-//       required X Function<X>(Object) super.f1, // Error.
-//                                            ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-//       required void Function<X>(X) super.g1, // Error.
-//                                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    : super core::Object::•()
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.one(dynamic super.x); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-  constructor two(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.two(dynamic super.x) : super(); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x = #C1}) → self::A2
-    : super core::Object::•()
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.one({required dynamic super.x}); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-  constructor two({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.two({required dynamic super.x}) : super(); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    : super core::Object::•()
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.one(X Function<X>(double) super.f); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f = #C1}) → self::A4
-    : super core::Object::•()
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.one({required X Function<X>(double) super.f}); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    : super core::Object::•()
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    : super core::Object::•()
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.one(C5 super.f); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.two(C5 super.f) : super(); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f = #C1}) → self::A6
-    : super core::Object::•()
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.one({required C5 super.f}); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.two({required C5 super.f}) : super(); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1 = #C1, required core::int x2 = #C1, required (core::Object) → core::bool f1 = #C1, required (core::Object) → core::bool f2 = #C1, required (dynamic) → void g1 = #C1, required (dynamic) → void g2 = #C1}) → self::A7
-    : super core::Object::•()
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1 = #C1, required dynamic x2 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f1 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f2 = #C1, required <X extends core::Object? = dynamic>(X%) → void g1 = #C1, required <X extends core::Object? = dynamic>(X%) → void g2 = #C1}) → self::B7
-    : super self::A7::•(x2: x2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, f2: f2<core::bool>, g2: g2<dynamic>, x1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B7({required dynamic super.x1, // Error.
-                             ^" in x1 as{TypeError,ForNonNullableByDefault} core::int, f1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
- - 'Object' is from 'dart:core'.
-      required X Function<X>(Object) super.f1, // Error.
-                                           ^" in f1 as{TypeError,ForNonNullableByDefault} (core::Object) → core::bool, g1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-      required void Function<X>(X) super.g1, // Error.
-                                         ^" in g1 as{TypeError,ForNonNullableByDefault} (dynamic) → void)
-    ;
-}
-static method main() → dynamic {}
-
-constants  {
-  #C1 = null
-}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.modular.expect
deleted file mode 100644
index 1d154d8..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.modular.expect
+++ /dev/null
@@ -1,206 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.one(dynamic super.x); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.two(dynamic super.x) : super(); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.one({required dynamic super.x}); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.two({required dynamic super.x}) : super(); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.one(X Function<X>(double) super.f); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.two(X Function<X>(double) super.f) : super(); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.one({required X Function<X>(double) super.f}); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.one(C5 super.f); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.two(C5 super.f) : super(); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.one({required C5 super.f}); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.two({required C5 super.f}) : super(); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B7({required dynamic super.x1, // Error.
-//                              ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
-//  - 'Object' is from 'dart:core'.
-//       required X Function<X>(Object) super.f1, // Error.
-//                                            ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-//       required void Function<X>(X) super.g1, // Error.
-//                                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    : super core::Object::•()
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.one(dynamic super.x); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-  constructor two(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.two(dynamic super.x) : super(); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x = #C1}) → self::A2
-    : super core::Object::•()
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.one({required dynamic super.x}); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-  constructor two({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.two({required dynamic super.x}) : super(); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    : super core::Object::•()
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.one(X Function<X>(double) super.f); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f = #C1}) → self::A4
-    : super core::Object::•()
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.one({required X Function<X>(double) super.f}); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    : super core::Object::•()
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    : super core::Object::•()
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.one(C5 super.f); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.two(C5 super.f) : super(); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f = #C1}) → self::A6
-    : super core::Object::•()
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.one({required C5 super.f}); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.two({required C5 super.f}) : super(); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1 = #C1, required core::int x2 = #C1, required (core::Object) → core::bool f1 = #C1, required (core::Object) → core::bool f2 = #C1, required (dynamic) → void g1 = #C1, required (dynamic) → void g2 = #C1}) → self::A7
-    : super core::Object::•()
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1 = #C1, required dynamic x2 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f1 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f2 = #C1, required <X extends core::Object? = dynamic>(X%) → void g1 = #C1, required <X extends core::Object? = dynamic>(X%) → void g2 = #C1}) → self::B7
-    : super self::A7::•(x2: x2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, f2: f2<core::bool>, g2: g2<dynamic>, x1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B7({required dynamic super.x1, // Error.
-                             ^" in x1 as{TypeError,ForNonNullableByDefault} core::int, f1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
- - 'Object' is from 'dart:core'.
-      required X Function<X>(Object) super.f1, // Error.
-                                           ^" in f1 as{TypeError,ForNonNullableByDefault} (core::Object) → core::bool, g1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-      required void Function<X>(X) super.g1, // Error.
-                                         ^" in g1 as{TypeError,ForNonNullableByDefault} (dynamic) → void)
-    ;
-}
-static method main() → dynamic {}
-
-constants  {
-  #C1 = null
-}
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.outline.expect
deleted file mode 100644
index 7a8c89a..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.outline.expect
+++ /dev/null
@@ -1,79 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    ;
-  constructor two(dynamic x) → self::B1
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x}) → self::A2
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x}) → self::B2
-    ;
-  constructor two({required dynamic x}) → self::B2
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f}) → self::A4
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f}) → self::B4
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f}) → self::B4
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    ;
-  constructor two(self::C5 f) → self::B5
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f}) → self::A6
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f}) → self::B6
-    ;
-  constructor two({required self::C5 f}) → self::B6
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1, required core::int x2, required (core::Object) → core::bool f1, required (core::Object) → core::bool f2, required (dynamic) → void g1, required (dynamic) → void g2}) → self::A7
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1, required dynamic x2, required <X extends core::Object? = dynamic>(core::Object) → X% f1, required <X extends core::Object? = dynamic>(core::Object) → X% f2, required <X extends core::Object? = dynamic>(X%) → void g1, required <X extends core::Object? = dynamic>(X%) → void g2}) → self::B7
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.transformed.expect
deleted file mode 100644
index 1d154d8..0000000
--- a/pkg/front_end/testcases/super_parameters/no_coercions.dart.weak.transformed.expect
+++ /dev/null
@@ -1,206 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.one(dynamic super.x); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B1.two(dynamic super.x) : super(); // Error.
-//                        ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.one({required dynamic super.x}); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-//   B2.two({required dynamic super.x}) : super(); // Error.
-//                                  ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.one(X Function<X>(double) super.f); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B3.two(X Function<X>(double) super.f) : super(); // Error.
-//                                      ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.one({required X Function<X>(double) super.f}); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-//   B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-//                                                ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.one(C5 super.f); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B5.two(C5 super.f) : super(); // Error.
-//                   ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.one({required C5 super.f}); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
-//  - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-//   B6.two({required C5 super.f}) : super(); // Error.
-//                             ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-//   B7({required dynamic super.x1, // Error.
-//                              ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
-//  - 'Object' is from 'dart:core'.
-//       required X Function<X>(Object) super.f1, // Error.
-//                                            ^
-//
-// pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-//       required void Function<X>(X) super.g1, // Error.
-//                                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A1 extends core::Object {
-  constructor •(core::int x) → self::A1
-    : super core::Object::•()
-    ;
-}
-class B1 extends self::A1 {
-  constructor one(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:10:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.one(dynamic super.x); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-  constructor two(dynamic x) → self::B1
-    : super self::A1::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:11:24: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B1.two(dynamic super.x) : super(); // Error.
-                       ^" in x as{TypeError,ForNonNullableByDefault} core::int)
-    ;
-}
-class A2 extends core::Object {
-  constructor •({required core::String x = #C1}) → self::A2
-    : super core::Object::•()
-    ;
-}
-class B2 extends self::A2 {
-  constructor one({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:19:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.one({required dynamic super.x}); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-  constructor two({required dynamic x = #C1}) → self::B2
-    : super self::A2::•(x: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:20:34: Error: The argument type 'dynamic' can't be assigned to the parameter type 'String'.
-  B2.two({required dynamic super.x}) : super(); // Error.
-                                 ^" in x as{TypeError,ForNonNullableByDefault} core::String)
-    ;
-}
-class A3 extends core::Object {
-  constructor •((core::double) → core::num f) → self::A3
-    : super core::Object::•()
-    ;
-}
-class B3 extends self::A3 {
-  constructor one(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:28:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.one(X Function<X>(double) super.f); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two(<X extends core::Object? = dynamic>(core::double) → X% f) → self::B3
-    : super self::A3::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:29:38: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B3.two(X Function<X>(double) super.f) : super(); // Error.
-                                     ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-class A4 extends core::Object {
-  constructor •({required (core::double) → core::num f = #C1}) → self::A4
-    : super core::Object::•()
-    ;
-}
-class B4 extends self::A4 {
-  constructor one({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:37:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.one({required X Function<X>(double) super.f}); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-  constructor two({required <X extends core::Object? = dynamic>(core::double) → X% f = #C1}) → self::B4
-    : super self::A4::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:38:48: Error: The argument type 'X Function<X>(double)' can't be assigned to the parameter type 'num Function(double)'.
-  B4.two({required X Function<X>(double) super.f}) : super(); // Error.
-                                               ^" in f as{TypeError,ForNonNullableByDefault} (core::double) → core::num)
-    ;
-}
-abstract class C5 extends core::Object {
-  synthetic constructor •() → self::C5
-    : super core::Object::•()
-    ;
-  abstract method call(core::int x, core::num y) → core::String;
-}
-class A5 extends core::Object {
-  constructor •((core::int, core::num) → core::String f) → self::A5
-    : super core::Object::•()
-    ;
-}
-class B5 extends self::A5 {
-  constructor one(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:50:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.one(C5 super.f); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two(self::C5 f) → self::B5
-    : super self::A5::•(invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:51:19: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B5.two(C5 super.f) : super(); // Error.
-                  ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A6 extends core::Object {
-  constructor •({required (core::int, core::num) → core::String f = #C1}) → self::A6
-    : super core::Object::•()
-    ;
-}
-class B6 extends self::A6 {
-  constructor one({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:59:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.one({required C5 super.f}); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-  constructor two({required self::C5 f = #C1}) → self::B6
-    : super self::A6::•(f: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:60:29: Error: The argument type 'C5' can't be assigned to the parameter type 'String Function(int, num)'.
- - 'C5' is from 'pkg/front_end/testcases/super_parameters/no_coercions.dart'.
-  B6.two({required C5 super.f}) : super(); // Error.
-                            ^" in f as{TypeError,ForNonNullableByDefault} (core::int, core::num) → core::String)
-    ;
-}
-class A7 extends core::Object {
-  constructor •({required core::int x1 = #C1, required core::int x2 = #C1, required (core::Object) → core::bool f1 = #C1, required (core::Object) → core::bool f2 = #C1, required (dynamic) → void g1 = #C1, required (dynamic) → void g2 = #C1}) → self::A7
-    : super core::Object::•()
-    ;
-}
-class B7 extends self::A7 {
-  constructor •({required dynamic x1 = #C1, required dynamic x2 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f1 = #C1, required <X extends core::Object? = dynamic>(core::Object) → X% f2 = #C1, required <X extends core::Object? = dynamic>(X%) → void g1 = #C1, required <X extends core::Object? = dynamic>(X%) → void g2 = #C1}) → self::B7
-    : super self::A7::•(x2: x2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, f2: f2<core::bool>, g2: g2<dynamic>, x1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:73:30: Error: The argument type 'dynamic' can't be assigned to the parameter type 'int'.
-  B7({required dynamic super.x1, // Error.
-                             ^" in x1 as{TypeError,ForNonNullableByDefault} core::int, f1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:75:44: Error: The argument type 'X Function<X>(Object)' can't be assigned to the parameter type 'bool Function(Object)'.
- - 'Object' is from 'dart:core'.
-      required X Function<X>(Object) super.f1, // Error.
-                                           ^" in f1 as{TypeError,ForNonNullableByDefault} (core::Object) → core::bool, g1: invalid-expression "pkg/front_end/testcases/super_parameters/no_coercions.dart:77:42: Error: The argument type 'void Function<X>(X)' can't be assigned to the parameter type 'void Function(dynamic)'.
-      required void Function<X>(X) super.g1, // Error.
-                                         ^" in g1 as{TypeError,ForNonNullableByDefault} (dynamic) → void)
-    ;
-}
-static method main() → dynamic {}
-
-constants  {
-  #C1 = null
-}
diff --git a/pkg/js_ast/lib/js_ast.dart b/pkg/js_ast/lib/js_ast.dart
index 43cf8b9..8f75c74 100644
--- a/pkg/js_ast/lib/js_ast.dart
+++ b/pkg/js_ast/lib/js_ast.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.10
+
 library js_ast;
 
 export 'src/nodes.dart';
diff --git a/pkg/js_ast/test/deferred_expression_test.dart b/pkg/js_ast/test/deferred_expression_test.dart
index ecdb774..6415b7ed 100644
--- a/pkg/js_ast/test/deferred_expression_test.dart
+++ b/pkg/js_ast/test/deferred_expression_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.10
+
 import 'package:expect/expect.dart';
 import 'package:js_ast/js_ast.dart';
 
diff --git a/pkg/js_ast/test/deferred_statement_test.dart b/pkg/js_ast/test/deferred_statement_test.dart
index 0d309ae..9bba39a 100644
--- a/pkg/js_ast/test/deferred_statement_test.dart
+++ b/pkg/js_ast/test/deferred_statement_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.10
+
 import 'package:expect/expect.dart';
 import 'package:js_ast/js_ast.dart';
 
diff --git a/pkg/js_ast/test/printer_callback_test.dart b/pkg/js_ast/test/printer_callback_test.dart
index f5477ba..cfd56b9 100644
--- a/pkg/js_ast/test/printer_callback_test.dart
+++ b/pkg/js_ast/test/printer_callback_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.10
+
 // Note: This test relies on LF line endings in the source file.
 
 // Test that JS printer callbacks occur when expected.
diff --git a/pkg/js_ast/test/string_escape_test.dart b/pkg/js_ast/test/string_escape_test.dart
index 78bc758..1b0ce74 100644
--- a/pkg/js_ast/test/string_escape_test.dart
+++ b/pkg/js_ast/test/string_escape_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// @dart = 2.10
+
 library js_ast.string_escape_test;
 
 import 'package:js_ast/js_ast.dart';
diff --git a/pkg/modular_test/lib/src/pipeline.dart b/pkg/modular_test/lib/src/pipeline.dart
index c55f2f9..7e10bac 100644
--- a/pkg/modular_test/lib/src/pipeline.dart
+++ b/pkg/modular_test/lib/src/pipeline.dart
@@ -42,12 +42,20 @@
   /// Whether this step is only executed on the main module.
   final bool onlyOnMain;
 
+  /// Whether this step is only exceuted on the SDK.
+  final bool onlyOnSdk;
+
+  /// Whether this step is not executed on the SDK.
+  final bool notOnSdk;
+
   ModularStep(
       {this.needsSources: true,
       this.dependencyDataNeeded: const [],
       this.moduleDataNeeded: const [],
       this.resultData,
-      this.onlyOnMain: false});
+      this.onlyOnMain: false,
+      this.onlyOnSdk: false,
+      this.notOnSdk: false});
 
   /// Notifies that the step was not executed, but cached instead.
   void notifyCached(Module module) {}
@@ -77,6 +85,11 @@
   }
 
   void _validate() {
+    // Whether or not two steps run on mutually exclusive input data.
+    bool areMutuallyExclusive(S a, S b) {
+      return (a.onlyOnSdk && b.notOnSdk) || (b.onlyOnSdk && a.notOnSdk);
+    }
+
     // Ensure that steps consume only data that was produced by previous steps
     // or by the same step on a dependency.
     Map<DataId, S> previousKinds = {};
@@ -86,7 +99,8 @@
             "'${step.runtimeType}' needs to declare what data it produces.");
       }
       for (var resultKind in step.resultData) {
-        if (previousKinds.containsKey(resultKind)) {
+        if (previousKinds.containsKey(resultKind) &&
+            !areMutuallyExclusive(step, previousKinds[resultKind])) {
           _validationError("Cannot produce the same data on two modular steps."
               " '$resultKind' was previously produced by "
               "'${previousKinds[resultKind].runtimeType}' but "
@@ -140,7 +154,9 @@
       deps.addAll(transitiveDependencies[dependency]);
     }
 
-    if (step.onlyOnMain && !module.isMain) return;
+    if ((step.onlyOnMain && !module.isMain) ||
+        (step.onlyOnSdk && !module.isSdk) ||
+        (step.notOnSdk && module.isSdk)) return;
     // Include only requested data from transitive dependencies.
     Map<Module, Set<DataId>> visibleData = {};
 
diff --git a/pkg/modular_test/test/io_pipeline_test.dart b/pkg/modular_test/test/io_pipeline_test.dart
index db980f8..8176201 100644
--- a/pkg/modular_test/test/io_pipeline_test.dart
+++ b/pkg/modular_test/test/io_pipeline_test.dart
@@ -107,6 +107,8 @@
   List<DataId> get moduleDataNeeded => const [];
   List<DataId> get resultData => [resultId];
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   SourceOnlyStep(this.action, this.resultId, this.needsSources);
 
@@ -137,6 +139,8 @@
   final DataId resultId;
   final DataId inputId;
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   ModuleDataStep(this.action, this.inputId, this.resultId, bool requestInput)
       : moduleDataNeeded = requestInput ? [inputId] : [];
@@ -166,6 +170,8 @@
   final DataId result2Id;
   final DataId inputId;
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   TwoOutputStep(
       this.action1, this.action2, this.inputId, this.result1Id, this.result2Id);
@@ -198,6 +204,8 @@
   final DataId depId;
   final DataId resultId;
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   LinkStep(this.action, this.inputId, this.depId, this.resultId,
       bool requestDependencies)
@@ -230,6 +238,8 @@
   final DataId depId;
   final DataId resultId;
   bool get onlyOnMain => true;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   MainOnlyStep(this.action, this.inputId, this.depId, this.resultId,
       bool requestDependencies)
diff --git a/pkg/modular_test/test/memory_pipeline_test.dart b/pkg/modular_test/test/memory_pipeline_test.dart
index 1d4da36..95ba01d 100644
--- a/pkg/modular_test/test/memory_pipeline_test.dart
+++ b/pkg/modular_test/test/memory_pipeline_test.dart
@@ -86,6 +86,8 @@
   List<DataId> get moduleDataNeeded => const [];
   List<DataId> get resultData => [resultId];
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   SourceOnlyStep(this.action, this.resultId, this.needsSources);
 
@@ -114,6 +116,8 @@
   final DataId resultId;
   final DataId inputId;
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   ModuleDataStep(this.action, this.inputId, this.resultId, bool requestInput)
       : moduleDataNeeded = requestInput ? [inputId] : [];
@@ -144,6 +148,8 @@
   final DataId result2Id;
   final DataId inputId;
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   TwoOutputStep(
       this.action1, this.action2, this.inputId, this.result1Id, this.result2Id);
@@ -177,6 +183,8 @@
   final DataId resultId;
   List<DataId> get resultData => [resultId];
   bool get onlyOnMain => false;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   LinkStep(this.action, this.inputId, this.depId, this.resultId,
       bool requestDependencies)
@@ -208,6 +216,8 @@
   final DataId resultId;
   List<DataId> get resultData => [resultId];
   bool get onlyOnMain => true;
+  bool get onlyOnSdk => false;
+  bool get notOnSdk => false;
 
   MainOnlyStep(this.action, this.inputId, this.depId, this.resultId,
       bool requestDependencies)
diff --git a/tools/VERSION b/tools/VERSION
index 637724d..0bf68a5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 258
+PRERELEASE 259
 PRERELEASE_PATCH 0
\ No newline at end of file
