Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(538)

Side by Side Diff: pkg/analyzer/test/generated/resolver_test.dart

Issue 1568643002: clean up generic methods in resolution (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: deprecate FunctionMember Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.test.generated.resolver_test; 5 library analyzer.test.generated.resolver_test;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/element/element.dart'; 9 import 'package:analyzer/dart/element/element.dart';
10 import 'package:analyzer/dart/element/type.dart'; 10 import 'package:analyzer/dart/element/type.dart';
(...skipping 13045 matching lines...) Expand 10 before | Expand all | Expand 10 after
13056 identifier.getAncestor((node) => node is VariableDeclaration); 13056 identifier.getAncestor((node) => node is VariableDeclaration);
13057 expect(declaration.initializer.staticType.name, 'String'); 13057 expect(declaration.initializer.staticType.name, 'String');
13058 expect(declaration.initializer.propagatedType, isNull); 13058 expect(declaration.initializer.propagatedType, isNull);
13059 } 13059 }
13060 13060
13061 void test_genericFunction() { 13061 void test_genericFunction() {
13062 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;'); 13062 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;');
13063 SimpleIdentifier f = _findIdentifier('f'); 13063 SimpleIdentifier f = _findIdentifier('f');
13064 FunctionElementImpl e = f.staticElement; 13064 FunctionElementImpl e = f.staticElement;
13065 expect(e.typeParameters.toString(), '[T]'); 13065 expect(e.typeParameters.toString(), '[T]');
13066 expect(e.type.boundTypeParameters.toString(), '[T]'); 13066 expect(e.type.typeFormals.toString(), '[T]');
13067 expect(e.type.typeParameters.toString(), '[]'); 13067 expect(e.type.typeParameters.toString(), '[]');
13068 expect(e.type.toString(), '<T>(T) → T'); 13068 expect(e.type.toString(), '<T>(T) → T');
13069 13069
13070 FunctionType ft = e.type.instantiate([typeProvider.stringType]); 13070 FunctionType ft = e.type.instantiate([typeProvider.stringType]);
13071 expect(ft.toString(), '(String) → String'); 13071 expect(ft.toString(), '(String) → String');
13072 } 13072 }
13073 13073
13074 void test_genericFunction_bounds() { 13074 void test_genericFunction_bounds() {
13075 _resolveTestUnit(r'/*=T*/ f/*<T extends num>*/(/*=T*/ x) => null;'); 13075 _resolveTestUnit(r'/*=T*/ f/*<T extends num>*/(/*=T*/ x) => null;');
13076 SimpleIdentifier f = _findIdentifier('f'); 13076 SimpleIdentifier f = _findIdentifier('f');
13077 FunctionElementImpl e = f.staticElement; 13077 FunctionElementImpl e = f.staticElement;
13078 expect(e.typeParameters.toString(), '[T extends num]'); 13078 expect(e.typeParameters.toString(), '[T extends num]');
13079 expect(e.type.boundTypeParameters.toString(), '[T extends num]'); 13079 expect(e.type.typeFormals.toString(), '[T extends num]');
13080 expect(e.type.typeParameters.toString(), '[]'); 13080 expect(e.type.typeParameters.toString(), '[]');
13081 expect(e.type.toString(), '<T extends num>(T) → T'); 13081 expect(e.type.toString(), '<T extends num>(T) → T');
13082 } 13082 }
13083 13083
13084 void test_genericFunction_static() { 13084 void test_genericFunction_static() {
13085 _resolveTestUnit(r''' 13085 _resolveTestUnit(r'''
13086 class C<E> { 13086 class C<E> {
13087 static /*=T*/ f/*<T>*/(/*=T*/ x) => null; 13087 static /*=T*/ f/*<T>*/(/*=T*/ x) => null;
13088 } 13088 }
13089 '''); 13089 ''');
13090 SimpleIdentifier f = _findIdentifier('f'); 13090 SimpleIdentifier f = _findIdentifier('f');
13091 MethodElementImpl e = f.staticElement; 13091 MethodElementImpl e = f.staticElement;
13092 expect(e.typeParameters.toString(), '[T]'); 13092 expect(e.typeParameters.toString(), '[T]');
13093 expect(e.type.boundTypeParameters.toString(), '[T]'); 13093 expect(e.type.typeFormals.toString(), '[T]');
13094 // TODO(jmesserly): we could get rid of this {E/E} substitution, but it's 13094 // TODO(jmesserly): we could get rid of this {E/E} substitution, but it's
13095 // probably harmless, as E won't be used in the function (error verifier 13095 // probably harmless, as E won't be used in the function (error verifier
13096 // checks this), and {E/E} is a no-op anyway. 13096 // checks this), and {E/E} is a no-op anyway.
13097 expect(e.type.typeParameters.toString(), '[E]'); 13097 expect(e.type.typeParameters.toString(), '[E]');
13098 expect(e.type.typeArguments.toString(), '[E]'); 13098 expect(e.type.typeArguments.toString(), '[E]');
13099 expect(e.type.toString(), '<T>(T) → T'); 13099 expect(e.type.toString(), '<T>(T) → T');
13100 13100
13101 FunctionType ft = e.type.instantiate([typeProvider.stringType]); 13101 FunctionType ft = e.type.instantiate([typeProvider.stringType]);
13102 expect(ft.toString(), '(String) → String'); 13102 expect(ft.toString(), '(String) → String');
13103 } 13103 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
13182 class C<E> { 13182 class C<E> {
13183 List/*<T>*/ f/*<T>*/(E e) => null; 13183 List/*<T>*/ f/*<T>*/(E e) => null;
13184 } 13184 }
13185 main() { 13185 main() {
13186 C<String> cOfString; 13186 C<String> cOfString;
13187 } 13187 }
13188 '''); 13188 ''');
13189 SimpleIdentifier f = _findIdentifier('f'); 13189 SimpleIdentifier f = _findIdentifier('f');
13190 MethodElementImpl e = f.staticElement; 13190 MethodElementImpl e = f.staticElement;
13191 expect(e.typeParameters.toString(), '[T]'); 13191 expect(e.typeParameters.toString(), '[T]');
13192 expect(e.type.boundTypeParameters.toString(), '[T]'); 13192 expect(e.type.typeFormals.toString(), '[T]');
13193 expect(e.type.typeParameters.toString(), '[E]'); 13193 expect(e.type.typeParameters.toString(), '[E]');
13194 expect(e.type.typeArguments.toString(), '[E]'); 13194 expect(e.type.typeArguments.toString(), '[E]');
13195 expect(e.type.toString(), '<T>(E) → List<T>'); 13195 expect(e.type.toString(), '<T>(E) → List<T>');
13196 13196
13197 SimpleIdentifier c = _findIdentifier('cOfString'); 13197 SimpleIdentifier c = _findIdentifier('cOfString');
13198 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; 13198 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type;
13199 expect(ft.toString(), '<T>(String) → List<T>'); 13199 expect(ft.toString(), '<T>(String) → List<T>');
13200 ft = ft.instantiate([typeProvider.intType]); 13200 ft = ft.instantiate([typeProvider.intType]);
13201 expect(ft.toString(), '(String) → List<int>'); 13201 expect(ft.toString(), '(String) → List<int>');
13202 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]'); 13202 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
13203 } 13203 }
13204 13204
13205 void test_genericMethod_explicitTypeParams() { 13205 void test_genericMethod_explicitTypeParams() {
13206 _resolveTestUnit(r''' 13206 _resolveTestUnit(r'''
13207 class C<E> { 13207 class C<E> {
13208 List/*<T>*/ f/*<T>*/(E e) => null; 13208 List/*<T>*/ f/*<T>*/(E e) => null;
13209 } 13209 }
13210 main() { 13210 main() {
13211 C<String> cOfString; 13211 C<String> cOfString;
13212 var x = cOfString.f/*<int>*/('hi'); 13212 var x = cOfString.f/*<int>*/('hi');
13213 } 13213 }
13214 '''); 13214 ''');
13215 SimpleIdentifier f = _findIdentifier('f/*<int>*/'); 13215 MethodInvocation f = _findIdentifier('f/*<int>*/').parent;
13216 FunctionType ft = f.staticType; 13216 FunctionType ft = f.staticInvokeType;
13217 expect(ft.toString(), '(String) → List<int>'); 13217 expect(ft.toString(), '(String) → List<int>');
13218 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]'); 13218 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
13219 13219
13220 SimpleIdentifier x = _findIdentifier('x'); 13220 SimpleIdentifier x = _findIdentifier('x');
13221 expect(x.staticType, 13221 expect(x.staticType,
13222 typeProvider.listType.substitute4([typeProvider.intType])); 13222 typeProvider.listType.substitute4([typeProvider.intType]));
13223 } 13223 }
13224 13224
13225 void test_genericMethod_functionTypedParameter() { 13225 void test_genericMethod_functionTypedParameter() {
13226 _resolveTestUnit(r''' 13226 _resolveTestUnit(r'''
13227 class C<E> { 13227 class C<E> {
13228 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null; 13228 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null;
13229 } 13229 }
13230 main() { 13230 main() {
13231 C<String> cOfString; 13231 C<String> cOfString;
13232 } 13232 }
13233 '''); 13233 ''');
13234 SimpleIdentifier f = _findIdentifier('f'); 13234 SimpleIdentifier f = _findIdentifier('f');
13235 MethodElementImpl e = f.staticElement; 13235 MethodElementImpl e = f.staticElement;
13236 expect(e.typeParameters.toString(), '[T]'); 13236 expect(e.typeParameters.toString(), '[T]');
13237 expect(e.type.boundTypeParameters.toString(), '[T]'); 13237 expect(e.type.typeFormals.toString(), '[T]');
13238 expect(e.type.typeParameters.toString(), '[E]'); 13238 expect(e.type.typeParameters.toString(), '[E]');
13239 expect(e.type.typeArguments.toString(), '[E]'); 13239 expect(e.type.typeArguments.toString(), '[E]');
13240 expect(e.type.toString(), '<T>((E) → T) → List<T>'); 13240 expect(e.type.toString(), '<T>((E) → T) → List<T>');
13241 13241
13242 SimpleIdentifier c = _findIdentifier('cOfString'); 13242 SimpleIdentifier c = _findIdentifier('cOfString');
13243 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; 13243 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type;
13244 expect(ft.toString(), '<T>((String) → T) → List<T>'); 13244 expect(ft.toString(), '<T>((String) → T) → List<T>');
13245 ft = ft.instantiate([typeProvider.intType]); 13245 ft = ft.instantiate([typeProvider.intType]);
13246 expect(ft.toString(), '((String) → int) → List<int>'); 13246 expect(ft.toString(), '((String) → int) → List<int>');
13247 } 13247 }
13248 13248
13249 void test_genericMethod_implicitDynamic() { 13249 void test_genericMethod_implicitDynamic() {
13250 // Regression test for: 13250 // Regression test for:
13251 // https://github.com/dart-lang/sdk/issues/25100#issuecomment-162047588 13251 // https://github.com/dart-lang/sdk/issues/25100#issuecomment-162047588
13252 // These should not cause any hints or warnings. 13252 // These should not cause any hints or warnings.
13253 _resolveTestUnit(r''' 13253 _resolveTestUnit(r'''
13254 class List<E> { 13254 class List<E> {
13255 /*=T*/ map/*<T>*/(/*=T*/ f(E e)) => null; 13255 /*=T*/ map/*<T>*/(/*=T*/ f(E e)) => null;
13256 } 13256 }
13257 void foo() { 13257 void foo() {
13258 List list = null; 13258 List list = null;
13259 list.map((e) => e); 13259 list.map((e) => e);
13260 list.map((e) => 3); 13260 list.map((e) => 3);
13261 }'''); 13261 }''');
13262 13262
13263 SimpleIdentifier map1 = _findIdentifier('map((e) => e);'); 13263 SimpleIdentifier map1 = _findIdentifier('map((e) => e);');
13264 expect(map1.staticType.toString(), '((dynamic) → dynamic) → dynamic'); 13264 MethodInvocation m1 = map1.parent;
13265 expect(m1.staticInvokeType.toString(), '((dynamic) → dynamic) → dynamic');
13266 expect(map1.staticType, isNull);
13265 expect(map1.propagatedType, isNull); 13267 expect(map1.propagatedType, isNull);
13266 SimpleIdentifier map2 = _findIdentifier('map((e) => 3);'); 13268 SimpleIdentifier map2 = _findIdentifier('map((e) => 3);');
13267 expect(map2.staticType.toString(), '((dynamic) → int) → int'); 13269 MethodInvocation m2 = map2.parent;
13270 expect(m2.staticInvokeType.toString(), '((dynamic) → int) → int');
13271 expect(map2.staticType, isNull);
13268 expect(map2.propagatedType, isNull); 13272 expect(map2.propagatedType, isNull);
13269 } 13273 }
13270 13274
13271 void test_genericMethod_nestedCapture() { 13275 void test_genericMethod_nestedCapture() {
13272 _resolveTestUnit(r''' 13276 _resolveTestUnit(r'''
13273 class C<T> { 13277 class C<T> {
13274 /*=T*/ f/*<S>*/(/*=S*/ x) { 13278 /*=T*/ f/*<S>*/(/*=S*/ x) {
13275 new C<S>().f/*<int>*/(3); 13279 new C<S>().f/*<int>*/(3);
13276 new C<S>().f; // tear-off 13280 new C<S>().f; // tear-off
13277 return null; 13281 return null;
13278 } 13282 }
13279 } 13283 }
13280 '''); 13284 ''');
13281 SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);'); 13285 MethodInvocation f = _findIdentifier('f/*<int>*/(3);').parent;
13282 expect(f.staticType.toString(), '(int) → S'); 13286 expect(f.staticInvokeType.toString(), '(int) → S');
13283 FunctionType ft = f.staticType; 13287 FunctionType ft = f.staticInvokeType;
13284 expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]'); 13288 expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]');
13285 13289
13286 f = _findIdentifier('f;'); 13290 SimpleIdentifier f2 = _findIdentifier('f;');
13287 expect(f.staticType.toString(), '<S₀>(S₀) → S'); 13291 expect(f2.staticType.toString(), '<S₀>(S₀) → S');
13288 } 13292 }
13289 13293
13290 void test_genericMethod_nestedFunctions() { 13294 void test_genericMethod_nestedFunctions() {
13291 _resolveTestUnit(r''' 13295 _resolveTestUnit(r'''
13292 /*=S*/ f/*<S>*/(/*=S*/ x) { 13296 /*=S*/ f/*<S>*/(/*=S*/ x) {
13293 g/*<S>*/(/*=S*/ x) => f; 13297 g/*<S>*/(/*=S*/ x) => f;
13294 return null; 13298 return null;
13295 } 13299 }
13296 '''); 13300 ''');
13297 SimpleIdentifier g = _findIdentifier('f'); 13301 SimpleIdentifier g = _findIdentifier('f');
13298 expect(g.staticType.toString(), '<S>(S) → S'); 13302 expect(g.staticType.toString(), '<S>(S) → S');
13299 SimpleIdentifier f = _findIdentifier('g'); 13303 SimpleIdentifier f = _findIdentifier('g');
13300 expect(f.staticType.toString(), '<S>(S) → dynamic'); 13304 expect(f.staticType.toString(), '<S>(S) → dynamic');
13301 } 13305 }
13302 13306
13303 void test_genericMethod_override() { 13307 void test_genericMethod_override() {
13304 _resolveTestUnit(r''' 13308 _resolveTestUnit(r'''
13305 class C { 13309 class C {
13306 /*=T*/ f/*<T>*/(/*=T*/ x) => null; 13310 /*=T*/ f/*<T>*/(/*=T*/ x) => null;
13307 } 13311 }
13308 class D extends C { 13312 class D extends C {
13309 /*=T*/ f/*<T>*/(/*=T*/ x) => null; // from D 13313 /*=T*/ f/*<T>*/(/*=T*/ x) => null; // from D
13310 } 13314 }
13311 '''); 13315 ''');
13312 SimpleIdentifier f = 13316 SimpleIdentifier f =
13313 _findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D'); 13317 _findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D');
13314 MethodElementImpl e = f.staticElement; 13318 MethodElementImpl e = f.staticElement;
13315 expect(e.typeParameters.toString(), '[T]'); 13319 expect(e.typeParameters.toString(), '[T]');
13316 expect(e.type.boundTypeParameters.toString(), '[T]'); 13320 expect(e.type.typeFormals.toString(), '[T]');
13317 expect(e.type.toString(), '<T>(T) → T'); 13321 expect(e.type.toString(), '<T>(T) → T');
13318 13322
13319 FunctionType ft = e.type.instantiate([typeProvider.stringType]); 13323 FunctionType ft = e.type.instantiate([typeProvider.stringType]);
13320 expect(ft.toString(), '(String) → String'); 13324 expect(ft.toString(), '(String) → String');
13321 } 13325 }
13322 13326
13323 void test_genericMethod_override_bounds() { 13327 void test_genericMethod_override_bounds() {
13324 _resolveTestUnit(r''' 13328 _resolveTestUnit(r'''
13325 class A {} 13329 class A {}
13326 class B extends A {} 13330 class B extends A {}
(...skipping 3052 matching lines...) Expand 10 before | Expand all | Expand 10 after
16379 16383
16380 void _resolveTestUnit(String code) { 16384 void _resolveTestUnit(String code) {
16381 testCode = code; 16385 testCode = code;
16382 testSource = addSource(testCode); 16386 testSource = addSource(testCode);
16383 LibraryElement library = resolve2(testSource); 16387 LibraryElement library = resolve2(testSource);
16384 assertNoErrors(testSource); 16388 assertNoErrors(testSource);
16385 verify([testSource]); 16389 verify([testSource]);
16386 testUnit = resolveCompilationUnit(testSource, library); 16390 testUnit = resolveCompilationUnit(testSource, library);
16387 } 16391 }
16388 } 16392 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698