Version 2.10.0-15.0.dev

Merge commit '274b4d3ecb4b093b42a3386be9ac216187ee8523' into 'dev'
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
index 1e39e30..baaf538 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_relevance_test.dart
@@ -2,9 +2,9 @@
 // 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:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../../src/utilities/mock_packages.dart';
 import 'completion_relevance.dart';
 
 void main() {
@@ -20,13 +20,10 @@
   void setUp() {
     super.setUp();
 
-    var metaPath = '/.pub-cache/meta';
-    PackagesContent.addMetaPackageFiles(
-      getFolder(metaPath),
-    );
+    var metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
 
     newFile('$projectPath/.packages', content: '''
-meta:${toUri('$metaPath/lib')}
+meta:${metaLibFolder.toUri()}
 project:${toUri('$projectPath/lib')}
 ''');
   }
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 6c61866..04f5609 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -433,6 +433,7 @@
   CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
   CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
   CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+  CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,
   CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index 5285ca7..59e5543 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -371,17 +371,21 @@
   ) {
     var element = node.staticElement;
     var typeParameters = element.typeParameters;
-    if (typeParameters.isEmpty) {
-      return const <DartType>[];
-    }
-
     var typeArguments = node.typeArguments;
+
     if (typeArguments != null) {
       var arguments = typeArguments.arguments;
       if (arguments.length == typeParameters.length) {
+        if (typeParameters.isEmpty) {
+          return const <DartType>[];
+        }
         return arguments.map((a) => a.type).toList();
       } else {
-        // TODO(scheglov) Report an error.
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION,
+          typeArguments,
+          [element.name, typeParameters.length, arguments.length],
+        );
         return _listOfDynamic(typeParameters);
       }
     } else {
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index abe9434..6b27004 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -10175,6 +10175,19 @@
           correction: "Try moving type arguments to after the type name.");
 
   /**
+   * Parameters:
+   * 0: the name of the extension being referenced
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION =
+      CompileTimeErrorCode(
+          'WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION',
+          "The extension '{0}' is declared with {1} type parameters, "
+              "but {2} type arguments were given.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
    * It will be a static type warning if <i>m</i> is not a generic method with
    * exactly <i>n</i> type parameters.
    *
diff --git a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart
similarity index 98%
rename from pkg/analyzer/lib/src/test_utilities/package_mixin.dart
rename to pkg/analyzer/lib/src/test_utilities/mock_packages.dart
index 9294d4e..28eeeae 100644
--- a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 
 /// Helper for creating mock packages.
-class PackagesContent {
+class MockPackages {
   /// Create a fake 'js' package that can be used by tests.
   static void addJsPackageFiles(Folder rootFolder) {
     var libFolder = rootFolder.getChildAssumingFolder('lib');
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index b64b7ee..6022962 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -14,8 +14,8 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
@@ -293,7 +293,7 @@
     bool meta = false,
   }) {
     var metaPath = '/packages/meta';
-    PackagesContent.addMetaPackageFiles(
+    MockPackages.addMetaPackageFiles(
       getFolder(metaPath),
     );
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 5aa6ff0..f9dc242 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -295,6 +295,17 @@
     assertErrorsInResolvedUnit(result, expectedErrors);
   }
 
+  void assertExtensionOverride(
+    ExtensionOverride node, {
+    @required Object element,
+    @required String extendedType,
+    @required List<String> typeArgumentTypes,
+  }) {
+    assertElement(node, element);
+    assertType(node.extendedType, extendedType);
+    assertElementTypeStrings(node.typeArgumentTypes, typeArgumentTypes);
+  }
+
   void assertFunctionExpressionInvocation(
     FunctionExpressionInvocation node, {
     @required ExecutableElement element,
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
index 75a5b52..cf8638c 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -165,7 +165,7 @@
   }
 
   test_override_downward_hasTypeArguments_wrongNumber() async {
-    await assertNoErrorsInCode('''
+    await assertErrorsInCode('''
 extension E<T> on Set<T> {
   void foo() {}
 }
@@ -173,7 +173,10 @@
 main() {
   E<int, bool>({}).foo();
 }
-''');
+''', [
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 58,
+          11),
+    ]);
     var literal = findNode.setOrMapLiteral('{}).');
     assertType(literal, 'Set<dynamic>');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index d894e7d..561b4ca 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
@@ -23,7 +23,7 @@
     super.setUp();
 
     var metaPath = '/packages/meta';
-    PackagesContent.addMetaPackageFiles(
+    MockPackages.addMetaPackageFiles(
       getFolder(metaPath),
     );
 
diff --git a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
index 551fbb3..1ad8808 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -22,7 +22,7 @@
     super.setUp();
 
     var path = '/packages/js';
-    PackagesContent.addJsPackageFiles(
+    MockPackages.addJsPackageFiles(
       getFolder(path),
     );
     writeTestPackageConfig({'js': path});
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 1f0b6d6..5a35fa8 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -619,6 +619,8 @@
     as wrong_number_of_parameters_for_operator;
 import 'wrong_number_of_parameters_for_setter_test.dart'
     as wrong_number_of_parameters_for_setter;
+import 'wrong_number_of_type_arguments_extension_test.dart'
+    as wrong_number_of_type_arguments_extension;
 import 'wrong_number_of_type_arguments_test.dart'
     as wrong_number_of_type_arguments;
 import 'wrong_type_parameter_variance_in_superinterface_test.dart'
@@ -1046,6 +1048,7 @@
     void_with_type_arguments_test.main();
     wrong_number_of_parameters_for_operator.main();
     wrong_number_of_parameters_for_setter.main();
+    wrong_number_of_type_arguments_extension.main();
     wrong_number_of_type_arguments.main();
     wrong_type_parameter_variance_in_superinterface.main();
     yield_each_in_non_generator.main();
diff --git a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart
new file mode 100644
index 0000000..e916159
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_extension_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2020, 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:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(WrongNumberOfTypeArgumentsExtensionTest);
+  });
+}
+
+@reflectiveTest
+class WrongNumberOfTypeArgumentsExtensionTest extends PubPackageResolutionTest {
+  test_notGeneric() async {
+    await assertErrorsInCode(r'''
+extension E on int {
+  void foo() {}
+}
+
+void f() {
+  E<int>(0).foo();
+}
+''', [
+      error(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 54, 5),
+    ]);
+
+    assertExtensionOverride(
+      findNode.extensionOverride('E<int>'),
+      element: findElement.extension_('E'),
+      extendedType: 'int',
+      typeArgumentTypes: [],
+    );
+  }
+
+  test_tooFew() async {
+    await assertErrorsInCode(r'''
+extension E<S, T> on int {
+  void foo() {}
+}
+
+void f() {
+  E<bool>(0).foo();
+}
+''', [
+      error(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 60, 6),
+    ]);
+
+    assertExtensionOverride(
+      findNode.extensionOverride('E<bool>'),
+      element: findElement.extension_('E'),
+      extendedType: 'int',
+      typeArgumentTypes: ['dynamic', 'dynamic'],
+    );
+  }
+
+  test_tooMany() async {
+    await assertErrorsInCode(r'''
+extension E<T> on int {
+  void foo() {}
+}
+
+void f() {
+  E<bool, int>(0).foo();
+}
+''', [
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION, 57,
+          11),
+    ]);
+
+    assertExtensionOverride(
+      findNode.extensionOverride('E<bool, int>'),
+      element: findElement.extension_('E'),
+      extendedType: 'int',
+      typeArgumentTypes: ['dynamic'],
+    );
+  }
+}
diff --git a/pkg/vm/lib/transformations/deferred_loading.dart b/pkg/vm/lib/transformations/deferred_loading.dart
index f2b0318..03bb9c2 100644
--- a/pkg/vm/lib/transformations/deferred_loading.dart
+++ b/pkg/vm/lib/transformations/deferred_loading.dart
@@ -9,14 +9,15 @@
 import '../metadata/loading_units.dart';
 
 class _LoadingUnitBuilder {
-  final int id;
+  int id;
   final _LibraryVertex root;
   final List<Library> members = <Library>[];
+  final List<_LoadingUnitBuilder> children = <_LoadingUnitBuilder>[];
 
-  _LoadingUnitBuilder(this.id, this.root);
+  _LoadingUnitBuilder(this.root);
 
-  int get parentId =>
-      root.dominator == null ? 0 : root.dominator.loadingUnit.id;
+  _LoadingUnitBuilder get parent => root.dominator?.loadingUnit;
+  int get parentId => parent == null ? 0 : parent.id;
 
   LoadingUnit asLoadingUnit() {
     return new LoadingUnit(
@@ -82,7 +83,7 @@
   var loadingUnits = <_LoadingUnitBuilder>[];
   for (var vertex in map.values) {
     if (vertex.isLoadingRoot) {
-      var unit = new _LoadingUnitBuilder(loadingUnits.length + 1, vertex);
+      var unit = new _LoadingUnitBuilder(vertex);
       vertex.loadingUnit = unit;
       unit.members.add(vertex.library);
       loadingUnits.add(unit);
@@ -105,6 +106,24 @@
     vertex.loadingUnit.members.add(vertex.library);
   }
 
+  // 4. Sort loading units so parents are before children. Normally this order
+  // would already exist as a side effect of loading sources in import order,
+  // but this isn't guarenteed when combining separately produced kernel files.
+  for (var unit in loadingUnits) {
+    var parent = unit.parent;
+    if (parent != null) {
+      parent.children.add(unit);
+    }
+  }
+  var index = 0;
+  loadingUnits.clear();
+  loadingUnits.add(root.loadingUnit);
+  while (index < loadingUnits.length) {
+    var unit = loadingUnits[index];
+    unit.id = ++index;
+    loadingUnits.addAll(unit.children);
+  }
+
   return loadingUnits.map((u) => u.asLoadingUnit()).toList();
 }
 
diff --git a/pkg/vm/test/transformations/deferred_loading_test.dart b/pkg/vm/test/transformations/deferred_loading_test.dart
index 4b5f961..f36b610 100644
--- a/pkg/vm/test/transformations/deferred_loading_test.dart
+++ b/pkg/vm/test/transformations/deferred_loading_test.dart
@@ -20,6 +20,10 @@
   Component component =
       await compileTestCaseToKernelProgram(source, target: target);
 
+  // Disrupt the import order as a way of simulating issue 42985.
+  final reversed = component.libraries.reversed.toList();
+  component.libraries.setAll(0, reversed);
+
   component = transformComponent(component);
 
   // Remove core libraries so the expected output isn't enormous and broken by
diff --git a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
index 3dbc78e..f6484af 100644
--- a/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
+++ b/pkg/vm/testcases/transformations/deferred_loading/main.dart.expect
@@ -2,39 +2,39 @@
  [@vm.loading-units.metadata=LoadingUnitsMetadata(
 LoadingUnit(id=1, parent=0,
   #lib
-  #pkg/vm/testcases/transformations/deferred_loading/a.dart
-  #pkg/vm/testcases/transformations/deferred_loading/b.dart
-  #pkg/vm/testcases/transformations/deferred_loading/c.dart
-  dart:async
-  dart:collection
-  dart:convert
-  dart:developer
-  dart:ffi
-  dart:_internal
-  dart:isolate
-  dart:math
-  dart:mirrors
-  dart:typed_data
-  dart:vmservice_io
-  dart:_vmservice
-  dart:_builtin
-  dart:nativewrappers
-  dart:io
-  dart:cli
-  dart:wasm
-  dart:core
   dart:_http
+  dart:core
+  dart:wasm
+  dart:cli
+  dart:io
+  dart:nativewrappers
+  dart:_builtin
+  dart:_vmservice
+  dart:vmservice_io
+  dart:typed_data
+  dart:mirrors
+  dart:math
+  dart:isolate
+  dart:_internal
+  dart:ffi
+  dart:developer
+  dart:convert
+  dart:collection
+  dart:async
+  #pkg/vm/testcases/transformations/deferred_loading/c.dart
+  #pkg/vm/testcases/transformations/deferred_loading/b.dart
+  #pkg/vm/testcases/transformations/deferred_loading/a.dart
 )
 LoadingUnit(id=2, parent=1,
-  #pkg/vm/testcases/transformations/deferred_loading/d.dart
-  #pkg/vm/testcases/transformations/deferred_loading/e.dart
+  #pkg/vm/testcases/transformations/deferred_loading/g.dart
+  #pkg/vm/testcases/transformations/deferred_loading/h.dart
 )
 LoadingUnit(id=3, parent=1,
   #pkg/vm/testcases/transformations/deferred_loading/f.dart
 )
 LoadingUnit(id=4, parent=1,
-  #pkg/vm/testcases/transformations/deferred_loading/g.dart
-  #pkg/vm/testcases/transformations/deferred_loading/h.dart
+  #pkg/vm/testcases/transformations/deferred_loading/d.dart
+  #pkg/vm/testcases/transformations/deferred_loading/e.dart
 )
 LoadingUnit(id=5, parent=3,
   #pkg/vm/testcases/transformations/deferred_loading/i.dart
@@ -42,12 +42,11 @@
 LoadingUnit(id=6, parent=5,
   #pkg/vm/testcases/transformations/deferred_loading/j.dart
 )
-)]library #lib from "#lib" as #lib {
+)]library j from "#pkg/vm/testcases/transformations/deferred_loading/j.dart" as j {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/a.dart";
-  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
+  import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
 
-  static method main() → dynamic /* originally async */ {
+  static method j() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -55,15 +54,11 @@
     (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = dart.async::_awaitHelper(a::a(), :async_op_then, :async_op_error, :async_op) in null;
-          :result;
-          [yield] let dynamic #t2 = dart.async::_awaitHelper(b::b(), :async_op_then, :async_op_error, :async_op) in null;
-          :result;
+          dart.core::print("J");
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
         return;
@@ -78,11 +73,43 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library a from "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a {
+library h from "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
+  import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
 
-  static method a() → dynamic /* originally async */ {
+  static method h() → dynamic /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
+    FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    (dynamic) →* dynamic :async_op_then;
+    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
+    dart.core::int* :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          dart.core::print("H");
+        }
+        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
+        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
+      }
+    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
+    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
+    return :async_completer.{dart.async::Completer::future};
+  }
+}
+library i from "#pkg/vm/testcases/transformations/deferred_loading/i.dart" as i {
+
+  import "#pkg/vm/testcases/transformations/deferred_loading/j.dart" deferred as j;
+  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+
+  static method i() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -93,45 +120,12 @@
     dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
-        #L2:
-        {
-          dart.core::print("A");
-          [yield] let dynamic #t3 = dart.async::_awaitHelper(LoadLibrary(d), :async_op_then, :async_op_error, :async_op) in null;
-          :result;
-          :return_value = let final dynamic #t4 = CheckLibraryIsLoaded(d) in d::d();
-          break #L2;
-        }
-        dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic exception, dart.core::StackTrace* stack_trace) {
-        :async_completer.{dart.async::Completer::completeError}(exception, stack_trace);
-      }
-    :async_stack_trace = dart.async::_asyncStackTraceHelper(:async_op);
-    :async_op_then = dart.async::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = dart.async::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.{dart.async::_AsyncAwaitCompleter::start}(:async_op);
-    return :async_completer.{dart.async::Completer::future};
-  }
-}
-library b from "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b {
-
-  import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
-
-  static method b() → dynamic /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
-    FutureOr<dynamic>* :return_value;
-    dynamic :async_stack_trace;
-    (dynamic) →* dynamic :async_op_then;
-    (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
-    dart.core::int* :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
         #L3:
         {
-          dart.core::print("B");
-          :return_value = c::c();
+          dart.core::print("I");
+          [yield] let dynamic #t1 = dart.async::_awaitHelper(LoadLibrary(j), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          :return_value = let final dynamic #t2 = CheckLibraryIsLoaded(j) in j::j();
           break #L3;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -147,11 +141,11 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library d from "#pkg/vm/testcases/transformations/deferred_loading/d.dart" as d {
+library g from "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
+  import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
 
-  static method d() → dynamic /* originally async */ {
+  static method g() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -163,9 +157,7 @@
       try {
         #L4:
         {
-          dart.core::print("D");
-          :return_value = e::e();
-          break #L4;
+          dart.core::print("G");
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
         return;
@@ -180,12 +172,12 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library c from "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c {
+library f from "#pkg/vm/testcases/transformations/deferred_loading/f.dart" as f {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
-  import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
+  import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
+  import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
 
-  static method c() → dynamic /* originally async */ {
+  static method f() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -198,10 +190,14 @@
       try {
         #L5:
         {
-          dart.core::print("C");
-          [yield] let dynamic #t5 = dart.async::_awaitHelper(LoadLibrary(f), :async_op_then, :async_op_error, :async_op) in null;
+          dart.core::print("F");
+          [yield] let dynamic #t3 = dart.async::_awaitHelper(LoadLibrary(g), :async_op_then, :async_op_error, :async_op) in null;
           :result;
-          :return_value = let final dynamic #t6 = CheckLibraryIsLoaded(f) in f::f();
+          :return_value = let final dynamic #t4 = CheckLibraryIsLoaded(g) in g::g();
+          break #L5;
+          [yield] let dynamic #t5 = dart.async::_awaitHelper(LoadLibrary(i), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          :return_value = let final dynamic #t6 = CheckLibraryIsLoaded(i) in i::i();
           break #L5;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -253,12 +249,12 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library f from "#pkg/vm/testcases/transformations/deferred_loading/f.dart" as f {
+library c from "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" deferred as g;
-  import "#pkg/vm/testcases/transformations/deferred_loading/i.dart" deferred as i;
+  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+  import "#pkg/vm/testcases/transformations/deferred_loading/f.dart" deferred as f;
 
-  static method f() → dynamic /* originally async */ {
+  static method c() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -271,14 +267,10 @@
       try {
         #L7:
         {
-          dart.core::print("F");
-          [yield] let dynamic #t9 = dart.async::_awaitHelper(LoadLibrary(g), :async_op_then, :async_op_error, :async_op) in null;
+          dart.core::print("C");
+          [yield] let dynamic #t9 = dart.async::_awaitHelper(LoadLibrary(f), :async_op_then, :async_op_error, :async_op) in null;
           :result;
-          :return_value = let final dynamic #t10 = CheckLibraryIsLoaded(g) in g::g();
-          break #L7;
-          [yield] let dynamic #t11 = dart.async::_awaitHelper(LoadLibrary(i), :async_op_then, :async_op_error, :async_op) in null;
-          :result;
-          :return_value = let final dynamic #t12 = CheckLibraryIsLoaded(i) in i::i();
+          :return_value = let final dynamic #t10 = CheckLibraryIsLoaded(f) in f::f();
           break #L7;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -294,11 +286,11 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library g from "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g {
+library d from "#pkg/vm/testcases/transformations/deferred_loading/d.dart" as d {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h;
+  import "#pkg/vm/testcases/transformations/deferred_loading/e.dart" as e;
 
-  static method g() → dynamic /* originally async */ {
+  static method d() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -310,7 +302,9 @@
       try {
         #L8:
         {
-          dart.core::print("G");
+          dart.core::print("D");
+          :return_value = e::e();
+          break #L8;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
         return;
@@ -325,12 +319,11 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library i from "#pkg/vm/testcases/transformations/deferred_loading/i.dart" as i {
+library b from "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/j.dart" deferred as j;
-  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart" as b;
+  import "#pkg/vm/testcases/transformations/deferred_loading/c.dart" as c;
 
-  static method i() → dynamic /* originally async */ {
+  static method b() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -338,15 +331,12 @@
     (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L9:
         {
-          dart.core::print("I");
-          [yield] let dynamic #t13 = dart.async::_awaitHelper(LoadLibrary(j), :async_op_then, :async_op_error, :async_op) in null;
-          :result;
-          :return_value = let final dynamic #t14 = CheckLibraryIsLoaded(j) in j::j();
+          dart.core::print("B");
+          :return_value = c::c();
           break #L9;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -362,11 +352,11 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library h from "#pkg/vm/testcases/transformations/deferred_loading/h.dart" as h {
+library a from "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/g.dart" as g;
+  import "#pkg/vm/testcases/transformations/deferred_loading/d.dart" deferred as d;
 
-  static method h() → dynamic /* originally async */ {
+  static method a() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -374,11 +364,16 @@
     (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L10:
         {
-          dart.core::print("H");
+          dart.core::print("A");
+          [yield] let dynamic #t11 = dart.async::_awaitHelper(LoadLibrary(d), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          :return_value = let final dynamic #t12 = CheckLibraryIsLoaded(d) in d::d();
+          break #L10;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
         return;
@@ -393,11 +388,12 @@
     return :async_completer.{dart.async::Completer::future};
   }
 }
-library j from "#pkg/vm/testcases/transformations/deferred_loading/j.dart" as j {
+library #lib from "#lib" as #lib {
 
-  import "#pkg/vm/testcases/transformations/deferred_loading/a.dart" as a;
+  import "#pkg/vm/testcases/transformations/deferred_loading/a.dart";
+  import "#pkg/vm/testcases/transformations/deferred_loading/b.dart";
 
-  static method j() → dynamic /* originally async */ {
+  static method main() → dynamic /* originally async */ {
     final dart.async::_AsyncAwaitCompleter<dynamic>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dynamic>();
     FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
@@ -405,11 +401,15 @@
     (dart.core::Object*, dart.core::StackTrace*) →* dynamic :async_op_error;
     dart.core::int* :await_jump_var = 0;
     dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
     function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
       try {
         #L11:
         {
-          dart.core::print("J");
+          [yield] let dynamic #t13 = dart.async::_awaitHelper(a::a(), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
+          [yield] let dynamic #t14 = dart.async::_awaitHelper(b::b(), :async_op_then, :async_op_error, :async_op) in null;
+          :result;
         }
         dart.async::_completeOnAsyncReturn(:async_completer, :return_value);
         return;
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 2465c8b..7106518 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -90,10 +90,13 @@
   script.GetTokenLocation(assertion_start, &from_line, &from_column);
   intptr_t to_line, to_column;
   script.GetTokenLocation(assertion_end, &to_line, &to_column);
-  // The snippet will extract the correct assertion code even if the source
-  // is generated.
-  args.SetAt(0, String::Handle(script.GetSnippet(from_line, from_column,
-                                                 to_line, to_column)));
+  // Extract the assertion condition text (if source is available).
+  auto& condition_text = String::Handle(
+      script.GetSnippet(from_line, from_column, to_line, to_column));
+  if (condition_text.IsNull()) {
+    condition_text = Symbols::OptimizedOut().raw();
+  }
+  args.SetAt(0, condition_text);
 
   // Initialize location arguments starting at position 1.
   // Do not set a column if the source has been generated as it will be wrong.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index f535c91..34cc58e 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -213,12 +213,6 @@
       }
     }
 
-    if (FLAG_print_classes) {
-      for (intptr_t i = 0; i < class_array.Length(); i++) {
-        cls ^= class_array.At(i);
-        PrintClassInformation(cls);
-      }
-    }
     // Clear pending classes array.
     class_array = GrowableObjectArray::New();
     object_store->set_pending_classes(class_array);
@@ -1161,6 +1155,9 @@
   }
   // Mark as loaded and finalized.
   cls.Finalize();
+  if (FLAG_print_classes) {
+    PrintClassInformation(cls);
+  }
   FinalizeMemberTypes(cls);
 
   if (cls.is_enum_class()) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index a1ea46f..1785105 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1829,8 +1829,9 @@
     unit.set_id(id);
 
     intptr_t parent_id = helper_->ReadUInt();
+    RELEASE_ASSERT(parent_id < id);
     parent ^= loading_units.At(parent_id);
-    ASSERT(parent.IsNull() == (parent_id == 0));
+    RELEASE_ASSERT(parent.IsNull() == (parent_id == 0));
     unit.set_parent(parent);
 
     intptr_t library_count = helper_->ReadUInt();
@@ -2001,8 +2002,11 @@
 
 NameIndex KernelReaderHelper::ReadInterfaceMemberNameReference() {
   NameIndex name_index = reader_.ReadCanonicalNameReference();
-  reader_
-      .ReadCanonicalNameReference();  // read interface target origin reference
+  NameIndex origin_name_index = reader_.ReadCanonicalNameReference();
+  if (!FLAG_precompiled_mode && origin_name_index != NameIndex::kInvalidName) {
+    // Reference to a skipped member signature target, return the origin target.
+    return origin_name_index;
+  }
   return name_index;
 }
 
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 092af49..a992ff3 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1947,7 +1947,16 @@
   ProcedureHelper procedure_helper(&helper_);
 
   procedure_helper.ReadUntilExcluding(ProcedureHelper::kAnnotations);
-  if (procedure_helper.IsRedirectingFactoryConstructor()) {
+  // CFE adds 'member signature' abstract functions to a legacy class deriving
+  // or implementing an opted-in interface. The signature of these functions is
+  // legacy erased and used as the target of interface calls. They are used for
+  // static reasoning about the program by CFE, but not really needed by the VM.
+  // In certain situations (e.g. issue 162073826), a large number of these
+  // additional functions can cause strain on the VM. They are therefore skipped
+  // in jit mode and their associated origin function is used instead as
+  // interface call target.
+  if (procedure_helper.IsRedirectingFactoryConstructor() ||
+      (!FLAG_precompiled_mode && procedure_helper.IsMemberSignature())) {
     helper_.SetOffset(procedure_end);
     return;
   }
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 8e2c533..341e4fb 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -79,7 +79,7 @@
 
     // Getter invocation might actually be a method extraction.
     if (is_getter) {
-      function = cls.LookupDynamicFunction(demangled_getter_name);
+      function = lookup(cls, demangled_getter_name);
       if (!function.IsNull()) {
         if (allow_add && FLAG_lazy_dispatchers) {
           // We were looking for the getter but found a method with the same
@@ -136,7 +136,7 @@
     bool allow_add) {
   return ResolveDynamicForReceiverClassWithCustomLookup(
       receiver_class, function_name, args_desc, allow_add,
-      &Class::LookupDynamicFunction);
+      std::mem_fn(&Class::LookupDynamicFunction));
 }
 
 FunctionPtr Resolver::ResolveDynamicForReceiverClassAllowPrivate(
@@ -146,7 +146,7 @@
     bool allow_add) {
   return ResolveDynamicForReceiverClassWithCustomLookup(
       receiver_class, function_name, args_desc, allow_add,
-      &Class::LookupDynamicFunctionAllowPrivate);
+      std::mem_fn(&Class::LookupDynamicFunctionAllowPrivate));
 }
 
 FunctionPtr Resolver::ResolveDynamicAnyArgs(Zone* zone,
diff --git a/tools/VERSION b/tools/VERSION
index 2fcf00b..915ea8e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 14
+PRERELEASE 15
 PRERELEASE_PATCH 0
\ No newline at end of file