| Index: pkg/analyzer/test/generated/resolver_test.dart
|
| diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
|
| index 4a5c75754f3c061f3bf5fb1b58a9a458e5a069de..d7efebb59de1e0de3cdf4f943f309a2405fc215a 100644
|
| --- a/pkg/analyzer/test/generated/resolver_test.dart
|
| +++ b/pkg/analyzer/test/generated/resolver_test.dart
|
| @@ -13021,20 +13021,6 @@ class StrongModeDownwardsInferenceTest extends ResolverTestCase {
|
| */
|
| @reflectiveTest
|
| class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
|
| - void test_genericFunction_parameter() {
|
| - _resolveTestUnit(r'''
|
| -void g(/*=T*/ f/*<T>*/(/*=T*/ x)) {}
|
| -''');
|
| - SimpleIdentifier f = _findIdentifier('f');
|
| - ParameterElementImpl e = f.staticElement;
|
| - FunctionType type = e.type;
|
| - expect(e.typeParameters.toString(), '[T]');
|
| - expect(type.boundTypeParameters.toString(), '[T]');
|
| - expect(type.toString(), '<T>(T) → T');
|
| - FunctionType ft = type.instantiate([typeProvider.stringType]);
|
| - expect(ft.toString(), '(String) → String');
|
| - }
|
| -
|
| void fail_genericMethod_functionExpressionInvocation_explicit() {
|
| _resolveTestUnit(r'''
|
| class C<E> {
|
| @@ -13097,37 +13083,6 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| expect(_findIdentifier('paramCall').staticType.toString(), "int");
|
| }
|
|
|
| - void fail_genericMethod_functionInvocation_explicit() {
|
| - _resolveTestUnit(r'''
|
| -class C<E> {
|
| - /*=T*/ f/*<T>*/(/*=T*/ e) => null;
|
| - static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
|
| - static final h = g;
|
| -}
|
| -
|
| -/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
|
| -var topG = topF;
|
| -void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| - var c = new C<int>();
|
| - /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
|
| - var methodCall = c.f/*<int>*/(3);
|
| - var staticCall = C.g/*<int>*/(3);
|
| - var staticFieldCall = C.h/*<int>*/(3);
|
| - var topFunCall = topF/*<int>*/(3);
|
| - var topFieldCall = topG/*<int>*/(3);
|
| - var localCall = lf/*<int>*/(3);
|
| - var paramCall = pf/*<int>*/(3);
|
| -}
|
| -''');
|
| - expect(_findIdentifier('methodCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('staticCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('staticFieldCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('topFunCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('topFieldCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('localCall').staticType.toString(), "int");
|
| - expect(_findIdentifier('paramCall').staticType.toString(), "int");
|
| - }
|
| -
|
| void fail_genericMethod_functionInvocation_inferred() {
|
| _resolveTestUnit(r'''
|
| class C<E> {
|
| @@ -13159,42 +13114,6 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| expect(_findIdentifier('paramCall').staticType.toString(), "int");
|
| }
|
|
|
| - void test_genericMethod_tearoff() {
|
| - _resolveTestUnit(r'''
|
| -class C<E> {
|
| - /*=T*/ f/*<T>*/(E e) => null;
|
| - static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
|
| - static final h = g;
|
| -}
|
| -
|
| -/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
|
| -var topG = topF;
|
| -void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| - var c = new C<int>();
|
| - /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
|
| - var methodTearOff = c.f;
|
| - var staticTearOff = C.g;
|
| - var staticFieldTearOff = C.h;
|
| - var topFunTearOff = topF;
|
| - var topFieldTearOff = topG;
|
| - var localTearOff = lf;
|
| - var paramTearOff = pf;
|
| -}
|
| -''');
|
| - expect(
|
| - _findIdentifier('methodTearOff').staticType.toString(), "<T>(int) → T");
|
| - expect(
|
| - _findIdentifier('staticTearOff').staticType.toString(), "<T>(T) → T");
|
| - expect(_findIdentifier('staticFieldTearOff').staticType.toString(),
|
| - "<T>(T) → T");
|
| - expect(
|
| - _findIdentifier('topFunTearOff').staticType.toString(), "<T>(T) → T");
|
| - expect(
|
| - _findIdentifier('topFieldTearOff').staticType.toString(), "<T>(T) → T");
|
| - expect(_findIdentifier('localTearOff').staticType.toString(), "<T>(T) → T");
|
| - expect(_findIdentifier('paramTearOff').staticType.toString(), "<T>(T) → T");
|
| - }
|
| -
|
| void fail_genericMethod_tearoff_instantiated() {
|
| _resolveTestUnit(r'''
|
| class C<E> {
|
| @@ -13277,7 +13196,7 @@ main() {
|
| SimpleIdentifier f = _findIdentifier('f');
|
| FunctionElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T]');
|
| + expect(e.type.typeFormals.toString(), '[T]');
|
| expect(e.type.typeParameters.toString(), '[]');
|
| expect(e.type.toString(), '<T>(T) → T');
|
|
|
| @@ -13290,11 +13209,25 @@ main() {
|
| SimpleIdentifier f = _findIdentifier('f');
|
| FunctionElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T extends num]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T extends num]');
|
| + expect(e.type.typeFormals.toString(), '[T extends num]');
|
| expect(e.type.typeParameters.toString(), '[]');
|
| expect(e.type.toString(), '<T extends num>(T) → T');
|
| }
|
|
|
| + void test_genericFunction_parameter() {
|
| + _resolveTestUnit(r'''
|
| +void g(/*=T*/ f/*<T>*/(/*=T*/ x)) {}
|
| +''');
|
| + SimpleIdentifier f = _findIdentifier('f');
|
| + ParameterElementImpl e = f.staticElement;
|
| + FunctionType type = e.type;
|
| + expect(e.typeParameters.toString(), '[T]');
|
| + expect(type.boundTypeParameters.toString(), '[T]');
|
| + expect(type.toString(), '<T>(T) → T');
|
| + FunctionType ft = type.instantiate([typeProvider.stringType]);
|
| + expect(ft.toString(), '(String) → String');
|
| + }
|
| +
|
| void test_genericFunction_static() {
|
| _resolveTestUnit(r'''
|
| class C<E> {
|
| @@ -13304,7 +13237,7 @@ class C<E> {
|
| SimpleIdentifier f = _findIdentifier('f');
|
| MethodElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T]');
|
| + expect(e.type.typeFormals.toString(), '[T]');
|
| // TODO(jmesserly): we could get rid of this {E/E} substitution, but it's
|
| // probably harmless, as E won't be used in the function (error verifier
|
| // checks this), and {E/E} is a no-op anyway.
|
| @@ -13403,7 +13336,7 @@ main() {
|
| SimpleIdentifier f = _findIdentifier('f');
|
| MethodElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T]');
|
| + expect(e.type.typeFormals.toString(), '[T]');
|
| expect(e.type.typeParameters.toString(), '[E]');
|
| expect(e.type.typeArguments.toString(), '[E]');
|
| expect(e.type.toString(), '<T>(E) → List<T>');
|
| @@ -13426,8 +13359,8 @@ main() {
|
| var x = cOfString.f/*<int>*/('hi');
|
| }
|
| ''');
|
| - SimpleIdentifier f = _findIdentifier('f/*<int>*/');
|
| - FunctionType ft = f.staticType;
|
| + MethodInvocation f = _findIdentifier('f/*<int>*/').parent;
|
| + FunctionType ft = f.staticInvokeType;
|
| expect(ft.toString(), '(String) → List<int>');
|
| expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
|
|
|
| @@ -13436,6 +13369,37 @@ main() {
|
| typeProvider.listType.substitute4([typeProvider.intType]));
|
| }
|
|
|
| + void test_genericMethod_functionInvocation_explicit() {
|
| + _resolveTestUnit(r'''
|
| +class C<E> {
|
| + /*=T*/ f/*<T>*/(/*=T*/ e) => null;
|
| + static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
|
| + static final h = g;
|
| +}
|
| +
|
| +/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
|
| +var topG = topF;
|
| +void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| + var c = new C<int>();
|
| + /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
|
| + var methodCall = c.f/*<int>*/(3);
|
| + var staticCall = C.g/*<int>*/(3);
|
| + var staticFieldCall = C.h/*<int>*/(3);
|
| + var topFunCall = topF/*<int>*/(3);
|
| + var topFieldCall = topG/*<int>*/(3);
|
| + var localCall = lf/*<int>*/(3);
|
| + var paramCall = pf/*<int>*/(3);
|
| +}
|
| +''');
|
| + expect(_findIdentifier('methodCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('staticCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('staticFieldCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('topFunCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('topFieldCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('localCall').staticType.toString(), "int");
|
| + expect(_findIdentifier('paramCall').staticType.toString(), "int");
|
| + }
|
| +
|
| void test_genericMethod_functionTypedParameter() {
|
| _resolveTestUnit(r'''
|
| class C<E> {
|
| @@ -13448,7 +13412,7 @@ main() {
|
| SimpleIdentifier f = _findIdentifier('f');
|
| MethodElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T]');
|
| + expect(e.type.typeFormals.toString(), '[T]');
|
| expect(e.type.typeParameters.toString(), '[E]');
|
| expect(e.type.typeArguments.toString(), '[E]');
|
| expect(e.type.toString(), '<T>((E) → T) → List<T>');
|
| @@ -13475,10 +13439,14 @@ void foo() {
|
| }''');
|
|
|
| SimpleIdentifier map1 = _findIdentifier('map((e) => e);');
|
| - expect(map1.staticType.toString(), '((dynamic) → dynamic) → dynamic');
|
| + MethodInvocation m1 = map1.parent;
|
| + expect(m1.staticInvokeType.toString(), '((dynamic) → dynamic) → dynamic');
|
| + expect(map1.staticType, isNull);
|
| expect(map1.propagatedType, isNull);
|
| SimpleIdentifier map2 = _findIdentifier('map((e) => 3);');
|
| - expect(map2.staticType.toString(), '((dynamic) → int) → int');
|
| + MethodInvocation m2 = map2.parent;
|
| + expect(m2.staticInvokeType.toString(), '((dynamic) → int) → int');
|
| + expect(map2.staticType, isNull);
|
| expect(map2.propagatedType, isNull);
|
| }
|
|
|
| @@ -13492,13 +13460,13 @@ class C<T> {
|
| }
|
| }
|
| ''');
|
| - SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);');
|
| - expect(f.staticType.toString(), '(int) → S');
|
| - FunctionType ft = f.staticType;
|
| + MethodInvocation f = _findIdentifier('f/*<int>*/(3);').parent;
|
| + expect(f.staticInvokeType.toString(), '(int) → S');
|
| + FunctionType ft = f.staticInvokeType;
|
| expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]');
|
|
|
| - f = _findIdentifier('f;');
|
| - expect(f.staticType.toString(), '<S₀>(S₀) → S');
|
| + SimpleIdentifier f2 = _findIdentifier('f;');
|
| + expect(f2.staticType.toString(), '<S₀>(S₀) → S');
|
| }
|
|
|
| void test_genericMethod_nestedFunctions() {
|
| @@ -13527,7 +13495,7 @@ class D extends C {
|
| _findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D');
|
| MethodElementImpl e = f.staticElement;
|
| expect(e.typeParameters.toString(), '[T]');
|
| - expect(e.type.boundTypeParameters.toString(), '[T]');
|
| + expect(e.type.typeFormals.toString(), '[T]');
|
| expect(e.type.toString(), '<T>(T) → T');
|
|
|
| FunctionType ft = e.type.instantiate([typeProvider.stringType]);
|
| @@ -13606,6 +13574,42 @@ class D extends C {
|
| verify([source]);
|
| }
|
|
|
| + void test_genericMethod_tearoff() {
|
| + _resolveTestUnit(r'''
|
| +class C<E> {
|
| + /*=T*/ f/*<T>*/(E e) => null;
|
| + static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
|
| + static final h = g;
|
| +}
|
| +
|
| +/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
|
| +var topG = topF;
|
| +void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
|
| + var c = new C<int>();
|
| + /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
|
| + var methodTearOff = c.f;
|
| + var staticTearOff = C.g;
|
| + var staticFieldTearOff = C.h;
|
| + var topFunTearOff = topF;
|
| + var topFieldTearOff = topG;
|
| + var localTearOff = lf;
|
| + var paramTearOff = pf;
|
| +}
|
| +''');
|
| + expect(
|
| + _findIdentifier('methodTearOff').staticType.toString(), "<T>(int) → T");
|
| + expect(
|
| + _findIdentifier('staticTearOff').staticType.toString(), "<T>(T) → T");
|
| + expect(_findIdentifier('staticFieldTearOff').staticType.toString(),
|
| + "<T>(T) → T");
|
| + expect(
|
| + _findIdentifier('topFunTearOff').staticType.toString(), "<T>(T) → T");
|
| + expect(
|
| + _findIdentifier('topFieldTearOff').staticType.toString(), "<T>(T) → T");
|
| + expect(_findIdentifier('localTearOff').staticType.toString(), "<T>(T) → T");
|
| + expect(_findIdentifier('paramTearOff').staticType.toString(), "<T>(T) → T");
|
| + }
|
| +
|
| void test_pseudoGeneric_max_doubleDouble() {
|
| String code = r'''
|
| import 'dart:math';
|
|
|