Version 2.15.0-3.0.dev

Merge commit '7fe597bd8ea8f3ce90ae0773eb050488051e1dda' into 'dev'
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 afc3556..1b5b4f4 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -414,16 +414,6 @@
   }
 }
 
-mixin WithNullSafetyMixin on PubPackageResolutionTest {
-  // TODO(https://github.com/dart-lang/sdk/issues/44666): This mixin is a no-op
-  // on PubPackageResolutionTest; remove its usage and remove it.
-  @override
-  String? get testPackageLanguageVersion => '2.14';
-
-  @override
-  bool get typeToStringWithNullability => true;
-}
-
 mixin WithoutConstructorTearoffsMixin on PubPackageResolutionTest {
   @override
   String? get testPackageLanguageVersion => '2.13';
diff --git a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
index bafbda4..d0681f0 100644
--- a/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/language_version_test.dart
@@ -101,9 +101,6 @@
 
 @reflectiveTest
 class NullSafetyUsingAllowedExperimentsTest extends _FeaturesTest {
-  @override
-  bool get typeToStringWithNullability => true;
-
   test_jsonConfig_disable_bin() async {
     _configureAllowedExperimentsTestNullSafety();
 
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index dc81aab..f0523f1 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -11,16 +11,132 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(PrefixedIdentifierResolutionTest);
-    defineReflectiveTests(PrefixedIdentifierResolutionWithNullSafetyTest);
-    defineReflectiveTests(
-      PrefixedIdentifierResolutionWithNonFunctionTypeAliasesTest,
-    );
+    defineReflectiveTests(PrefixedIdentifierResolutionWithoutNullSafetyTest);
   });
 }
 
 @reflectiveTest
 class PrefixedIdentifierResolutionTest extends PubPackageResolutionTest
