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

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

Issue 2435313002: More improvements to DeclarationResolver. (Closed)
Patch Set: Created 4 years, 1 month 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) 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/ast/ast.dart'; 7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/element/element.dart'; 8 import 'package:analyzer/dart/element/element.dart';
9 import 'package:analyzer/src/dart/ast/ast.dart'; 9 import 'package:analyzer/src/dart/ast/ast.dart';
10 import 'package:analyzer/src/dart/ast/utilities.dart'; 10 import 'package:analyzer/src/dart/ast/utilities.dart';
(...skipping 27 matching lines...) Expand all
38 return EngineTestCase.findNode( 38 return EngineTestCase.findNode(
39 root, code, search, (n) => n is SimpleIdentifier); 39 root, code, search, (n) => n is SimpleIdentifier);
40 } 40 }
41 41
42 @reflectiveTest 42 @reflectiveTest
43 class DeclarationResolverMetadataTest extends ResolverTestCase { 43 class DeclarationResolverMetadataTest extends ResolverTestCase {
44 String code; 44 String code;
45 CompilationUnit unit; 45 CompilationUnit unit;
46 CompilationUnit unit2; 46 CompilationUnit unit2;
47 47
48 void checkMetadata(String search) { 48 void checkMetadata(String search, {bool expectDifferent: false}) {
49 NodeList<Annotation> metadata = _findMetadata(unit, search); 49 NodeList<Annotation> metadata = _findMetadata(unit, search);
50 NodeList<Annotation> metadata2 = _findMetadata(unit2, search); 50 NodeList<Annotation> metadata2 = _findMetadata(unit2, search);
51 expect(metadata, isNotEmpty); 51 expect(metadata, isNotEmpty);
52 for (int i = 0; i < metadata.length; i++) { 52 for (int i = 0; i < metadata.length; i++) {
53 expect( 53 Matcher expectation = same(metadata[i].elementAnnotation);
54 metadata2[i].elementAnnotation, same(metadata[i].elementAnnotation)); 54 if (expectDifferent) {
55 expectation = isNot(expectation);
56 }
57 expect(metadata2[i].elementAnnotation, expectation);
55 } 58 }
56 } 59 }
57 60
58 void setupCode(String code) { 61 void setupCode(String code) {
59 this.code = code; 62 this.code = code;
60 unit = resolveSource(code + ' const a = null;'); 63 unit = resolveSource(code + ' const a = null;');
61 unit2 = _cloneResolveUnit(unit); 64 unit2 = _cloneResolveUnit(unit);
62 } 65 }
63 66
64 void test_metadata_classDeclaration() { 67 void test_metadata_classDeclaration() {
(...skipping 11 matching lines...) Expand all
76 checkMetadata('x'); 79 checkMetadata('x');
77 } 80 }
78 81
79 void test_metadata_constructorDeclaration_unnamed() { 82 void test_metadata_constructorDeclaration_unnamed() {
80 setupCode('class C { @a C(); }'); 83 setupCode('class C { @a C(); }');
81 checkMetadata('C()'); 84 checkMetadata('C()');
82 } 85 }
83 86
84 void test_metadata_declaredIdentifier() { 87 void test_metadata_declaredIdentifier() {
85 setupCode('f(x, y) { for (@a var x in y) {} }'); 88 setupCode('f(x, y) { for (@a var x in y) {} }');
86 checkMetadata('var'); 89 checkMetadata('var', expectDifferent: true);
87 } 90 }
88 91
89 void test_metadata_enumDeclaration() { 92 void test_metadata_enumDeclaration() {
90 setupCode('@a enum E { v }'); 93 setupCode('@a enum E { v }');
91 checkMetadata('E'); 94 checkMetadata('E');
92 } 95 }
93 96
94 void test_metadata_exportDirective() { 97 void test_metadata_exportDirective() {
95 addNamedSource('/foo.dart', 'class C {}'); 98 addNamedSource('/foo.dart', 'class C {}');
96 setupCode('@a export "foo.dart";'); 99 setupCode('@a export "foo.dart";');
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 setupCode('f() { @a g() {} }'); 171 setupCode('f() { @a g() {} }');
169 // Note: metadata on local function declarations is ignored by the 172 // Note: metadata on local function declarations is ignored by the
170 // analyzer. TODO(paulberry): is this a bug? 173 // analyzer. TODO(paulberry): is this a bug?
171 FunctionDeclaration node = EngineTestCase.findNode( 174 FunctionDeclaration node = EngineTestCase.findNode(
172 unit, code, 'g', (AstNode n) => n is FunctionDeclaration); 175 unit, code, 'g', (AstNode n) => n is FunctionDeclaration);
173 expect((node as FunctionDeclarationImpl).metadata, isEmpty); 176 expect((node as FunctionDeclarationImpl).metadata, isEmpty);
174 } 177 }
175 178
176 void test_metadata_localVariableDeclaration() { 179 void test_metadata_localVariableDeclaration() {
177 setupCode('f() { @a int x; }'); 180 setupCode('f() { @a int x; }');
178 checkMetadata('x'); 181 checkMetadata('x', expectDifferent: true);
179 } 182 }
180 183
181 void test_metadata_methodDeclaration_getter() { 184 void test_metadata_methodDeclaration_getter() {
182 setupCode('class C { @a get m => null; }'); 185 setupCode('class C { @a get m => null; }');
183 checkMetadata('m'); 186 checkMetadata('m');
184 } 187 }
185 188
186 void test_metadata_methodDeclaration_method() { 189 void test_metadata_methodDeclaration_method() {
187 setupCode('class C { @a m() {} }'); 190 setupCode('class C { @a m() {} }');
188 checkMetadata('m'); 191 checkMetadata('m');
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 } 254 }
252 } 255 }
253 256
254 @reflectiveTest 257 @reflectiveTest
255 class DeclarationResolverTest extends ResolverTestCase { 258 class DeclarationResolverTest extends ResolverTestCase {
256 @override 259 @override
257 void setUp() { 260 void setUp() {
258 super.setUp(); 261 super.setUp();
259 } 262 }
260 263
264 void test_closure_inside_catch_block() {
265 String code = '''
266 f() {
267 try {
268 } catch (e) {
269 return () => null;
270 }
271 }
272 ''';
273 CompilationUnit unit = resolveSource(code);
274 // re-resolve
275 _cloneResolveUnit(unit);
276 // no other validations than built into DeclarationResolver
277 }
278
279 void test_closure_inside_labeled_statement() {
280 String code = '''
281 f(b) {
282 foo: while (true) {
283 if (b) {
284 break foo;
285 }
286 return () => null;
287 }
288 }
289 ''';
290 CompilationUnit unit = resolveSource(code);
291 // re-resolve
292 _cloneResolveUnit(unit);
293 // no other validations than built into DeclarationResolver
294 }
295
296 void test_closure_inside_switch_case() {
297 String code = '''
298 void f(k, m) {
299 switch (k) {
300 case 0:
301 m.forEach((key, value) {});
302 break;
303 }
304 }
305 ''';
306 CompilationUnit unit = resolveSource(code);
307 // re-resolve
308 _cloneResolveUnit(unit);
309 // no other validations than built into DeclarationResolver
310 }
311
312 void test_closure_inside_switch_default() {
313 String code = '''
314 void f(k, m) {
315 switch (k) {
316 default:
317 m.forEach((key, value) {});
318 break;
319 }
320 }
321 ''';
322 CompilationUnit unit = resolveSource(code);
323 // re-resolve
324 _cloneResolveUnit(unit);
325 // no other validations than built into DeclarationResolver
326 }
327
261 void test_enumConstant_partiallyResolved() { 328 void test_enumConstant_partiallyResolved() {
262 String code = r''' 329 String code = r'''
263 enum Fruit {apple, pear} 330 enum Fruit {apple, pear}
264 '''; 331 ''';
265 Source source = addNamedSource('/test.dart', code); 332 Source source = addNamedSource('/test.dart', code);
266 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source); 333 LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
267 analysisContext.computeResult(source, LIBRARY_ELEMENT1); 334 analysisContext.computeResult(source, LIBRARY_ELEMENT1);
268 CompilationUnit unit = 335 CompilationUnit unit =
269 analysisContext.computeResult(target, RESOLVED_UNIT1); 336 analysisContext.computeResult(target, RESOLVED_UNIT1);
270 _cloneResolveUnit(unit); 337 _cloneResolveUnit(unit);
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 expect(element.type.toString(), "<T>(T, T) → T"); 603 expect(element.type.toString(), "<T>(T, T) → T");
537 expect(t.element, same(tElement)); 604 expect(t.element, same(tElement));
538 605
539 // re-resolve 606 // re-resolve
540 CompilationUnit unit2 = _cloneResolveUnit(unit); 607 CompilationUnit unit2 = _cloneResolveUnit(unit);
541 node = _findSimpleIdentifier(unit2, code, 'max').parent; 608 node = _findSimpleIdentifier(unit2, code, 'max').parent;
542 t = node.typeParameters.typeParameters[0]; 609 t = node.typeParameters.typeParameters[0];
543 expect(t.element, same(tElement)); 610 expect(t.element, same(tElement));
544 } 611 }
545 } 612 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/declaration_resolver.dart ('k') | pkg/analyzer/test/src/context/context_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698