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

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

Issue 1555213002: fix #25305, DeclarationResolver.visitTypeParameter now handles generic methods (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: 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
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.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) 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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698