-    with WithoutNullSafetyMixin {
+    with PrefixedIdentifierResolutionTestCases {
+  test_deferredImportPrefix_loadLibrary_optIn_fromOptOut() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.7
+import 'a.dart' deferred as a;
+
+main() {
+  a.loadLibrary;
+}
+''', [
+      error(HintCode.UNUSED_IMPORT, 22, 8),
+    ]);
+
+    var import = findElement.importFind('package:test/a.dart');
+
+    assertPrefixedIdentifier(
+      findNode.prefixed('a.loadLibrary'),
+      element: elementMatcher(
+        import.importedLibrary.loadLibraryFunction,
+        isLegacy: true,
+      ),
+      type: 'Future<dynamic>* Function()*',
+    );
+  }
+
+  test_hasReceiver_typeAlias_staticGetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static int get foo => 0;
+}
+
+typedef B = A;
+
+void f() {
+  B.foo;
+}
+''');
+
+    assertPrefixedIdentifier(
+      findNode.prefixed('B.foo'),
+      element: findElement.getter('foo'),
+      type: 'int',
+    );
+
+    assertTypeAliasRef(
+      findNode.simple('B.foo'),
+      findElement.typeAlias('B'),
+    );
+
+    assertSimpleIdentifier(
+      findNode.simple('foo;'),
+      element: findElement.getter('foo'),
+      type: 'int',
+    );
+  }
+
+  test_implicitCall_tearOff_nullable() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+class A {
+  int call() => 0;
+}
+
+A? a;
+''');
+    await assertErrorsInCode('''
+import 'a.dart';
+
+int Function() foo() {
+  return a;
+}
+''', [
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
+    ]);
+
+    var identifier = findNode.simple('a;');
+    assertElement(
+      identifier,
+      findElement.importFind('package:test/a.dart').topGet('a'),
+    );
+    assertType(identifier, 'A?');
+  }
+
+  test_read_typedef_interfaceType() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+typedef A = List<int>;
+''');
+
+    await assertNoErrorsInCode('''
+import 'a.dart' as p;
+
+void f() {
+  p.A;
+}
+''');
+
+    var importFind = findElement.importFind('package:test/a.dart');
+    var A = importFind.typeAlias('A');
+
+    var prefixed = findNode.prefixed('p.A');
+    assertPrefixedIdentifier(
+      prefixed,
+      element: A,
+      type: 'Type',
+    );
+
+    assertImportPrefix(prefixed.prefix, importFind.prefix);
+
+    assertSimpleIdentifier(
+      prefixed.identifier,
+      element: A,
+      type: 'Type',
+    );
+  }
+}
+
+mixin PrefixedIdentifierResolutionTestCases on PubPackageResolutionTest {
   test_dynamic_explicitCore_withPrefix() async {
     await assertNoErrorsInCode(r'''
 import 'dart:core' as mycore;
@@ -289,126 +405,6 @@
 }
 
 @reflectiveTest
-class PrefixedIdentifierResolutionWithNonFunctionTypeAliasesTest
-    extends PubPackageResolutionTest {
-  test_hasReceiver_typeAlias_staticGetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static int get foo => 0;
-}
-
-typedef B = A;
-
-void f() {
-  B.foo;
-}
-''');
-
-    assertPrefixedIdentifier(
-      findNode.prefixed('B.foo'),
-      element: findElement.getter('foo'),
-      type: 'int',
-    );
-
-    assertTypeAliasRef(
-      findNode.simple('B.foo'),
-      findElement.typeAlias('B'),
-    );
-
-    assertSimpleIdentifier(
-      findNode.simple('foo;'),
-      element: findElement.getter('foo'),
-      type: 'int',
-    );
-  }
-
-  test_read_typedef_interfaceType() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-typedef A = List<int>;
-''');
-
-    await assertNoErrorsInCode('''
-import 'a.dart' as p;
-
-void f() {
-  p.A;
-}
-''');
-
-    var importFind = findElement.importFind('package:test/a.dart');
-    var A = importFind.typeAlias('A');
-
-    var prefixed = findNode.prefixed('p.A');
-    assertPrefixedIdentifier(
-      prefixed,
-      element: A,
-      type: 'Type',
-    );
-
-    assertImportPrefix(prefixed.prefix, importFind.prefix);
-
-    assertSimpleIdentifier(
-      prefixed.identifier,
-      element: A,
-      type: 'Type',
-    );
-  }
-}
-
-@reflectiveTest
-class PrefixedIdentifierResolutionWithNullSafetyTest
-    extends PrefixedIdentifierResolutionTest with WithNullSafetyMixin {
-  test_deferredImportPrefix_loadLibrary_optIn_fromOptOut() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-class A {}
-''');
-
-    await assertErrorsInCode(r'''
-// @dart = 2.7
-import 'a.dart' deferred as a;
-
-main() {
-  a.loadLibrary;
-}
-''', [
-      error(HintCode.UNUSED_IMPORT, 22, 8),
-    ]);
-
-    var import = findElement.importFind('package:test/a.dart');
-
-    assertPrefixedIdentifier(
-      findNode.prefixed('a.loadLibrary'),
-      element: elementMatcher(
-        import.importedLibrary.loadLibraryFunction,
-        isLegacy: true,
-      ),
-      type: 'Future<dynamic>* Function()*',
-    );
-  }
-
-  test_implicitCall_tearOff_nullable() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-class A {
-  int call() => 0;
-}
-
-A? a;
-''');
-    await assertErrorsInCode('''
-import 'a.dart';
-
-int Function() foo() {
-  return a;
-}
-''', [
-      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
-    ]);
-
-    var identifier = findNode.simple('a;');
-    assertElement(
-      identifier,
-      findElement.importFind('package:test/a.dart').topGet('a'),
-    );
-    assertType(identifier, 'A?');
-  }
-}
+class PrefixedIdentifierResolutionWithoutNullSafetyTest
+    extends PubPackageResolutionTest
+    with PrefixedIdentifierResolutionTestCases, WithoutNullSafetyMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
index 733a4aa..711acd8 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
@@ -12,511 +12,13 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(TypeNameResolutionTest);
-    defineReflectiveTests(TypeNameResolutionWithNullSafetyTest);
-    defineReflectiveTests(TypeNameResolutionWithNonFunctionTypeAliasesTest);
+    defineReflectiveTests(TypeNameResolutionWithoutNullSafetyTest);
   });
 }
 
 @reflectiveTest
 class TypeNameResolutionTest extends PubPackageResolutionTest
-    with WithoutNullSafetyMixin {
-  @override
-  bool get typeToStringWithNullability => true;
-
-  test_class() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-
-f(A a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('A a'),
-      findElement.class_('A'),
-      typeStr('A', 'A*'),
-    );
-  }
-
-  test_class_generic_toBounds() async {
-    await assertNoErrorsInCode(r'''
-class A<T extends num> {}
-
-f(A a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('A a'),
-      findElement.class_('A'),
-      typeStr('A<num>', 'A<num*>*'),
-    );
-  }
-
-  test_class_generic_toBounds_dynamic() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-f(A a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('A a'),
-      findElement.class_('A'),
-      typeStr('A<dynamic>', 'A<dynamic>*'),
-    );
-  }
-
-  test_class_generic_typeArguments() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-f(A<int> a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('A<int> a'),
-      findElement.class_('A'),
-      typeStr('A<int>', 'A<int*>*'),
-    );
-  }
-
-  test_dynamic_explicitCore() async {
-    await assertNoErrorsInCode(r'''
-import 'dart:core';
-
-dynamic a;
-''');
-
-    assertTypeName(
-      findNode.typeName('dynamic a;'),
-      dynamicElement,
-      'dynamic',
-    );
-  }
-
-  test_dynamic_explicitCore_withPrefix() async {
-    await assertNoErrorsInCode(r'''
-import 'dart:core' as mycore;
-
-mycore.dynamic a;
-''');
-
-    assertTypeName(
-      findNode.typeName('mycore.dynamic a;'),
-      dynamicElement,
-      'dynamic',
-      expectedPrefix: findElement.import('dart:core').prefix,
-    );
-  }
-
-  test_dynamic_explicitCore_withPrefix_referenceWithout() async {
-    await assertErrorsInCode(r'''
-import 'dart:core' as mycore;
-
-dynamic a;
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_CLASS, 31, 7),
-    ]);
-
-    assertTypeName(
-      findNode.typeName('dynamic a;'),
-      null,
-      'dynamic',
-    );
-  }
-
-  test_dynamic_implicitCore() async {
-    await assertNoErrorsInCode(r'''
-dynamic a;
-''');
-
-    assertTypeName(
-      findNode.typeName('dynamic a;'),
-      dynamicElement,
-      'dynamic',
-    );
-  }
-
-  test_functionTypeAlias() async {
-    await assertNoErrorsInCode(r'''
-typedef F = int Function();
-
-f(F a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('F a'),
-      findElement.typeAlias('F'),
-      typeStr('int Function()', 'int* Function()*'),
-    );
-  }
-
-  test_functionTypeAlias_generic_toBounds() async {
-    await assertNoErrorsInCode(r'''
-typedef F<T extends num> = T Function();
-
-f(F a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('F a'),
-      findElement.typeAlias('F'),
-      typeStr('num Function()', 'num* Function()*'),
-    );
-  }
-
-  test_functionTypeAlias_generic_toBounds_dynamic() async {
-    await assertNoErrorsInCode(r'''
-typedef F<T> = T Function();
-
-f(F a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('F a'),
-      findElement.typeAlias('F'),
-      typeStr('dynamic Function()', 'dynamic Function()*'),
-    );
-  }
-
-  test_functionTypeAlias_generic_typeArguments() async {
-    await assertNoErrorsInCode(r'''
-typedef F<T> = T Function();
-
-f(F<int> a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('F<int> a'),
-      findElement.typeAlias('F'),
-      typeStr('int Function()', 'int* Function()*'),
-    );
-  }
-
-  test_instanceCreation_explicitNew_prefix_unresolvedClass() async {
-    await assertErrorsInCode(r'''
-import 'dart:math' as math;
-
-main() {
-  new math.A();
-}
-''', [
-      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 49, 1),
-    ]);
-
-    assertTypeName(
-      findNode.typeName('A();'),
-      null,
-      'dynamic',
-      expectedPrefix: findElement.prefix('math'),
-    );
-  }
-
-  test_instanceCreation_explicitNew_resolvedClass() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-
-main() {
-  new A();
-}
-''');
-
-    assertTypeName(
-      findNode.typeName('A();'),
-      findElement.class_('A'),
-      typeStr('A', 'A*'),
-    );
-  }
-
-  test_instanceCreation_explicitNew_unresolvedClass() async {
-    await assertErrorsInCode(r'''
-main() {
-  new A();
-}
-''', [
-      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 15, 1),
-    ]);
-
-    assertTypeName(
-      findNode.typeName('A();'),
-      null,
-      'dynamic',
-    );
-  }
-
-  test_invalid_prefixedIdentifier_instanceCreation() async {
-    await assertErrorsInCode(r'''
-void f() {
-  new int.double.other();
-}
-''', [
-      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 17, 10),
-    ]);
-
-    assertTypeName(
-      findNode.typeName('int.double'),
-      null,
-      'dynamic',
-      expectedPrefix: intElement,
-    );
-  }
-
-  test_invalid_prefixedIdentifier_literal() async {
-    await assertErrorsInCode(r'''
-void f() {
-  0 as int.double;
-}
-''', [
-      error(CompileTimeErrorCode.NOT_A_TYPE, 18, 10),
-    ]);
-
-    assertTypeName(
-      findNode.typeName('int.double'),
-      null,
-      'dynamic',
-      expectedPrefix: intElement,
-    );
-  }
-
-  test_never() async {
-    await assertNoErrorsInCode(r'''
-f(Never a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('Never a'),
-      neverElement,
-      typeStr('Never', 'Null*'),
-    );
-  }
-}
-
-@reflectiveTest
-class TypeNameResolutionWithNonFunctionTypeAliasesTest
-    extends PubPackageResolutionTest {
-  test_typeAlias_asInstanceCreation_explicitNew_typeArguments_interfaceType_none() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-typedef X<T> = A<T>;
-
-void f() {
-  new X<int>();
-}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<int>()'),
-      findElement.typeAlias('X'),
-      'A<int>',
-    );
-  }
-
-  test_typeAlias_asInstanceCreation_implicitNew_toBounds_noTypeParameters_interfaceType_none() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-typedef X = A<int>;
-
-void f() {
-  X();
-}
-''');
-
-    assertTypeName(
-      findNode.typeName('X()'),
-      findElement.typeAlias('X'),
-      'A<int>',
-    );
-  }
-
-  test_typeAlias_asInstanceCreation_implicitNew_typeArguments_interfaceType_none() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-typedef X<T> = A<T>;
-
-void f() {
-  X<int>();
-}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<int>()'),
-      findElement.typeAlias('X'),
-      'A<int>',
-    );
-  }
-
-  test_typeAlias_asParameterType_interfaceType_none() async {
-    await assertNoErrorsInCode(r'''
-typedef X<T> = Map<int, T>;
-void f(X<String> a, X<String?> b) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<String>'),
-      findElement.typeAlias('X'),
-      'Map<int, String>',
-    );
-
-    assertTypeName(
-      findNode.typeName('X<String?>'),
-      findElement.typeAlias('X'),
-      'Map<int, String?>',
-    );
-  }
-
-  test_typeAlias_asParameterType_interfaceType_none_inLegacy() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-typedef X<T> = Map<int, T>;
-''');
-    await assertNoErrorsInCode(r'''
-// @dart = 2.9
-import 'a.dart';
-void f(X<String> a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<String>'),
-      findElement.importFind('package:test/a.dart').typeAlias('X'),
-      'Map<int*, String*>*',
-    );
-  }
-
-  test_typeAlias_asParameterType_interfaceType_question() async {
-    await assertNoErrorsInCode(r'''
-typedef X<T> = List<T?>;
-void f(X<int> a, X<int?> b) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<int>'),
-      findElement.typeAlias('X'),
-      'List<int?>',
-    );
-
-    assertTypeName(
-      findNode.typeName('X<int?>'),
-      findElement.typeAlias('X'),
-      'List<int?>',
-    );
-  }
-
-  test_typeAlias_asParameterType_interfaceType_question_inLegacy() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-typedef X<T> = List<T?>;
-''');
-    await assertNoErrorsInCode(r'''
-// @dart = 2.9
-import 'a.dart';
-void f(X<int> a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<int>'),
-      findElement.importFind('package:test/a.dart').typeAlias('X'),
-      'List<int*>*',
-    );
-  }
-
-  test_typeAlias_asParameterType_Never_none() async {
-    await assertNoErrorsInCode(r'''
-typedef X = Never;
-void f(X a, X? b) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X a'),
-      findElement.typeAlias('X'),
-      'Never',
-    );
-
-    assertTypeName(
-      findNode.typeName('X? b'),
-      findElement.typeAlias('X'),
-      'Never?',
-    );
-  }
-
-  test_typeAlias_asParameterType_Never_none_inLegacy() async {
-    newFile('$testPackageLibPath/a.dart', content: r'''
-typedef X = Never;
-''');
-    await assertNoErrorsInCode(r'''
-// @dart = 2.9
-import 'a.dart';
-void f(X a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X a'),
-      findElement.importFind('package:test/a.dart').typeAlias('X'),
-      'Null*',
-    );
-  }
-
-  test_typeAlias_asParameterType_Never_question() async {
-    await assertNoErrorsInCode(r'''
-typedef X = Never?;
-void f(X a, X? b) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X a'),
-      findElement.typeAlias('X'),
-      'Never?',
-    );
-
-    assertTypeName(
-      findNode.typeName('X? b'),
-      findElement.typeAlias('X'),
-      'Never?',
-    );
-  }
-
-  test_typeAlias_asParameterType_question() async {
-    await assertNoErrorsInCode(r'''
-typedef X<T> = T?;
-void f(X<int> a) {}
-''');
-
-    assertTypeName(
-      findNode.typeName('X<int>'),
-      findElement.typeAlias('X'),
-      'int?',
-    );
-  }
-
-  test_typeAlias_asReturnType_interfaceType() async {
-    await assertNoErrorsInCode(r'''
-typedef X<T> = Map<int, T>;
-X<String> f() => {};
-''');
-
-    assertTypeName(
-      findNode.typeName('X<String>'),
-      findElement.typeAlias('X'),
-      'Map<int, String>',
-    );
-  }
-
-  test_typeAlias_asReturnType_void() async {
-    await assertNoErrorsInCode(r'''
-typedef Nothing = void;
-Nothing f() {}
-''');
-
-    assertTypeName(
-      findNode.typeName('Nothing f()'),
-      findElement.typeAlias('Nothing'),
-      'void',
-    );
-  }
-}
-
-@reflectiveTest
-class TypeNameResolutionWithNullSafetyTest extends TypeNameResolutionTest
-    with WithNullSafetyMixin {
+    with TypeNameResolutionTestCases {
   ImportFindElement get import_a {
     return findElement.importFind('package:test/a.dart');
   }
@@ -860,4 +362,499 @@
       'int* Function()',
     );
   }
+
+  test_typeAlias_asInstanceCreation_explicitNew_typeArguments_interfaceType_none() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+typedef X<T> = A<T>;
+
+void f() {
+  new X<int>();
+}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<int>()'),
+      findElement.typeAlias('X'),
+      'A<int>',
+    );
+  }
+
+  test_typeAlias_asInstanceCreation_implicitNew_toBounds_noTypeParameters_interfaceType_none() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+typedef X = A<int>;
+
+void f() {
+  X();
+}
+''');
+
+    assertTypeName(
+      findNode.typeName('X()'),
+      findElement.typeAlias('X'),
+      'A<int>',
+    );
+  }
+
+  test_typeAlias_asInstanceCreation_implicitNew_typeArguments_interfaceType_none() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+typedef X<T> = A<T>;
+
+void f() {
+  X<int>();
+}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<int>()'),
+      findElement.typeAlias('X'),
+      'A<int>',
+    );
+  }
+
+  test_typeAlias_asParameterType_interfaceType_none() async {
+    await assertNoErrorsInCode(r'''
+typedef X<T> = Map<int, T>;
+void f(X<String> a, X<String?> b) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<String>'),
+      findElement.typeAlias('X'),
+      'Map<int, String>',
+    );
+
+    assertTypeName(
+      findNode.typeName('X<String?>'),
+      findElement.typeAlias('X'),
+      'Map<int, String?>',
+    );
+  }
+
+  test_typeAlias_asParameterType_interfaceType_none_inLegacy() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+typedef X<T> = Map<int, T>;
+''');
+    await assertNoErrorsInCode(r'''
+// @dart = 2.9
+import 'a.dart';
+void f(X<String> a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<String>'),
+      findElement.importFind('package:test/a.dart').typeAlias('X'),
+      'Map<int*, String*>*',
+    );
+  }
+
+  test_typeAlias_asParameterType_interfaceType_question() async {
+    await assertNoErrorsInCode(r'''
+typedef X<T> = List<T?>;
+void f(X<int> a, X<int?> b) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<int>'),
+      findElement.typeAlias('X'),
+      'List<int?>',
+    );
+
+    assertTypeName(
+      findNode.typeName('X<int?>'),
+      findElement.typeAlias('X'),
+      'List<int?>',
+    );
+  }
+
+  test_typeAlias_asParameterType_interfaceType_question_inLegacy() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+typedef X<T> = List<T?>;
+''');
+    await assertNoErrorsInCode(r'''
+// @dart = 2.9
+import 'a.dart';
+void f(X<int> a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<int>'),
+      findElement.importFind('package:test/a.dart').typeAlias('X'),
+      'List<int*>*',
+    );
+  }
+
+  test_typeAlias_asParameterType_Never_none() async {
+    await assertNoErrorsInCode(r'''
+typedef X = Never;
+void f(X a, X? b) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X a'),
+      findElement.typeAlias('X'),
+      'Never',
+    );
+
+    assertTypeName(
+      findNode.typeName('X? b'),
+      findElement.typeAlias('X'),
+      'Never?',
+    );
+  }
+
+  test_typeAlias_asParameterType_Never_none_inLegacy() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+typedef X = Never;
+''');
+    await assertNoErrorsInCode(r'''
+// @dart = 2.9
+import 'a.dart';
+void f(X a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X a'),
+      findElement.importFind('package:test/a.dart').typeAlias('X'),
+      'Null*',
+    );
+  }
+
+  test_typeAlias_asParameterType_Never_question() async {
+    await assertNoErrorsInCode(r'''
+typedef X = Never?;
+void f(X a, X? b) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X a'),
+      findElement.typeAlias('X'),
+      'Never?',
+    );
+
+    assertTypeName(
+      findNode.typeName('X? b'),
+      findElement.typeAlias('X'),
+      'Never?',
+    );
+  }
+
+  test_typeAlias_asParameterType_question() async {
+    await assertNoErrorsInCode(r'''
+typedef X<T> = T?;
+void f(X<int> a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('X<int>'),
+      findElement.typeAlias('X'),
+      'int?',
+    );
+  }
+
+  test_typeAlias_asReturnType_interfaceType() async {
+    await assertNoErrorsInCode(r'''
+typedef X<T> = Map<int, T>;
+X<String> f() => {};
+''');
+
+    assertTypeName(
+      findNode.typeName('X<String>'),
+      findElement.typeAlias('X'),
+      'Map<int, String>',
+    );
+  }
+
+  test_typeAlias_asReturnType_void() async {
+    await assertNoErrorsInCode(r'''
+typedef Nothing = void;
+Nothing f() {}
+''');
+
+    assertTypeName(
+      findNode.typeName('Nothing f()'),
+      findElement.typeAlias('Nothing'),
+      'void',
+    );
+  }
+}
+
+mixin TypeNameResolutionTestCases on PubPackageResolutionTest {
+  test_class() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+f(A a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('A a'),
+      findElement.class_('A'),
+      typeStr('A', 'A*'),
+    );
+  }
+
+  test_class_generic_toBounds() async {
+    await assertNoErrorsInCode(r'''
+class A<T extends num> {}
+
+f(A a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('A a'),
+      findElement.class_('A'),
+      typeStr('A<num>', 'A<num*>*'),
+    );
+  }
+
+  test_class_generic_toBounds_dynamic() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+f(A a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('A a'),
+      findElement.class_('A'),
+      typeStr('A<dynamic>', 'A<dynamic>*'),
+    );
+  }
+
+  test_class_generic_typeArguments() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+f(A<int> a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('A<int> a'),
+      findElement.class_('A'),
+      typeStr('A<int>', 'A<int*>*'),
+    );
+  }
+
+  test_dynamic_explicitCore() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:core';
+
+dynamic a;
+''');
+
+    assertTypeName(
+      findNode.typeName('dynamic a;'),
+      dynamicElement,
+      'dynamic',
+    );
+  }
+
+  test_dynamic_explicitCore_withPrefix() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:core' as mycore;
+
+mycore.dynamic a;
+''');
+
+    assertTypeName(
+      findNode.typeName('mycore.dynamic a;'),
+      dynamicElement,
+      'dynamic',
+      expectedPrefix: findElement.import('dart:core').prefix,
+    );
+  }
+
+  test_dynamic_explicitCore_withPrefix_referenceWithout() async {
+    await assertErrorsInCode(r'''
+import 'dart:core' as mycore;
+
+dynamic a;
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_CLASS, 31, 7),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('dynamic a;'),
+      null,
+      'dynamic',
+    );
+  }
+
+  test_dynamic_implicitCore() async {
+    await assertNoErrorsInCode(r'''
+dynamic a;
+''');
+
+    assertTypeName(
+      findNode.typeName('dynamic a;'),
+      dynamicElement,
+      'dynamic',
+    );
+  }
+
+  test_functionTypeAlias() async {
+    await assertNoErrorsInCode(r'''
+typedef F = int Function();
+
+f(F a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('F a'),
+      findElement.typeAlias('F'),
+      typeStr('int Function()', 'int* Function()*'),
+    );
+  }
+
+  test_functionTypeAlias_generic_toBounds() async {
+    await assertNoErrorsInCode(r'''
+typedef F<T extends num> = T Function();
+
+f(F a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('F a'),
+      findElement.typeAlias('F'),
+      typeStr('num Function()', 'num* Function()*'),
+    );
+  }
+
+  test_functionTypeAlias_generic_toBounds_dynamic() async {
+    await assertNoErrorsInCode(r'''
+typedef F<T> = T Function();
+
+f(F a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('F a'),
+      findElement.typeAlias('F'),
+      typeStr('dynamic Function()', 'dynamic Function()*'),
+    );
+  }
+
+  test_functionTypeAlias_generic_typeArguments() async {
+    await assertNoErrorsInCode(r'''
+typedef F<T> = T Function();
+
+f(F<int> a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('F<int> a'),
+      findElement.typeAlias('F'),
+      typeStr('int Function()', 'int* Function()*'),
+    );
+  }
+
+  test_instanceCreation_explicitNew_prefix_unresolvedClass() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' as math;
+
+main() {
+  new math.A();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 49, 1),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('A();'),
+      null,
+      'dynamic',
+      expectedPrefix: findElement.prefix('math'),
+    );
+  }
+
+  test_instanceCreation_explicitNew_resolvedClass() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+main() {
+  new A();
+}
+''');
+
+    assertTypeName(
+      findNode.typeName('A();'),
+      findElement.class_('A'),
+      typeStr('A', 'A*'),
+    );
+  }
+
+  test_instanceCreation_explicitNew_unresolvedClass() async {
+    await assertErrorsInCode(r'''
+main() {
+  new A();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 15, 1),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('A();'),
+      null,
+      'dynamic',
+    );
+  }
+
+  test_invalid_prefixedIdentifier_instanceCreation() async {
+    await assertErrorsInCode(r'''
+void f() {
+  new int.double.other();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 17, 10),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('int.double'),
+      null,
+      'dynamic',
+      expectedPrefix: intElement,
+    );
+  }
+
+  test_invalid_prefixedIdentifier_literal() async {
+    await assertErrorsInCode(r'''
+void f() {
+  0 as int.double;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_A_TYPE, 18, 10),
+    ]);
+
+    assertTypeName(
+      findNode.typeName('int.double'),
+      null,
+      'dynamic',
+      expectedPrefix: intElement,
+    );
+  }
+
+  test_never() async {
+    await assertNoErrorsInCode(r'''
+f(Never a) {}
+''');
+
+    assertTypeName(
+      findNode.typeName('Never a'),
+      neverElement,
+      typeStr('Never', 'Null*'),
+    );
+  }
+}
+
+@reflectiveTest
+class TypeNameResolutionWithoutNullSafetyTest extends PubPackageResolutionTest
+    with TypeNameResolutionTestCases, WithoutNullSafetyMixin {
+  @override
+  bool get typeToStringWithNullability => true;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 39cf8998..26ef3d9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 882c827..f8afaa8 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -62,6 +62,8 @@
     packageDirectory('third_party/pkg/webdev/frontend_server_client'),
     packageDirectory('tools/package_deps'),
   ];
+  // TODO(sigmund): remove this when dart2js_info's new location is used.
+  packageDirs.remove(packageDirectory('pkg/dart2js_info'));
 
   var cfePackageDirs = [
     packageDirectory('pkg/front_end/testcases/'),