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'; |