| Index: pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| index 67f38510f4682cc1d1fb315d008cd45f5e71556c..021fd70e60a145143130c0c0d8251b6396fd0a67 100644
|
| --- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| @@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/element.dart';
|
| import 'package:test/test.dart';
|
| import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
| +import '../../summary/element_text.dart';
|
| import 'strong_test_helper.dart';
|
|
|
| void main() {
|
| @@ -4027,72 +4028,168 @@ var x = /*info:USE_OF_VOID_RESULT*/f();
|
| expect(x.type.toString(), 'void');
|
| }
|
|
|
| - test_instantiateToBounds_generic2_hasBound_definedAfter() async {
|
| + test_instantiateToBounds_invokeConstructor_noBound() async {
|
| + var unit = await checkFileElement('''
|
| +class C<T> {}
|
| +var x = /*info:INFERRED_TYPE_ALLOCATION*/new C();
|
| +''');
|
| + expect(unit.topLevelVariables[0].type.toString(), 'C<dynamic>');
|
| + }
|
| +
|
| + test_instantiateToBounds_invokeConstructor_typeArgsExact() async {
|
| + var unit = await checkFileElement('''
|
| +class C<T extends num> {}
|
| +var x = new C<int>();
|
| +''');
|
| + expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + }
|
| +
|
| + test_instantiateToBounds_notGeneric() async {
|
| var unit = await checkFileElement(r'''
|
| +class A {}
|
| +class B<T extends A> {}
|
| +B v = null;
|
| +''');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A {
|
| +}
|
| +class B<T extends A> {
|
| +}
|
| +B<A> v;
|
| +''');
|
| + }
|
| +
|
| + test_instantiateToBounds_typeName_error1() async {
|
| + var unit = await checkFileElement(r'''
|
| +class A<T1 extends int, T2 extends T1> {}
|
| class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
|
| -class A<T extends int> {}
|
| B v = null;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T1 extends int, T2 extends T1> {
|
| +}
|
| +class B<T extends A<int, int>> {
|
| +}
|
| +B<A<int, int>> v;
|
| +''');
|
| }
|
|
|
| - test_instantiateToBounds_generic2_hasBound_definedBefore() async {
|
| + test_instantiateToBounds_typeName_error2() async {
|
| var unit = await checkFileElement(r'''
|
| -class A<T extends int> {}
|
| +class A<T1 extends T2, T2 extends int> {}
|
| class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
|
| B v = null;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T1 extends T2, T2 extends int> {
|
| +}
|
| +class B<T extends A<int, int>> {
|
| +}
|
| +B<A<int, int>> v;
|
| +''');
|
| }
|
|
|
| - test_instantiateToBounds_generic2_noBound() async {
|
| + test_instantiateToBounds_typeName_error3() async {
|
| var unit = await checkFileElement(r'''
|
| -class A<T> {}
|
| -class B<T extends A> {}
|
| +class A<T1 extends int, T2 extends List<T1>> {}
|
| +class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
|
| B v = null;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T1 extends int, T2 extends List<T1>> {
|
| +}
|
| +class B<T extends A<int, List<int>>> {
|
| +}
|
| +B<A<int, List<int>>> v;
|
| +''');
|
| }
|
|
|
| - test_instantiateToBounds_generic_hasBound_definedAfter() async {
|
| + @failingTest
|
| + test_instantiateToBounds_typeName_OK_hasBound_definedAfter() async {
|
| var unit = await checkFileElement(r'''
|
| -A v = null;
|
| +class B<T extends A> {}
|
| class A<T extends int> {}
|
| +B v = null;
|
| +''');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class B<T extends A<int>> {
|
| +}
|
| +class A<T extends int> {
|
| +}
|
| +B<A<int>> v;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'A<int>');
|
| }
|
|
|
| - test_instantiateToBounds_generic_hasBound_definedBefore() async {
|
| + test_instantiateToBounds_typeName_OK_hasBound_definedBefore() async {
|
| var unit = await checkFileElement(r'''
|
| class A<T extends int> {}
|
| -A v = null;
|
| +class B<T extends A> {}
|
| +B v = null;
|
| +''');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T extends int> {
|
| +}
|
| +class B<T extends A<int>> {
|
| +}
|
| +B<A<int>> v;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'A<int>');
|
| }
|
|
|
| - test_instantiateToBounds_invokeConstructor_noBound() async {
|
| - var unit = await checkFileElement('''
|
| -class C<T> {}
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C();
|
| + test_instantiateToBounds_typeName_OK_inBound_hasBound_definedAfter() async {
|
| + var unit = await checkFileElement(r'''
|
| +A v = null;
|
| +class A<T extends int> {}
|
| +''');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T extends int> {
|
| +}
|
| +A<int> v;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<dynamic>');
|
| }
|
|
|
| - test_instantiateToBounds_invokeConstructor_typeArgsExact() async {
|
| - var unit = await checkFileElement('''
|
| -class C<T extends num> {}
|
| -var x = new C<int>();
|
| + test_instantiateToBounds_typeName_OK_inBound_hasBound_definedBefore() async {
|
| + var unit = await checkFileElement(r'''
|
| +class A<T extends int> {}
|
| +A v = null;
|
| +''');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T extends int> {
|
| +}
|
| +A<int> v;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| }
|
|
|
| - test_instantiateToBounds_notGeneric() async {
|
| + test_instantiateToBounds_typeName_OK_noBound() async {
|
| var unit = await checkFileElement(r'''
|
| -class A {}
|
| +class A<T> {}
|
| class B<T extends A> {}
|
| B v = null;
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'B<A>');
|
| + checkElementText(
|
| + unit.library,
|
| + r'''
|
| +class A<T> {
|
| +}
|
| +class B<T extends A<dynamic>> {
|
| +}
|
| +B<A<dynamic>> v;
|
| +''');
|
| }
|
|
|
| test_lambdaDoesNotHavePropagatedTypeHint() async {
|
| @@ -5062,6 +5159,11 @@ class InferredTypeTest_Driver extends InferredTypeTest {
|
| test_blockBodiedLambdas_noReturn_topLevel() =>
|
| super.test_blockBodiedLambdas_noReturn_topLevel();
|
|
|
| + @override
|
| + test_instantiateToBounds_typeName_OK_hasBound_definedAfter() async {
|
| + await super.test_instantiateToBounds_typeName_OK_hasBound_definedAfter();
|
| + }
|
| +
|
| @failingTest
|
| @override
|
| test_listLiteralsCanInferNull_topLevel() =>
|
|
|