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

Side by Side Diff: packages/analyzer/test/src/task/strong_mode_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 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
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library test.src.task.strong_mode_test;
6
7 import 'package:analyzer/src/generated/ast.dart';
8 import 'package:analyzer/src/generated/element.dart';
9 import 'package:analyzer/src/generated/source.dart';
10 import 'package:analyzer/src/task/strong_mode.dart';
11 import 'package:unittest/unittest.dart';
12
13 import '../../reflective_tests.dart';
14 import '../../utils.dart';
15 import '../context/abstract_context.dart';
16
17 main() {
18 initializeTestEnvironment();
19 runReflectiveTests(InstanceMemberInferrerTest);
20 runReflectiveTests(VariableGathererTest);
21 }
22
23 @reflectiveTest
24 class InstanceMemberInferrerTest extends AbstractContextTest {
25 InstanceMemberInferrer get createInferrer =>
26 new InstanceMemberInferrer(context.typeProvider,
27 typeSystem: context.typeSystem);
28
29 /**
30 * Add a source with the given [content] and return the result of resolving
31 * the source.
32 */
33 CompilationUnitElement resolve(String content) {
34 Source source = addSource('/test.dart', content);
35 return context.resolveCompilationUnit2(source, source).element;
36 }
37
38 void test_creation() {
39 InstanceMemberInferrer inferrer = createInferrer;
40 expect(inferrer, isNotNull);
41 expect(inferrer.typeSystem, isNotNull);
42 }
43
44 void test_inferCompilationUnit_field_multiple_different() {
45 InstanceMemberInferrer inferrer = createInferrer;
46 String fieldName = 'f';
47 CompilationUnitElement unit = resolve('''
48 class A {
49 int $fieldName;
50 }
51 class B {
52 double $fieldName;
53 }
54 class C implements A, B {
55 var $fieldName;
56 }
57 ''');
58 ClassElement classC = unit.getType('C');
59 FieldElement fieldC = classC.getField(fieldName);
60 PropertyAccessorElement getterC = classC.getGetter(fieldName);
61 expect(fieldC.type.isDynamic, isTrue);
62 expect(getterC.returnType.isDynamic, isTrue);
63
64 inferrer.inferCompilationUnit(unit);
65
66 expect(fieldC.type.isDynamic, isTrue);
67 expect(getterC.returnType.isDynamic, isTrue);
68 }
69
70 void test_inferCompilationUnit_field_multiple_different_generic() {
71 InstanceMemberInferrer inferrer = createInferrer;
72 String fieldName = 'f';
73 CompilationUnitElement unit = resolve('''
74 class A<E> {
75 E $fieldName;
76 }
77 class B<E> {
78 E $fieldName;
79 }
80 class C implements A<int>, B<double> {
81 var $fieldName;
82 }
83 ''');
84 ClassElement classC = unit.getType('C');
85 FieldElement fieldC = classC.getField(fieldName);
86 PropertyAccessorElement getterC = classC.getGetter(fieldName);
87 expect(fieldC.type.isDynamic, isTrue);
88 expect(getterC.returnType.isDynamic, isTrue);
89
90 inferrer.inferCompilationUnit(unit);
91
92 expect(fieldC.type.isDynamic, isTrue);
93 expect(getterC.returnType.isDynamic, isTrue);
94 }
95
96 void test_inferCompilationUnit_field_multiple_dynamic() {
97 InstanceMemberInferrer inferrer = createInferrer;
98 String fieldName = 'f';
99 CompilationUnitElement unit = resolve('''
100 class A {
101 int $fieldName;
102 }
103 class B {
104 var $fieldName;
105 }
106 class C implements A, B {
107 var $fieldName;
108 }
109 ''');
110 ClassElement classC = unit.getType('C');
111 FieldElement fieldC = classC.getField(fieldName);
112 PropertyAccessorElement getterC = classC.getGetter(fieldName);
113 expect(fieldC.type.isDynamic, isTrue);
114 expect(getterC.returnType.isDynamic, isTrue);
115
116 inferrer.inferCompilationUnit(unit);
117
118 expect(fieldC.type.isDynamic, isTrue);
119 expect(getterC.returnType.isDynamic, isTrue);
120 }
121
122 void test_inferCompilationUnit_field_multiple_same() {
123 InstanceMemberInferrer inferrer = createInferrer;
124 String fieldName = 'f';
125 CompilationUnitElement unit = resolve('''
126 class A {
127 int $fieldName;
128 }
129 class B {
130 int $fieldName;
131 }
132 class C implements A, B {
133 var $fieldName;
134 }
135 ''');
136 ClassElement classA = unit.getType('A');
137 FieldElement fieldA = classA.getField(fieldName);
138 DartType expectedType = fieldA.type;
139 ClassElement classC = unit.getType('C');
140 FieldElement fieldC = classC.getField(fieldName);
141 PropertyAccessorElement getterC = classC.getGetter(fieldName);
142 expect(fieldC.type.isDynamic, isTrue);
143 expect(getterC.returnType.isDynamic, isTrue);
144
145 inferrer.inferCompilationUnit(unit);
146
147 expect(fieldC.type, expectedType);
148 expect(getterC.returnType, expectedType);
149 }
150
151 void test_inferCompilationUnit_field_noOverride() {
152 InstanceMemberInferrer inferrer = createInferrer;
153 String fieldName = 'f';
154 CompilationUnitElement unit = resolve('''
155 class A {
156 final $fieldName = 0;
157 }
158 ''');
159 ClassElement classA = unit.getType('A');
160 FieldElement fieldA = classA.getField(fieldName);
161 PropertyAccessorElement getterA = classA.getGetter(fieldName);
162 expect(fieldA.type.isDynamic, isTrue);
163 expect(getterA.returnType.isDynamic, isTrue);
164
165 inferrer.inferCompilationUnit(unit);
166
167 DartType intType = inferrer.typeProvider.intType;
168 expect(fieldA.type, intType);
169 expect(getterA.returnType, intType);
170 }
171
172 void test_inferCompilationUnit_field_noOverride_bottom() {
173 InstanceMemberInferrer inferrer = createInferrer;
174 String fieldName = 'f';
175 CompilationUnitElement unit = resolve('''
176 class A {
177 var $fieldName = null;
178 }
179 ''');
180 ClassElement classA = unit.getType('A');
181 FieldElement fieldA = classA.getField(fieldName);
182 PropertyAccessorElement getterA = classA.getGetter(fieldName);
183 expect(fieldA.type.isDynamic, isTrue);
184 expect(getterA.returnType.isDynamic, isTrue);
185
186 inferrer.inferCompilationUnit(unit);
187
188 expect(fieldA.type.isDynamic, isTrue);
189 expect(getterA.returnType.isDynamic, isTrue);
190 }
191
192 void test_inferCompilationUnit_field_single_explicitlyDynamic() {
193 InstanceMemberInferrer inferrer = createInferrer;
194 String fieldName = 'f';
195 CompilationUnitElement unit = resolve('''
196 class A {
197 dynamic $fieldName;
198 }
199 class B extends A {
200 var $fieldName = 0;
201 }
202 ''');
203 ClassElement classA = unit.getType('A');
204 FieldElement fieldA = classA.getField(fieldName);
205 PropertyAccessorElement getterA = classA.getGetter(fieldName);
206 ClassElement classB = unit.getType('B');
207 FieldElement fieldB = classB.getField(fieldName);
208 PropertyAccessorElement getterB = classB.getGetter(fieldName);
209 expect(fieldB.type.isDynamic, isTrue);
210 expect(getterB.returnType.isDynamic, isTrue);
211
212 inferrer.inferCompilationUnit(unit);
213
214 expect(fieldB.type, fieldA.type);
215 expect(getterB.returnType, getterA.returnType);
216 }
217
218 void test_inferCompilationUnit_field_single_final() {
219 InstanceMemberInferrer inferrer = createInferrer;
220 String fieldName = 'f';
221 CompilationUnitElement unit = resolve('''
222 class A {
223 final int $fieldName;
224 }
225 class B extends A {
226 final $fieldName;
227 }
228 ''');
229 ClassElement classA = unit.getType('A');
230 FieldElement fieldA = classA.getField(fieldName);
231 PropertyAccessorElement getterA = classA.getGetter(fieldName);
232 ClassElement classB = unit.getType('B');
233 FieldElement fieldB = classB.getField(fieldName);
234 PropertyAccessorElement getterB = classB.getGetter(fieldName);
235 expect(fieldB.type.isDynamic, isTrue);
236 expect(getterB.returnType.isDynamic, isTrue);
237
238 inferrer.inferCompilationUnit(unit);
239
240 expect(fieldB.type, fieldA.type);
241 expect(getterB.returnType, getterA.returnType);
242 }
243
244 void test_inferCompilationUnit_field_single_final_narrowType() {
245 InstanceMemberInferrer inferrer = createInferrer;
246 String fieldName = 'f';
247 CompilationUnitElement unit = resolve('''
248 class A {
249 final $fieldName;
250 }
251 class B extends A {
252 final $fieldName = 0;
253 }
254 ''');
255 ClassElement classB = unit.getType('B');
256 FieldElement fieldB = classB.getField(fieldName);
257 PropertyAccessorElement getterB = classB.getGetter(fieldName);
258 expect(fieldB.type.isDynamic, isTrue);
259 expect(getterB.returnType.isDynamic, isTrue);
260
261 inferrer.inferCompilationUnit(unit);
262
263 expect(fieldB.type, inferrer.typeProvider.intType);
264 expect(getterB.returnType, fieldB.type);
265 }
266
267 void test_inferCompilationUnit_field_single_generic() {
268 InstanceMemberInferrer inferrer = createInferrer;
269 String fieldName = 'f';
270 CompilationUnitElement unit = resolve('''
271 class A<E> {
272 E $fieldName;
273 }
274 class B<E> extends A<E> {
275 var $fieldName;
276 }
277 ''');
278 ClassElement classB = unit.getType('B');
279 DartType typeBE = classB.typeParameters[0].type;
280 FieldElement fieldB = classB.getField(fieldName);
281 PropertyAccessorElement getterB = classB.getGetter(fieldName);
282 expect(fieldB.type.isDynamic, isTrue);
283 expect(getterB.returnType.isDynamic, isTrue);
284
285 inferrer.inferCompilationUnit(unit);
286
287 expect(fieldB.type, typeBE);
288 expect(getterB.returnType, typeBE);
289 }
290
291 void test_inferCompilationUnit_field_single_inconsistentAccessors() {
292 InstanceMemberInferrer inferrer = createInferrer;
293 String fieldName = 'f';
294 CompilationUnitElement unit = resolve('''
295 class A {
296 int get $fieldName => 0;
297 set $fieldName(String value) {}
298 }
299 class B extends A {
300 var $fieldName;
301 }
302 ''');
303 ClassElement classB = unit.getType('B');
304 FieldElement fieldB = classB.getField(fieldName);
305 PropertyAccessorElement getterB = classB.getGetter(fieldName);
306 expect(fieldB.type.isDynamic, isTrue);
307 expect(getterB.returnType.isDynamic, isTrue);
308
309 inferrer.inferCompilationUnit(unit);
310
311 expect(fieldB.type.isDynamic, isTrue);
312 expect(getterB.returnType.isDynamic, isTrue);
313 }
314
315 void test_inferCompilationUnit_field_single_noModifiers() {
316 InstanceMemberInferrer inferrer = createInferrer;
317 String fieldName = 'f';
318 CompilationUnitElement unit = resolve('''
319 class A {
320 int $fieldName;
321 }
322 class B extends A {
323 var $fieldName;
324 }
325 ''');
326 ClassElement classA = unit.getType('A');
327 FieldElement fieldA = classA.getField(fieldName);
328 PropertyAccessorElement getterA = classA.getGetter(fieldName);
329 ClassElement classB = unit.getType('B');
330 FieldElement fieldB = classB.getField(fieldName);
331 PropertyAccessorElement getterB = classB.getGetter(fieldName);
332 expect(fieldB.type.isDynamic, isTrue);
333 expect(getterB.returnType.isDynamic, isTrue);
334
335 inferrer.inferCompilationUnit(unit);
336
337 expect(fieldB.type, fieldA.type);
338 expect(getterB.returnType, getterA.returnType);
339 }
340
341 void test_inferCompilationUnit_getter_multiple_different() {
342 InstanceMemberInferrer inferrer = createInferrer;
343 String getterName = 'g';
344 CompilationUnitElement unit = resolve('''
345 class A {
346 int get $getterName => 0;
347 }
348 class B {
349 double get $getterName => 0.0;
350 }
351 class C implements A, B {
352 get $getterName => 0;
353 }
354 ''');
355 ClassElement classC = unit.getType('C');
356 FieldElement fieldC = classC.getField(getterName);
357 PropertyAccessorElement getterC = classC.getGetter(getterName);
358 expect(fieldC.type.isDynamic, isTrue);
359 expect(getterC.returnType.isDynamic, isTrue);
360
361 inferrer.inferCompilationUnit(unit);
362
363 expect(fieldC.type.isDynamic, isTrue);
364 expect(getterC.returnType.isDynamic, isTrue);
365 }
366
367 void test_inferCompilationUnit_getter_multiple_dynamic() {
368 InstanceMemberInferrer inferrer = createInferrer;
369 String getterName = 'g';
370 CompilationUnitElement unit = resolve('''
371 class A {
372 int get $getterName => 0;
373 }
374 class B {
375 get $getterName => 0;
376 }
377 class C implements A, B {
378 get $getterName => 0;
379 }
380 ''');
381 ClassElement classC = unit.getType('C');
382 FieldElement fieldC = classC.getField(getterName);
383 PropertyAccessorElement getterC = classC.getGetter(getterName);
384 expect(fieldC.type.isDynamic, isTrue);
385 expect(getterC.returnType.isDynamic, isTrue);
386
387 inferrer.inferCompilationUnit(unit);
388
389 expect(fieldC.type.isDynamic, isTrue);
390 expect(getterC.returnType.isDynamic, isTrue);
391 }
392
393 void test_inferCompilationUnit_getter_multiple_same() {
394 InstanceMemberInferrer inferrer = createInferrer;
395 String getterName = 'g';
396 CompilationUnitElement unit = resolve('''
397 class A {
398 String get $getterName => '';
399 }
400 class B {
401 String get $getterName => '';
402 }
403 class C implements A, B {
404 get $getterName => '';
405 }
406 ''');
407 ClassElement classA = unit.getType('A');
408 PropertyAccessorElement getterA = classA.getGetter(getterName);
409 DartType expectedType = getterA.returnType;
410 ClassElement classC = unit.getType('C');
411 FieldElement fieldC = classC.getField(getterName);
412 PropertyAccessorElement getterC = classC.getGetter(getterName);
413 expect(fieldC.type.isDynamic, isTrue);
414 expect(getterC.returnType.isDynamic, isTrue);
415
416 inferrer.inferCompilationUnit(unit);
417
418 expect(fieldC.type, expectedType);
419 expect(getterC.returnType, expectedType);
420 }
421
422 void test_inferCompilationUnit_getter_single() {
423 InstanceMemberInferrer inferrer = createInferrer;
424 String getterName = 'g';
425 CompilationUnitElement unit = resolve('''
426 class A {
427 int get $getterName => 0;
428 }
429 class B extends A {
430 get $getterName => 0;
431 }
432 ''');
433 ClassElement classA = unit.getType('A');
434 FieldElement fieldA = classA.getField(getterName);
435 PropertyAccessorElement getterA = classA.getGetter(getterName);
436 ClassElement classB = unit.getType('B');
437 FieldElement fieldB = classB.getField(getterName);
438 PropertyAccessorElement getterB = classB.getGetter(getterName);
439 expect(fieldB.type.isDynamic, isTrue);
440 expect(getterB.returnType.isDynamic, isTrue);
441
442 inferrer.inferCompilationUnit(unit);
443
444 expect(fieldB.type, fieldA.type);
445 expect(getterB.returnType, getterA.returnType);
446 }
447
448 void test_inferCompilationUnit_getter_single_generic() {
449 InstanceMemberInferrer inferrer = createInferrer;
450 String getterName = 'g';
451 CompilationUnitElement unit = resolve('''
452 class A<E> {
453 E get $getterName => 0;
454 }
455 class B<E> extends A<E> {
456 get $getterName => 0;
457 }
458 ''');
459 ClassElement classB = unit.getType('B');
460 DartType typeBE = classB.typeParameters[0].type;
461 FieldElement fieldB = classB.getField(getterName);
462 PropertyAccessorElement getterB = classB.getGetter(getterName);
463 expect(fieldB.type.isDynamic, isTrue);
464 expect(getterB.returnType.isDynamic, isTrue);
465
466 inferrer.inferCompilationUnit(unit);
467
468 expect(fieldB.type, typeBE);
469 expect(getterB.returnType, typeBE);
470 }
471
472 void test_inferCompilationUnit_getter_single_inconsistentAccessors() {
473 InstanceMemberInferrer inferrer = createInferrer;
474 String getterName = 'g';
475 CompilationUnitElement unit = resolve('''
476 class A {
477 int get $getterName => 0;
478 set $getterName(String value) {}
479 }
480 class B extends A {
481 var get $getterName => 1;
482 }
483 ''');
484 ClassElement classA = unit.getType('A');
485 FieldElement fieldA = classA.getField(getterName);
486 PropertyAccessorElement getterA = classA.getGetter(getterName);
487 ClassElement classB = unit.getType('B');
488 FieldElement fieldB = classB.getField(getterName);
489 PropertyAccessorElement getterB = classB.getGetter(getterName);
490 expect(fieldB.type.isDynamic, isTrue);
491 expect(getterB.returnType.isDynamic, isTrue);
492
493 inferrer.inferCompilationUnit(unit);
494
495 // Expected behavior is that the getter is inferred: getters and setters
496 // are treated as independent methods.
497 expect(fieldB.type, fieldA.type);
498 expect(getterB.returnType, getterA.returnType);
499 }
500
501 void test_inferCompilationUnit_setter_single() {
502 InstanceMemberInferrer inferrer = createInferrer;
503 String setterName = 'g';
504 CompilationUnitElement unit = resolve('''
505 class A {
506 set $setterName(int x) {}
507 }
508 class B extends A {
509 set $setterName(x) {}
510 }
511 ''');
512 ClassElement classA = unit.getType('A');
513 FieldElement fieldA = classA.getField(setterName);
514 PropertyAccessorElement setterA = classA.getSetter(setterName);
515 ClassElement classB = unit.getType('B');
516 FieldElement fieldB = classB.getField(setterName);
517 PropertyAccessorElement setterB = classB.getSetter(setterName);
518 expect(fieldB.type.isDynamic, isTrue);
519 expect(setterB.parameters[0].type.isDynamic, isTrue);
520
521 inferrer.inferCompilationUnit(unit);
522
523 expect(fieldB.type, fieldA.type);
524 expect(setterB.parameters[0].type, setterA.parameters[0].type);
525 }
526
527 void test_inferCompilationUnit_setter_single_generic() {
528 InstanceMemberInferrer inferrer = createInferrer;
529 String setterName = 'g';
530 CompilationUnitElement unit = resolve('''
531 class A<E> {
532 set $setterName(E x) {}
533 }
534 class B<E> extends A<E> {
535 set $setterName(x) {}
536 }
537 ''');
538 ClassElement classB = unit.getType('B');
539 DartType typeBE = classB.typeParameters[0].type;
540 FieldElement fieldB = classB.getField(setterName);
541 PropertyAccessorElement setterB = classB.getSetter(setterName);
542 expect(fieldB.type.isDynamic, isTrue);
543 expect(setterB.parameters[0].type.isDynamic, isTrue);
544
545 inferrer.inferCompilationUnit(unit);
546
547 expect(fieldB.type, typeBE);
548 expect(setterB.parameters[0].type, typeBE);
549 }
550
551 void test_inferCompilationUnit_setter_single_inconsistentAccessors() {
552 InstanceMemberInferrer inferrer = createInferrer;
553 String getterName = 'g';
554 CompilationUnitElement unit = resolve('''
555 class A {
556 int get $getterName => 0;
557 set $getterName(String value) {}
558 }
559 class B extends A {
560 set $getterName(x) {}
561 }
562 ''');
563 ClassElement classA = unit.getType('A');
564 PropertyAccessorElement setterA = classA.getSetter(getterName);
565 ClassElement classB = unit.getType('B');
566 FieldElement fieldB = classB.getField(getterName);
567 PropertyAccessorElement setterB = classB.getSetter(getterName);
568 expect(fieldB.type.isDynamic, isTrue);
569 expect(setterB.parameters[0].type.isDynamic, isTrue);
570
571 inferrer.inferCompilationUnit(unit);
572
573 // Expected behavior is that the getter is inferred: getters and setters
574 // are treated as independent methods.
575 expect(setterB.parameters[0].type, setterA.parameters[0].type);
576
577 // Note that B's synthetic field type will be String. This matches what
578 // resolver would do if we explicitly typed the parameter as 'String'
579 expect(fieldB.type, setterB.parameters[0].type);
580 }
581
582 void test_inferCompilationUnit_invalid_inheritanceCycle() {
583 InstanceMemberInferrer inferrer = createInferrer;
584 CompilationUnitElement unit = resolve('''
585 class A extends C {}
586 class B extends A {}
587 class C extends B {}
588 ''');
589 inferrer.inferCompilationUnit(unit);
590 }
591
592 void test_inferCompilationUnit_method_parameter_multiple_different() {
593 InstanceMemberInferrer inferrer = createInferrer;
594 String methodName = 'm';
595 CompilationUnitElement unit = resolve('''
596 class A {
597 $methodName(int p) => 0;
598 }
599 class B {
600 $methodName(double p) => 0;
601 }
602 class C implements A, B {
603 $methodName(p) => 0;
604 }
605 ''');
606 ClassElement classC = unit.getType('C');
607 MethodElement methodC = classC.getMethod(methodName);
608 ParameterElement parameterC = methodC.parameters[0];
609 expect(parameterC.type.isDynamic, isTrue);
610
611 inferrer.inferCompilationUnit(unit);
612
613 expect(parameterC.type.isDynamic, isTrue);
614 }
615
616 void test_inferCompilationUnit_method_parameter_multiple_named_different() {
617 InstanceMemberInferrer inferrer = createInferrer;
618 String methodName = 'm';
619 CompilationUnitElement unit = resolve('''
620 class A {
621 $methodName({int p}) => 0;
622 }
623 class B {
624 $methodName({int q}) => 0;
625 }
626 class C implements A, B {
627 $methodName({p}) => 0;
628 }
629 ''');
630 ClassElement classC = unit.getType('C');
631 MethodElement methodC = classC.getMethod(methodName);
632 ParameterElement parameterC = methodC.parameters[0];
633 expect(parameterC.type.isDynamic, isTrue);
634
635 inferrer.inferCompilationUnit(unit);
636
637 expect(parameterC.type.isDynamic, isTrue);
638 }
639
640 void test_inferCompilationUnit_method_parameter_multiple_named_same() {
641 InstanceMemberInferrer inferrer = createInferrer;
642 String methodName = 'm';
643 CompilationUnitElement unit = resolve('''
644 class A {
645 $methodName({int p}) => 0;
646 }
647 class B {
648 $methodName({int p}) => 0;
649 }
650 class C implements A, B {
651 $methodName({p}) => 0;
652 }
653 ''');
654 ClassElement classA = unit.getType('A');
655 MethodElement methodA = classA.getMethod(methodName);
656 ParameterElement parameterA = methodA.parameters[0];
657 DartType expectedType = parameterA.type;
658 ClassElement classC = unit.getType('C');
659 MethodElement methodC = classC.getMethod(methodName);
660 ParameterElement parameterC = methodC.parameters[0];
661 expect(parameterC.type.isDynamic, isTrue);
662
663 inferrer.inferCompilationUnit(unit);
664
665 expect(parameterC.type, expectedType);
666 }
667
668 void test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() {
669 InstanceMemberInferrer inferrer = createInferrer;
670 String methodName = 'm';
671 CompilationUnitElement unit = resolve('''
672 class A {
673 $methodName({int p}) => 0;
674 }
675 class B {
676 $methodName(int p) => 0;
677 }
678 class C implements A, B {
679 $methodName(p) => 0;
680 }
681 ''');
682 ClassElement classC = unit.getType('C');
683 MethodElement methodC = classC.getMethod(methodName);
684 ParameterElement parameterC = methodC.parameters[0];
685 expect(parameterC.type.isDynamic, isTrue);
686
687 inferrer.inferCompilationUnit(unit);
688
689 expect(parameterC.type.isDynamic, isTrue);
690 }
691
692 void test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired() {
693 InstanceMemberInferrer inferrer = createInferrer;
694 String methodName = 'm';
695 CompilationUnitElement unit = resolve('''
696 class A {
697 $methodName(int p) => 0;
698 }
699 class B {
700 $methodName([int p]) => 0;
701 }
702 class C implements A, B {
703 $methodName(p) => 0;
704 }
705 ''');
706 ClassElement classA = unit.getType('A');
707 MethodElement methodA = classA.getMethod(methodName);
708 ParameterElement parameterA = methodA.parameters[0];
709 DartType expectedType = parameterA.type;
710 ClassElement classC = unit.getType('C');
711 MethodElement methodC = classC.getMethod(methodName);
712 ParameterElement parameterC = methodC.parameters[0];
713 expect(parameterC.type.isDynamic, isTrue);
714
715 inferrer.inferCompilationUnit(unit);
716
717 expect(parameterC.type, expectedType);
718 }
719
720 void test_inferCompilationUnit_method_parameter_single_generic() {
721 InstanceMemberInferrer inferrer = createInferrer;
722 String methodName = 'm';
723 CompilationUnitElement unit = resolve('''
724 class A<E> {
725 $methodName(E p) => 0;
726 }
727 class C<E> implements A<E> {
728 $methodName(p) => 0;
729 }
730 ''');
731 ClassElement classC = unit.getType('C');
732 DartType typeCE = classC.typeParameters[0].type;
733 MethodElement methodC = classC.getMethod(methodName);
734 ParameterElement parameterC = methodC.parameters[0];
735 expect(parameterC.type.isDynamic, isTrue);
736 expect(methodC.type.typeArguments, [typeCE]);
737
738 inferrer.inferCompilationUnit(unit);
739
740 expect(parameterC.type, classC.typeParameters[0].type);
741 expect(methodC.type.typeArguments, [typeCE],
742 reason: 'function type should still have type arguments');
743 }
744
745 void test_inferCompilationUnit_method_return_multiple_different() {
746 InstanceMemberInferrer inferrer = createInferrer;
747 String methodName = 'm';
748 CompilationUnitElement unit = resolve('''
749 class A {
750 int $methodName() => 0;
751 }
752 class B {
753 double $methodName() => 0.0;
754 }
755 class C implements A, B {
756 $methodName() => 0;
757 }
758 ''');
759 ClassElement classC = unit.getType('C');
760 MethodElement methodC = classC.getMethod(methodName);
761 expect(methodC.returnType.isDynamic, isTrue);
762
763 inferrer.inferCompilationUnit(unit);
764
765 expect(methodC.returnType.isDynamic, isTrue);
766 }
767
768 void test_inferCompilationUnit_method_return_multiple_different_generic() {
769 InstanceMemberInferrer inferrer = createInferrer;
770 String methodName = 'm';
771 CompilationUnitElement unit = resolve('''
772 class A<E> {
773 E $methodName() => null;
774 }
775 class B<E> {
776 E $methodName() => null;
777 }
778 class C implements A<int>, B<double> {
779 $methodName() => null;
780 }
781 ''');
782 ClassElement classC = unit.getType('C');
783 MethodElement methodC = classC.getMethod(methodName);
784 expect(methodC.returnType.isDynamic, isTrue);
785
786 inferrer.inferCompilationUnit(unit);
787
788 expect(methodC.returnType.isDynamic, isTrue);
789 }
790
791 void test_inferCompilationUnit_method_return_multiple_dynamic() {
792 InstanceMemberInferrer inferrer = createInferrer;
793 String methodName = 'm';
794 CompilationUnitElement unit = resolve('''
795 class A {
796 int $methodName() => 0;
797 }
798 class B {
799 $methodName() => 0;
800 }
801 class C implements A, B {
802 $methodName() => 0;
803 }
804 ''');
805 ClassElement classC = unit.getType('C');
806 MethodElement methodC = classC.getMethod(methodName);
807 expect(methodC.returnType.isDynamic, isTrue);
808
809 inferrer.inferCompilationUnit(unit);
810
811 expect(methodC.returnType.isDynamic, isTrue);
812 }
813
814 void test_inferCompilationUnit_method_return_multiple_same_generic() {
815 InstanceMemberInferrer inferrer = createInferrer;
816 String methodName = 'm';
817 CompilationUnitElement unit = resolve('''
818 class A<E> {
819 E $methodName() => 0;
820 }
821 class B<E> {
822 E $methodName() => 0;
823 }
824 class C<E> implements A<E>, B<E> {
825 $methodName() => 0;
826 }
827 ''');
828 ClassElement classC = unit.getType('C');
829 MethodElement methodC = classC.getMethod(methodName);
830 expect(methodC.returnType.isDynamic, isTrue);
831
832 inferrer.inferCompilationUnit(unit);
833
834 expect(methodC.returnType, classC.typeParameters[0].type);
835 }
836
837 void test_inferCompilationUnit_method_return_multiple_same_nonVoid() {
838 InstanceMemberInferrer inferrer = createInferrer;
839 String methodName = 'm';
840 CompilationUnitElement unit = resolve('''
841 class A {
842 int $methodName() => 0;
843 }
844 class B {
845 int $methodName() => 0;
846 }
847 class C implements A, B {
848 $methodName() => 0;
849 }
850 ''');
851 ClassElement classA = unit.getType('A');
852 MethodElement methodA = classA.getMethod(methodName);
853 DartType expectedType = methodA.returnType;
854 ClassElement classC = unit.getType('C');
855 MethodElement methodC = classC.getMethod(methodName);
856 expect(methodC.returnType.isDynamic, isTrue);
857
858 inferrer.inferCompilationUnit(unit);
859
860 expect(methodC.returnType, expectedType);
861 }
862
863 void test_inferCompilationUnit_method_return_multiple_same_void() {
864 InstanceMemberInferrer inferrer = createInferrer;
865 String methodName = 'm';
866 CompilationUnitElement unit = resolve('''
867 class A {
868 void $methodName() {};
869 }
870 class B {
871 void $methodName() {};
872 }
873 class C implements A, B {
874 $methodName() {};
875 }
876 ''');
877 ClassElement classA = unit.getType('A');
878 MethodElement methodA = classA.getMethod(methodName);
879 DartType expectedType = methodA.returnType;
880 ClassElement classC = unit.getType('C');
881 MethodElement methodC = classC.getMethod(methodName);
882 expect(methodC.returnType.isDynamic, isTrue);
883
884 inferrer.inferCompilationUnit(unit);
885
886 expect(methodC.returnType, expectedType);
887 }
888
889 void test_inferCompilationUnit_method_return_multiple_void() {
890 InstanceMemberInferrer inferrer = createInferrer;
891 String methodName = 'm';
892 CompilationUnitElement unit = resolve('''
893 class A {
894 int $methodName() => 0;
895 }
896 class B {
897 void $methodName() => 0;
898 }
899 class C implements A, B {
900 $methodName() => 0;
901 }
902 ''');
903 ClassElement classC = unit.getType('C');
904 MethodElement methodC = classC.getMethod(methodName);
905 expect(methodC.returnType.isDynamic, isTrue);
906
907 inferrer.inferCompilationUnit(unit);
908
909 expect(methodC.returnType.isDynamic, isTrue);
910 }
911
912 void test_inferCompilationUnit_method_return_single() {
913 InstanceMemberInferrer inferrer = createInferrer;
914 String methodName = 'm';
915 CompilationUnitElement unit = resolve('''
916 class A {
917 int $methodName() => 0;
918 }
919 class B extends A {
920 $methodName() => 0;
921 }
922 ''');
923 ClassElement classA = unit.getType('A');
924 MethodElement methodA = classA.getMethod(methodName);
925 ClassElement classB = unit.getType('B');
926 MethodElement methodB = classB.getMethod(methodName);
927 expect(methodB.returnType.isDynamic, isTrue);
928
929 inferrer.inferCompilationUnit(unit);
930
931 expect(methodB.returnType, methodA.returnType);
932 }
933
934 void test_inferCompilationUnit_method_return_single_generic() {
935 InstanceMemberInferrer inferrer = createInferrer;
936 String methodName = 'm';
937 CompilationUnitElement unit = resolve('''
938 class A<E> {
939 E $methodName() => 0;
940 }
941 class B<E> extends A<E> {
942 $methodName() => 0;
943 }
944 ''');
945 ClassElement classB = unit.getType('B');
946 DartType typeBE = classB.typeParameters[0].type;
947 MethodElement methodB = classB.getMethod(methodName);
948 expect(methodB.returnType.isDynamic, isTrue);
949 expect(methodB.type.typeArguments, [typeBE]);
950
951 inferrer.inferCompilationUnit(unit);
952
953 expect(methodB.returnType, classB.typeParameters[0].type);
954 expect(methodB.type.typeArguments, [typeBE],
955 reason: 'function type should still have type arguments');
956 }
957
958 void test_inferCompilationUnit_fieldFormal() {
959 InstanceMemberInferrer inferrer = createInferrer;
960 String fieldName = 'f';
961 CompilationUnitElement unit = resolve('''
962 class A {
963 final $fieldName = 0;
964 A([this.$fieldName = 'hello']);
965 }
966 ''');
967 ClassElement classA = unit.getType('A');
968 FieldElement fieldA = classA.getField(fieldName);
969 FieldFormalParameterElement paramA =
970 classA.unnamedConstructor.parameters[0];
971 expect(fieldA.type.isDynamic, isTrue);
972 expect(paramA.type.isDynamic, isTrue);
973
974 inferrer.inferCompilationUnit(unit);
975
976 DartType intType = inferrer.typeProvider.intType;
977 expect(fieldA.type, intType);
978 expect(paramA.type, intType);
979 }
980 }
981
982 @reflectiveTest
983 class VariableGathererTest extends AbstractContextTest {
984 void test_creation_withFilter() {
985 VariableFilter filter = (variable) => true;
986 VariableGatherer gatherer = new VariableGatherer(filter);
987 expect(gatherer, isNotNull);
988 expect(gatherer.filter, filter);
989 }
990
991 void test_creation_withoutFilter() {
992 VariableGatherer gatherer = new VariableGatherer();
993 expect(gatherer, isNotNull);
994 expect(gatherer.filter, isNull);
995 }
996
997 void test_visit_noReferences() {
998 Source source = addSource(
999 '/test.dart',
1000 '''
1001 library lib;
1002 import 'dart:math';
1003 int zero = 0;
1004 class C {
1005 void m() => null;
1006 }
1007 typedef void F();
1008 ''');
1009 CompilationUnit unit = context.resolveCompilationUnit2(source, source);
1010 VariableGatherer gatherer = new VariableGatherer();
1011 unit.accept(gatherer);
1012 expect(gatherer.results, hasLength(0));
1013 }
1014
1015 void test_visit_withFilter() {
1016 VariableFilter filter = (VariableElement variable) => variable.isStatic;
1017 expect(_gather(filter), hasLength(1));
1018 }
1019
1020 void test_visit_withoutFilter() {
1021 expect(_gather(), hasLength(4));
1022 }
1023
1024 Set<VariableElement> _gather([VariableFilter filter = null]) {
1025 Source source = addSource(
1026 '/test.dart',
1027 '''
1028 const int zero = 0;
1029 class Counter {
1030 int value = zero;
1031 void inc() {
1032 value++;
1033 }
1034 void dec() {
1035 value = value - 1;
1036 }
1037 void fromZero(f(int index)) {
1038 for (int i = zero; i < value; i++) {
1039 f(i);
1040 }
1041 }
1042 }
1043 ''');
1044 CompilationUnit unit = context.resolveCompilationUnit2(source, source);
1045 VariableGatherer gatherer = new VariableGatherer(filter);
1046 unit.accept(gatherer);
1047 return gatherer.results;
1048 }
1049 }
OLDNEW
« no previous file with comments | « packages/analyzer/test/src/task/model_test.dart ('k') | packages/analyzer/test/src/task/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698