OLD | NEW |
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 12118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12129 computeLibrarySourceErrors(source); | 12129 computeLibrarySourceErrors(source); |
12130 assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]); | 12130 assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]); |
12131 } | 12131 } |
12132 } | 12132 } |
12133 | 12133 |
12134 /** | 12134 /** |
12135 * Strong mode static analyzer end to end tests | 12135 * Strong mode static analyzer end to end tests |
12136 */ | 12136 */ |
12137 @reflectiveTest | 12137 @reflectiveTest |
12138 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared { | 12138 class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared { |
12139 void fail_genericMethod_nested() { | |
12140 // TODO(jmesserly): this test currently fails because we incorrectly capture | |
12141 // S in FunctionTypeImpl.substitute. We should probably rename free | |
12142 // variables during substitution to avoid it. | |
12143 _resolveTestUnit(r''' | |
12144 class C<T> { | |
12145 /*=T*/ f/*<S>*/(/*=S*/ x) { | |
12146 new C<S>().f/*<int>*/(3); | |
12147 return null; | |
12148 } | |
12149 } | |
12150 '''); | |
12151 SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);'); | |
12152 expect(f.staticType.toString(), '(int) → S'); | |
12153 } | |
12154 | |
12155 void setUp() { | 12139 void setUp() { |
12156 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); | 12140 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
12157 options.strongMode = true; | 12141 options.strongMode = true; |
12158 resetWithOptions(options); | 12142 resetWithOptions(options); |
12159 } | 12143 } |
12160 | 12144 |
12161 void test_dynamicObjectGetter_hashCode() { | 12145 void test_dynamicObjectGetter_hashCode() { |
12162 String code = r''' | 12146 String code = r''' |
12163 main() { | 12147 main() { |
12164 dynamic a = null; | 12148 dynamic a = null; |
(...skipping 26 matching lines...) Expand all Loading... |
12191 } | 12175 } |
12192 | 12176 |
12193 void test_genericFunction() { | 12177 void test_genericFunction() { |
12194 if (!AnalysisEngine.instance.useTaskModel) { | 12178 if (!AnalysisEngine.instance.useTaskModel) { |
12195 return; | 12179 return; |
12196 } | 12180 } |
12197 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;'); | 12181 _resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;'); |
12198 SimpleIdentifier f = _findIdentifier('f'); | 12182 SimpleIdentifier f = _findIdentifier('f'); |
12199 FunctionElementImpl e = f.staticElement; | 12183 FunctionElementImpl e = f.staticElement; |
12200 expect(e.typeParameters.toString(), '[T]'); | 12184 expect(e.typeParameters.toString(), '[T]'); |
12201 expect(e.type.typeParameters.toString(), '[T]'); | 12185 expect(e.type.boundTypeParameters.toString(), '[T]'); |
12202 expect(e.type.typeParameters[0].type, e.type.typeArguments[0]); | 12186 expect(e.type.typeParameters.toString(), '[]'); |
12203 expect(e.type.toString(), '(T) → T'); | 12187 expect(e.type.toString(), '<T>(T) → T'); |
12204 | 12188 |
12205 // Substitute for T | 12189 FunctionType ft = e.type.instantiate([typeProvider.stringType]); |
12206 DartType t = e.typeParameters[0].type; | |
12207 FunctionType ft = e.type.substitute2([typeProvider.stringType], [t]); | |
12208 expect(ft.toString(), '(String) → String'); | 12190 expect(ft.toString(), '(String) → String'); |
12209 } | 12191 } |
12210 | 12192 |
12211 void test_genericMethod() { | 12193 void test_genericMethod() { |
12212 if (!AnalysisEngine.instance.useTaskModel) { | 12194 if (!AnalysisEngine.instance.useTaskModel) { |
12213 return; | 12195 return; |
12214 } | 12196 } |
12215 _resolveTestUnit(r''' | 12197 _resolveTestUnit(r''' |
12216 class C<E> { | 12198 class C<E> { |
12217 List/*<T>*/ f/*<T>*/(E e) => null; | 12199 List/*<T>*/ f/*<T>*/(E e) => null; |
12218 } | 12200 } |
12219 main() { | 12201 main() { |
12220 C<String> cOfString; | 12202 C<String> cOfString; |
12221 } | 12203 } |
12222 '''); | 12204 '''); |
12223 SimpleIdentifier f = _findIdentifier('f'); | 12205 SimpleIdentifier f = _findIdentifier('f'); |
12224 MethodElementImpl e = f.staticElement; | 12206 MethodElementImpl e = f.staticElement; |
12225 expect(e.typeParameters.toString(), '[T]'); | 12207 expect(e.typeParameters.toString(), '[T]'); |
12226 expect(e.type.typeParameters.toString(), '[T, E]'); | 12208 expect(e.type.boundTypeParameters.toString(), '[T]'); |
12227 expect(e.type.typeArguments.toString(), '[T, E]'); | 12209 expect(e.type.typeParameters.toString(), '[E]'); |
12228 expect(e.type.toString(), '(E) → List<T>'); | 12210 expect(e.type.typeArguments.toString(), '[E]'); |
| 12211 expect(e.type.toString(), '<T>(E) → List<T>'); |
12229 | 12212 |
12230 SimpleIdentifier c = _findIdentifier('cOfString'); | 12213 SimpleIdentifier c = _findIdentifier('cOfString'); |
12231 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; | 12214 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; |
12232 expect(ft.toString(), '(String) → List<T>'); | 12215 expect(ft.toString(), '<T>(String) → List<T>'); |
12233 DartType t = e.typeParameters[0].type; | 12216 ft = ft.instantiate([typeProvider.intType]); |
12234 ft = ft.substitute2([typeProvider.intType], [t]); | |
12235 expect(ft.toString(), '(String) → List<int>'); | 12217 expect(ft.toString(), '(String) → List<int>'); |
| 12218 expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]'); |
12236 } | 12219 } |
12237 | 12220 |
12238 void test_genericMethod_functionTypedParameter() { | 12221 void test_genericMethod_functionTypedParameter() { |
12239 if (!AnalysisEngine.instance.useTaskModel) { | 12222 if (!AnalysisEngine.instance.useTaskModel) { |
12240 return; | 12223 return; |
12241 } | 12224 } |
12242 _resolveTestUnit(r''' | 12225 _resolveTestUnit(r''' |
12243 class C<E> { | 12226 class C<E> { |
12244 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null; | 12227 List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null; |
12245 } | 12228 } |
12246 main() { | 12229 main() { |
12247 C<String> cOfString; | 12230 C<String> cOfString; |
12248 } | 12231 } |
12249 '''); | 12232 '''); |
12250 SimpleIdentifier f = _findIdentifier('f'); | 12233 SimpleIdentifier f = _findIdentifier('f'); |
12251 MethodElementImpl e = f.staticElement; | 12234 MethodElementImpl e = f.staticElement; |
12252 expect(e.typeParameters.toString(), '[T]'); | 12235 expect(e.typeParameters.toString(), '[T]'); |
12253 expect(e.type.typeParameters.toString(), '[T, E]'); | 12236 expect(e.type.boundTypeParameters.toString(), '[T]'); |
12254 expect(e.type.typeArguments.toString(), '[T, E]'); | 12237 expect(e.type.typeParameters.toString(), '[E]'); |
12255 expect(e.type.toString(), '((E) → T) → List<T>'); | 12238 expect(e.type.typeArguments.toString(), '[E]'); |
| 12239 expect(e.type.toString(), '<T>((E) → T) → List<T>'); |
12256 | 12240 |
12257 SimpleIdentifier c = _findIdentifier('cOfString'); | 12241 SimpleIdentifier c = _findIdentifier('cOfString'); |
12258 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; | 12242 FunctionType ft = (c.staticType as InterfaceType).getMethod('f').type; |
12259 expect(ft.toString(), '((String) → T) → List<T>'); | 12243 expect(ft.toString(), '<T>((String) → T) → List<T>'); |
12260 DartType t = e.typeParameters[0].type; | 12244 ft = ft.instantiate([typeProvider.intType]); |
12261 ft = ft.substitute2([typeProvider.intType], [t]); | |
12262 expect(ft.toString(), '((String) → int) → List<int>'); | 12245 expect(ft.toString(), '((String) → int) → List<int>'); |
12263 } | 12246 } |
12264 | 12247 |
| 12248 void test_genericMethod_nestedCapture() { |
| 12249 _resolveTestUnit(r''' |
| 12250 class C<T> { |
| 12251 /*=T*/ f/*<S>*/(/*=S*/ x) { |
| 12252 new C<S>().f/*<int>*/(3); |
| 12253 new C<S>().f; // tear-off |
| 12254 return null; |
| 12255 } |
| 12256 } |
| 12257 '''); |
| 12258 SimpleIdentifier f = _findIdentifier('f/*<int>*/(3);'); |
| 12259 expect(f.staticType.toString(), '(int) → S'); |
| 12260 FunctionType ft = f.staticType; |
| 12261 expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]'); |
| 12262 |
| 12263 f = _findIdentifier('f;'); |
| 12264 expect(f.staticType.toString(), '<S₀>(S₀) → S'); |
| 12265 } |
| 12266 |
| 12267 void test_genericMethod_nestedFunctions() { |
| 12268 _resolveTestUnit(r''' |
| 12269 /*=S*/ f/*<S>*/(/*=S*/ x) { |
| 12270 g/*<S>*/(/*=S*/ x) => f; |
| 12271 return null; |
| 12272 } |
| 12273 '''); |
| 12274 SimpleIdentifier g = _findIdentifier('f'); |
| 12275 expect(g.staticType.toString(), '<S>(S) → S'); |
| 12276 SimpleIdentifier f = _findIdentifier('g'); |
| 12277 expect(f.staticType.toString(), '<S₀>(S₀) → dynamic'); |
| 12278 } |
| 12279 |
12265 void test_pseudoGeneric_max_doubleDouble() { | 12280 void test_pseudoGeneric_max_doubleDouble() { |
12266 String code = r''' | 12281 String code = r''' |
12267 import 'dart:math'; | 12282 import 'dart:math'; |
12268 main() { | 12283 main() { |
12269 var foo = max(1.0, 2.0); | 12284 var foo = max(1.0, 2.0); |
12270 } | 12285 } |
12271 '''; | 12286 '''; |
12272 _resolveTestUnit(code); | 12287 _resolveTestUnit(code); |
12273 | 12288 |
12274 SimpleIdentifier identifier = _findIdentifier('foo'); | 12289 SimpleIdentifier identifier = _findIdentifier('foo'); |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12846 } | 12861 } |
12847 | 12862 |
12848 void test_getType_noScope() { | 12863 void test_getType_noScope() { |
12849 TypeOverrideManager manager = new TypeOverrideManager(); | 12864 TypeOverrideManager manager = new TypeOverrideManager(); |
12850 expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull); | 12865 expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull); |
12851 } | 12866 } |
12852 } | 12867 } |
12853 | 12868 |
12854 @reflectiveTest | 12869 @reflectiveTest |
12855 class TypePropagationTest extends ResolverTestCase { | 12870 class TypePropagationTest extends ResolverTestCase { |
12856 void test_invocation_target_prefixed() { | |
12857 addNamedSource( | |
12858 '/helper.dart', | |
12859 ''' | |
12860 library helper; | |
12861 int max(int x, int y) => 0; | |
12862 '''); | |
12863 String code = ''' | |
12864 import 'helper.dart' as helper; | |
12865 main() { | |
12866 helper.max(10, 10); // marker | |
12867 }'''; | |
12868 SimpleIdentifier methodName = | |
12869 _findMarkedIdentifier(code, "(10, 10); // marker"); | |
12870 MethodInvocation methodInvoke = methodName.parent; | |
12871 expect(methodInvoke.methodName.staticElement, isNotNull); | |
12872 expect(methodInvoke.methodName.propagatedElement, isNull); | |
12873 } | |
12874 | |
12875 void fail_mergePropagatedTypesAtJoinPoint_1() { | 12871 void fail_mergePropagatedTypesAtJoinPoint_1() { |
12876 // https://code.google.com/p/dart/issues/detail?id=19929 | 12872 // https://code.google.com/p/dart/issues/detail?id=19929 |
12877 _assertTypeOfMarkedExpression( | 12873 _assertTypeOfMarkedExpression( |
12878 r''' | 12874 r''' |
12879 f1(x) { | 12875 f1(x) { |
12880 var y = []; | 12876 var y = []; |
12881 if (x) { | 12877 if (x) { |
12882 y = 0; | 12878 y = 0; |
12883 } else { | 12879 } else { |
12884 y = ''; | 12880 y = ''; |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13684 expect(identifier.propagatedType, same(null)); | 13680 expect(identifier.propagatedType, same(null)); |
13685 } | 13681 } |
13686 { | 13682 { |
13687 SimpleIdentifier identifier = EngineTestCase.findNode( | 13683 SimpleIdentifier identifier = EngineTestCase.findNode( |
13688 unit, code, "v; // marker", (node) => node is SimpleIdentifier); | 13684 unit, code, "v; // marker", (node) => node is SimpleIdentifier); |
13689 expect(identifier.staticType, same(typeProvider.intType)); | 13685 expect(identifier.staticType, same(typeProvider.intType)); |
13690 expect(identifier.propagatedType, same(null)); | 13686 expect(identifier.propagatedType, same(null)); |
13691 } | 13687 } |
13692 } | 13688 } |
13693 | 13689 |
| 13690 void test_invocation_target_prefixed() { |
| 13691 addNamedSource( |
| 13692 '/helper.dart', |
| 13693 ''' |
| 13694 library helper; |
| 13695 int max(int x, int y) => 0; |
| 13696 '''); |
| 13697 String code = ''' |
| 13698 import 'helper.dart' as helper; |
| 13699 main() { |
| 13700 helper.max(10, 10); // marker |
| 13701 }'''; |
| 13702 SimpleIdentifier methodName = |
| 13703 _findMarkedIdentifier(code, "(10, 10); // marker"); |
| 13704 MethodInvocation methodInvoke = methodName.parent; |
| 13705 expect(methodInvoke.methodName.staticElement, isNotNull); |
| 13706 expect(methodInvoke.methodName.propagatedElement, isNull); |
| 13707 } |
| 13708 |
13694 void test_is_conditional() { | 13709 void test_is_conditional() { |
13695 Source source = addSource(r''' | 13710 Source source = addSource(r''' |
13696 class A {} | 13711 class A {} |
13697 A f(var p) { | 13712 A f(var p) { |
13698 return (p is A) ? p : null; | 13713 return (p is A) ? p : null; |
13699 }'''); | 13714 }'''); |
13700 LibraryElement library = resolve2(source); | 13715 LibraryElement library = resolve2(source); |
13701 assertNoErrors(source); | 13716 assertNoErrors(source); |
13702 verify([source]); | 13717 verify([source]); |
13703 CompilationUnit unit = resolveCompilationUnit(source, library); | 13718 CompilationUnit unit = resolveCompilationUnit(source, library); |
(...skipping 1574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15278 | 15293 |
15279 void _resolveTestUnit(String code) { | 15294 void _resolveTestUnit(String code) { |
15280 testCode = code; | 15295 testCode = code; |
15281 testSource = addSource(testCode); | 15296 testSource = addSource(testCode); |
15282 LibraryElement library = resolve2(testSource); | 15297 LibraryElement library = resolve2(testSource); |
15283 assertNoErrors(testSource); | 15298 assertNoErrors(testSource); |
15284 verify([testSource]); | 15299 verify([testSource]); |
15285 testUnit = resolveCompilationUnit(testSource, library); | 15300 testUnit = resolveCompilationUnit(testSource, library); |
15286 } | 15301 } |
15287 } | 15302 } |
OLD | NEW |