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

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

Issue 1488383004: Fixes incorrect generic function type capture (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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
« no previous file with comments | « pkg/analyzer/lib/src/generated/type_system.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 engine.resolver_test; 5 library engine.resolver_test;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/src/context/context.dart' as newContext; 9 import 'package:analyzer/src/context/context.dart' as newContext;
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
(...skipping 13096 matching lines...) Expand 10 before | Expand all | Expand 10 after
13107 Expression exp = invocation.argumentList.arguments[0]; 13107 Expression exp = invocation.argumentList.arguments[0];
13108 _isListOf(_isString)(exp.staticType); 13108 _isListOf(_isString)(exp.staticType);
13109 } 13109 }
13110 } 13110 }
13111 13111
13112 /** 13112 /**
13113 * Strong mode static analyzer end to end tests 13113 * Strong mode static analyzer end to end tests
13114 */ 13114 */
13115 @reflectiveTest 13115 @reflectiveTest
13116 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared { 13116 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
13117 void fail_genericMethod_nested() {
13118 // TODO(jmesserly): this test currently fails because we incorrectly capture
13119 // S in FunctionTypeImpl.substitute. We should probably rename free
13120 // variables during substitution to avoid it.
13121 _resolveTestUnit(r'''
13122 class C<T> {
13123 /*=T*/ f/*<S>*/(/*=S*/ x) {
13124 new C<S>().f/*<int>*/(3);
13125 return null;
13126 }
13127 }
13128 ''');
13129 SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);');
13130 expect(f.staticType.toString(), '(int) → S');
13131 }
13132
13133 void setUp() { 13117 void setUp() {
13134 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); 13118 AnalysisOptionsImpl options = new AnalysisOptionsImpl();
13135 options.strongMode = true; 13119 options.strongMode = true;
13136 resetWithOptions(options); 13120 resetWithOptions(options);
13137 } 13121 }
13138 13122
13139 void test_dynamicObjectGetter_hashCode() { 13123 void test_dynamicObjectGetter_hashCode() {
13140 String code = r''' 13124 String code = r'''
13141 main() { 13125 main() {
13142 dynamic a = null; 13126 dynamic a = null;
(...skipping 26 matching lines...) Expand all
13169 } 13153 }
13170 13154
13171 void test_genericFunction() { 13155 void test_genericFunction() {
13172 if (!AnalysisEngine.instance.useTaskModel) { 13156 if (!AnalysisEngine.instance.useTaskModel) {
13173 return; 13157 return;
13174 } 13158 }
13175 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;'); 13159 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;');
13176 SimpleIdentifier f = _findIdentifier('f'); 13160 SimpleIdentifier f = _findIdentifier('f');
13177 FunctionElementImpl e = f.staticElement; 13161 FunctionElementImpl e = f.staticElement;
13178 expect(e.typeParameters.toString(), '[T]'); 13162 expect(e.typeParameters.toString(), '[T]');
13179 expect(e.type.typeParameters.toString(), '[T]'); 13163 expect(e.type.boundTypeParameters.toString(), '[T]');
13180 expect(e.type.typeParameters[0].type, e.type.typeArguments[0]); 13164 expect(e.type.typeParameters.toString(), '[]');
13181 expect(e.type.toString(), '(T) → T'); 13165 expect(e.type.toString(), '<T>(T) → T');
13182 13166
13183 // Substitute for T 13167 FunctionType ft = e.type.instantiate([typeProvider.stringType]);
13184 DartType t = e.typeParameters[0].type;
13185 FunctionType ft = e.type.substitute2([typeProvider.stringType], [t]);
13186 expect(ft.toString(), '(String) → String'); 13168 expect(ft.toString(), '(String) → String');
13187 } 13169 }
13188 13170
13189 void test_genericMethod() { 13171 void test_genericMethod() {
13190 if (!AnalysisEngine.instance.useTaskModel) { 13172 if (!AnalysisEngine.instance.useTaskModel) {
13191 return; 13173 return;
13192 } 13174 }
13193 _resolveTestUnit(r''' 13175 _resolveTestUnit(r'''
13194 class C<E> { 13176 class C<E> {
13195 List/*<T>*/ f/*<T>*/(E e) => null; 13177 List/*<T>*/ f/*<T>*/(E e) => null;
13196 } 13178 }
13197 main() { 13179 main() {
13198 C<String> cOfString; 13180 C<String> cOfString;
13199 } 13181 }
13200 '''); 13182 ''');
13201 SimpleIdentifier f = _findIdentifier('f'); 13183 SimpleIdentifier f = _findIdentifier('f');
13202 MethodElementImpl e = f.staticElement; 13184 MethodElementImpl e = f.staticElement;
13203 expect(e.typeParameters.toString(), '[T]'); 13185 expect(e.typeParameters.toString(), '[T]');
13204 expect(e.type.typeParameters.toString(), '[T, E]'); 13186 expect(e.type.boundTypeParameters.toString(), '[T]');
13205 expect(e.type.typeArguments.toString(), '[T, E]'); 13187 expect(e.type.typeParameters.toString(), '[E]');
13206 expect(e.type.toString(), '(E) → List<T>'); 13188 expect(e.type.typeArguments.toString(), '[E]');
13189 expect(e.type.toString(), '<T>(E) → List<T>');
13207 13190
13208 SimpleIdentifier c = _findIdentifier('cOfString'); 13191 SimpleIdentifier c = _findIdentifier('cOfString');
13209 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; 13192 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type;
13210 expect(ft.toString(), '(String) → List<T>'); 13193 expect(ft.toString(), '<T>(String) → List<T>');
13211 DartType t = e.typeParameters[0].type; 13194 ft = ft.instantiate([typeProvider.intType]);
13212 ft = ft.substitute2([typeProvider.intType], [t]);
13213 expect(ft.toString(), '(String) → List<int>'); 13195 expect(ft.toString(), '(String) → List<int>');
13196 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
13214 } 13197 }
13215 13198
13216 void test_genericMethod_functionTypedParameter() { 13199 void test_genericMethod_functionTypedParameter() {
13217 if (!AnalysisEngine.instance.useTaskModel) { 13200 if (!AnalysisEngine.instance.useTaskModel) {
13218 return; 13201 return;
13219 } 13202 }
13220 _resolveTestUnit(r''' 13203 _resolveTestUnit(r'''
13221 class C<E> { 13204 class C<E> {
13222 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null; 13205 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null;
13223 } 13206 }
13224 main() { 13207 main() {
13225 C<String> cOfString; 13208 C<String> cOfString;
13226 } 13209 }
13227 '''); 13210 ''');
13228 SimpleIdentifier f = _findIdentifier('f'); 13211 SimpleIdentifier f = _findIdentifier('f');
13229 MethodElementImpl e = f.staticElement; 13212 MethodElementImpl e = f.staticElement;
13230 expect(e.typeParameters.toString(), '[T]'); 13213 expect(e.typeParameters.toString(), '[T]');
13231 expect(e.type.typeParameters.toString(), '[T, E]'); 13214 expect(e.type.boundTypeParameters.toString(), '[T]');
13232 expect(e.type.typeArguments.toString(), '[T, E]'); 13215 expect(e.type.typeParameters.toString(), '[E]');
13233 expect(e.type.toString(), '((E) → T) → List<T>'); 13216 expect(e.type.typeArguments.toString(), '[E]');
13217 expect(e.type.toString(), '<T>((E) → T) → List<T>');
13234 13218
13235 SimpleIdentifier c = _findIdentifier('cOfString'); 13219 SimpleIdentifier c = _findIdentifier('cOfString');
13236 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; 13220 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type;
13237 expect(ft.toString(), '((String) → T) → List<T>'); 13221 expect(ft.toString(), '<T>((String) → T) → List<T>');
13238 DartType t = e.typeParameters[0].type; 13222 ft = ft.instantiate([typeProvider.intType]);
13239 ft = ft.substitute2([typeProvider.intType], [t]);
13240 expect(ft.toString(), '((String) → int) → List<int>'); 13223 expect(ft.toString(), '((String) → int) → List<int>');
13241 } 13224 }
13242 13225
13226 void test_genericMethod_nestedCapture() {
13227 _resolveTestUnit(r'''
13228 class C<T> {
13229 /*=T*/ f/*<S>*/(/*=S*/ x) {
13230 new C<S>().f/*<int>*/(3);
13231 new C<S>().f; // tear-off
13232 return null;
13233 }
13234 }
13235 ''');
13236 SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);');
13237 expect(f.staticType.toString(), '(int) → S');
13238 FunctionType ft = f.staticType;
13239 expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]');
13240
13241 f = _findIdentifier('f;');
13242 expect(f.staticType.toString(), '<S₀>(S₀) → S');
13243 }
13244
13245 void test_genericMethod_nestedFunctions() {
13246 _resolveTestUnit(r'''
13247 /*=S*/ f/*<S>*/(/*=S*/ x) {
13248 g/*<S>*/(/*=S*/ x) => f;
13249 return null;
13250 }
13251 ''');
13252 SimpleIdentifier g = _findIdentifier('f');
13253 expect(g.staticType.toString(), '<S>(S) → S');
13254 SimpleIdentifier f = _findIdentifier('g');
13255 expect(f.staticType.toString(), '<S>(S) → dynamic');
13256 }
13257
13243 void test_pseudoGeneric_max_doubleDouble() { 13258 void test_pseudoGeneric_max_doubleDouble() {
13244 String code = r''' 13259 String code = r'''
13245 import 'dart:math'; 13260 import 'dart:math';
13246 main() { 13261 main() {
13247 var foo = max(1.0, 2.0); 13262 var foo = max(1.0, 2.0);
13248 } 13263 }
13249 '''; 13264 ''';
13250 _resolveTestUnit(code); 13265 _resolveTestUnit(code);
13251 13266
13252 SimpleIdentifier identifier = _findIdentifier('foo'); 13267 SimpleIdentifier identifier = _findIdentifier('foo');
(...skipping 3003 matching lines...) Expand 10 before | Expand all | Expand 10 after
16256 16271
16257 void _resolveTestUnit(String code) { 16272 void _resolveTestUnit(String code) {
16258 testCode = code; 16273 testCode = code;
16259 testSource = addSource(testCode); 16274 testSource = addSource(testCode);
16260 LibraryElement library = resolve2(testSource); 16275 LibraryElement library = resolve2(testSource);
16261 assertNoErrors(testSource); 16276 assertNoErrors(testSource);
16262 verify([testSource]); 16277 verify([testSource]);
16263 testUnit = resolveCompilationUnit(testSource, library); 16278 testUnit = resolveCompilationUnit(testSource, library);
16264 } 16279 }
16265 } 16280 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/type_system.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698