| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.declaration_resolver_test; | 5 library engine.declaration_resolver_test; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/element/element.dart'; | 7 import 'package:analyzer/dart/element/element.dart'; |
| 8 import 'package:analyzer/src/generated/ast.dart'; | 8 import 'package:analyzer/src/generated/ast.dart'; |
| 9 import 'package:analyzer/src/generated/engine.dart'; |
| 9 import 'package:analyzer/src/generated/resolver.dart'; | 10 import 'package:analyzer/src/generated/resolver.dart'; |
| 10 import 'package:unittest/unittest.dart'; | 11 import 'package:unittest/unittest.dart'; |
| 11 | 12 |
| 12 import '../reflective_tests.dart'; | 13 import '../reflective_tests.dart'; |
| 13 import '../utils.dart'; | 14 import '../utils.dart'; |
| 14 import 'resolver_test.dart'; | 15 import 'resolver_test.dart'; |
| 15 import 'test_support.dart'; | 16 import 'test_support.dart'; |
| 16 | 17 |
| 17 main() { | 18 main() { |
| 18 initializeTestEnvironment(); | 19 initializeTestEnvironment(); |
| 19 runReflectiveTests(DeclarationResolverTest); | 20 runReflectiveTests(DeclarationResolverTest); |
| 21 runReflectiveTests(StrongModeDeclarationResolverTest); |
| 22 } |
| 23 |
| 24 CompilationUnit _cloneResolveUnit(CompilationUnit unit) { |
| 25 CompilationUnit clonedUnit = AstCloner.clone(unit); |
| 26 new DeclarationResolver().resolve(clonedUnit, unit.element); |
| 27 return clonedUnit; |
| 28 } |
| 29 |
| 30 SimpleIdentifier _findSimpleIdentifier( |
| 31 AstNode root, String code, String search) { |
| 32 return EngineTestCase.findNode( |
| 33 root, code, search, (n) => n is SimpleIdentifier); |
| 20 } | 34 } |
| 21 | 35 |
| 22 @reflectiveTest | 36 @reflectiveTest |
| 23 class DeclarationResolverTest extends ResolverTestCase { | 37 class DeclarationResolverTest extends ResolverTestCase { |
| 24 @override | 38 @override |
| 25 void setUp() { | 39 void setUp() { |
| 26 super.setUp(); | 40 super.setUp(); |
| 27 } | 41 } |
| 28 | 42 |
| 29 void test_functionDeclaration_getter() { | 43 void test_functionDeclaration_getter() { |
| 30 String code = r''' | 44 String code = r''' |
| 31 int get zzz => 42; | 45 int get zzz => 42; |
| 32 '''; | 46 '''; |
| 33 CompilationUnit unit = resolveSource(code); | 47 CompilationUnit unit = resolveSource(code); |
| 34 PropertyAccessorElement getterElement = | 48 PropertyAccessorElement getterElement = |
| 35 findSimpleIdentifier(unit, code, 'zzz =>').staticElement; | 49 _findSimpleIdentifier(unit, code, 'zzz =>').staticElement; |
| 36 expect(getterElement.isGetter, isTrue); | 50 expect(getterElement.isGetter, isTrue); |
| 37 // re-resolve | 51 // re-resolve |
| 38 CompilationUnit unit2 = _cloneResolveUnit(unit); | 52 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 39 SimpleIdentifier getterName = findSimpleIdentifier(unit2, code, 'zzz =>'); | 53 SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz =>'); |
| 40 expect(getterName.staticElement, same(getterElement)); | 54 expect(getterName.staticElement, same(getterElement)); |
| 41 } | 55 } |
| 42 | 56 |
| 43 void test_functionDeclaration_setter() { | 57 void test_functionDeclaration_setter() { |
| 44 String code = r''' | 58 String code = r''' |
| 45 void set zzz(_) {} | 59 void set zzz(_) {} |
| 46 '''; | 60 '''; |
| 47 CompilationUnit unit = resolveSource(code); | 61 CompilationUnit unit = resolveSource(code); |
| 48 PropertyAccessorElement setterElement = | 62 PropertyAccessorElement setterElement = |
| 49 findSimpleIdentifier(unit, code, 'zzz(_)').staticElement; | 63 _findSimpleIdentifier(unit, code, 'zzz(_)').staticElement; |
| 50 expect(setterElement.isSetter, isTrue); | 64 expect(setterElement.isSetter, isTrue); |
| 51 // re-resolve | 65 // re-resolve |
| 52 CompilationUnit unit2 = _cloneResolveUnit(unit); | 66 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 53 SimpleIdentifier getterName = findSimpleIdentifier(unit2, code, 'zzz(_)'); | 67 SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz(_)'); |
| 54 expect(getterName.staticElement, same(setterElement)); | 68 expect(getterName.staticElement, same(setterElement)); |
| 55 } | 69 } |
| 56 | 70 |
| 57 void test_invalid_functionDeclaration_getter_inFunction() { | 71 void test_invalid_functionDeclaration_getter_inFunction() { |
| 58 String code = r''' | 72 String code = r''' |
| 59 main() { | 73 main() { |
| 60 int get zzz => 42; | 74 int get zzz => 42; |
| 61 } | 75 } |
| 62 '''; | 76 '''; |
| 63 CompilationUnit unit = resolveSource(code); | 77 CompilationUnit unit = resolveSource(code); |
| 64 FunctionElement getterElement = | 78 FunctionElement getterElement = |
| 65 findSimpleIdentifier(unit, code, 'zzz =>').staticElement; | 79 _findSimpleIdentifier(unit, code, 'zzz =>').staticElement; |
| 66 // re-resolve | 80 // re-resolve |
| 67 CompilationUnit unit2 = _cloneResolveUnit(unit); | 81 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 68 SimpleIdentifier getterName = findSimpleIdentifier(unit2, code, 'zzz =>'); | 82 SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz =>'); |
| 69 expect(getterName.staticElement, same(getterElement)); | 83 expect(getterName.staticElement, same(getterElement)); |
| 70 } | 84 } |
| 71 | 85 |
| 72 void test_invalid_functionDeclaration_setter_inFunction() { | 86 void test_invalid_functionDeclaration_setter_inFunction() { |
| 73 String code = r''' | 87 String code = r''' |
| 74 main() { | 88 main() { |
| 75 set zzz(x) {} | 89 set zzz(x) {} |
| 76 } | 90 } |
| 77 '''; | 91 '''; |
| 78 CompilationUnit unit = resolveSource(code); | 92 CompilationUnit unit = resolveSource(code); |
| 79 FunctionElement setterElement = | 93 FunctionElement setterElement = |
| 80 findSimpleIdentifier(unit, code, 'zzz(x)').staticElement; | 94 _findSimpleIdentifier(unit, code, 'zzz(x)').staticElement; |
| 81 // re-resolve | 95 // re-resolve |
| 82 CompilationUnit unit2 = _cloneResolveUnit(unit); | 96 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 83 SimpleIdentifier setterName = findSimpleIdentifier(unit2, code, 'zzz(x)'); | 97 SimpleIdentifier setterName = _findSimpleIdentifier(unit2, code, 'zzz(x)'); |
| 84 expect(setterName.staticElement, same(setterElement)); | 98 expect(setterName.staticElement, same(setterElement)); |
| 85 } | 99 } |
| 100 } |
| 86 | 101 |
| 87 static SimpleIdentifier findSimpleIdentifier( | 102 /** |
| 88 AstNode root, String code, String search) { | 103 * Strong mode DeclarationResolver tests |
| 89 return EngineTestCase.findNode( | 104 */ |
| 90 root, code, search, (n) => n is SimpleIdentifier); | 105 @reflectiveTest |
| 106 class StrongModeDeclarationResolverTest extends ResolverTestCase { |
| 107 @override |
| 108 void setUp() { |
| 109 resetWithOptions(new AnalysisOptionsImpl()..strongMode = true); |
| 91 } | 110 } |
| 92 | 111 |
| 93 static CompilationUnit _cloneResolveUnit(CompilationUnit unit) { | 112 void test_genericFunction_typeParameter() { |
| 94 CompilationUnit clonedUnit = AstCloner.clone(unit); | 113 String code = r''' |
| 95 new DeclarationResolver().resolve(clonedUnit, unit.element); | 114 /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null; |
| 96 return clonedUnit; | 115 '''; |
| 116 CompilationUnit unit = resolveSource(code); |
| 117 FunctionDeclaration node = _findSimpleIdentifier(unit, code, 'max').parent; |
| 118 TypeParameter t = node.functionExpression.typeParameters.typeParameters[0]; |
| 119 |
| 120 FunctionElement element = node.name.staticElement; |
| 121 TypeParameterElement tElement = element.typeParameters[0]; |
| 122 expect(tElement, isNotNull); |
| 123 expect(element.typeParameters.toString(), "[T]"); |
| 124 expect(element.type.toString(), "<T>(T, T) → T"); |
| 125 expect(t.element, same(tElement)); |
| 126 |
| 127 // re-resolve |
| 128 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 129 node = _findSimpleIdentifier(unit2, code, 'max').parent; |
| 130 t = node.functionExpression.typeParameters.typeParameters[0]; |
| 131 expect(t.element, same(tElement)); |
| 132 } |
| 133 |
| 134 void test_genericMethod_typeParameter() { |
| 135 String code = r''' |
| 136 class C { |
| 137 /*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null; |
| 138 } |
| 139 '''; |
| 140 CompilationUnit unit = resolveSource(code); |
| 141 MethodDeclaration node = _findSimpleIdentifier(unit, code, 'max').parent; |
| 142 TypeParameter t = node.typeParameters.typeParameters[0]; |
| 143 |
| 144 MethodElement element = node.name.staticElement; |
| 145 TypeParameterElement tElement = element.typeParameters[0]; |
| 146 expect(tElement, isNotNull); |
| 147 expect(element.typeParameters.toString(), "[T]"); |
| 148 expect(element.type.toString(), "<T>(T, T) → T"); |
| 149 expect(t.element, same(tElement)); |
| 150 |
| 151 // re-resolve |
| 152 CompilationUnit unit2 = _cloneResolveUnit(unit); |
| 153 node = _findSimpleIdentifier(unit2, code, 'max').parent; |
| 154 t = node.typeParameters.typeParameters[0]; |
| 155 expect(t.element, same(tElement)); |
| 97 } | 156 } |
| 98 } | 157 } |
| OLD | NEW |