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/'),