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

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

Issue 1306313002: Implement instance member inference (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address comments Created 5 years, 3 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
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 test.src.task.strong_mode_test; 5 library test.src.task.strong_mode_test;
6 6
7 import 'package:analyzer/src/generated/ast.dart'; 7 import 'package:analyzer/src/generated/ast.dart';
8 import 'package:analyzer/src/generated/element.dart';
8 import 'package:analyzer/src/generated/source.dart'; 9 import 'package:analyzer/src/generated/source.dart';
9 import 'package:analyzer/src/task/strong_mode.dart'; 10 import 'package:analyzer/src/task/strong_mode.dart';
10 import 'package:analyzer/task/dart.dart'; 11 import 'package:analyzer/task/dart.dart';
11 import 'package:unittest/unittest.dart'; 12 import 'package:unittest/unittest.dart';
12 13
13 import '../../reflective_tests.dart'; 14 import '../../reflective_tests.dart';
14 import '../../utils.dart'; 15 import '../../utils.dart';
15 import '../context/abstract_context.dart'; 16 import '../context/abstract_context.dart';
16 17
17 main() { 18 main() {
18 initializeTestEnvironment(); 19 initializeTestEnvironment();
19 runReflectiveTests(InferrenceFinderTest); 20 runReflectiveTests(InferrenceFinderTest);
21 runReflectiveTests(InstanceMemberInferrerTest);
20 } 22 }
21 23
22 @reflectiveTest 24 @reflectiveTest
23 class InferrenceFinderTest extends AbstractContextTest { 25 class InferrenceFinderTest extends AbstractContextTest {
24 void test_creation() { 26 void test_creation() {
25 InferrenceFinder finder = new InferrenceFinder(); 27 InferrenceFinder finder = new InferrenceFinder();
26 expect(finder, isNotNull); 28 expect(finder, isNotNull);
27 expect(finder.classes, isEmpty); 29 expect(finder.classes, isEmpty);
28 expect(finder.staticVariables, isEmpty); 30 expect(finder.staticVariables, isEmpty);
29 } 31 }
(...skipping 20 matching lines...) Expand all
50 typedef int F(int x); 52 typedef int F(int x);
51 '''); 53 ''');
52 computeResult(source, PARSED_UNIT); 54 computeResult(source, PARSED_UNIT);
53 CompilationUnit unit = outputs[PARSED_UNIT]; 55 CompilationUnit unit = outputs[PARSED_UNIT];
54 InferrenceFinder finder = new InferrenceFinder(); 56 InferrenceFinder finder = new InferrenceFinder();
55 unit.accept(finder); 57 unit.accept(finder);
56 expect(finder.classes, hasLength(3)); 58 expect(finder.classes, hasLength(3));
57 expect(finder.staticVariables, hasLength(6)); 59 expect(finder.staticVariables, hasLength(6));
58 } 60 }
59 } 61 }
62
63 @reflectiveTest
64 class InstanceMemberInferrerTest extends AbstractContextTest {
65 InstanceMemberInferrer get createInferrer =>
66 new InstanceMemberInferrer(context.typeProvider);
67
68 /**
69 * Add a source with the given [content] and return the result of resolving
70 * the source.
71 */
72 CompilationUnitElement resolve(String content) {
73 Source source = addSource('/test.dart', content);
74 return context.resolveCompilationUnit2(source, source).element;
75 }
76
77 void test_creation() {
78 InstanceMemberInferrer inferrer = createInferrer;
79 expect(inferrer, isNotNull);
80 expect(inferrer.typeSystem, isNotNull);
81 }
82
83 void test_inferCompilationUnit_field_multiple_different() {
84 InstanceMemberInferrer inferrer = createInferrer;
85 String fieldName = 'f';
86 CompilationUnitElement unit = resolve('''
87 class A {
88 int $fieldName;
89 }
90 class B {
91 double $fieldName;
92 }
93 class C implements A, B {
94 var $fieldName;
95 }
96 ''');
97 ClassElement classC = unit.getType('C');
98 FieldElement fieldC = classC.getField(fieldName);
99 PropertyAccessorElement getterC = classC.getGetter(fieldName);
100 expect(fieldC.type.isDynamic, isTrue);
101 expect(getterC.returnType.isDynamic, isTrue);
102
103 inferrer.inferCompilationUnit(unit);
104
105 expect(fieldC.type.isDynamic, isTrue);
106 expect(getterC.returnType.isDynamic, isTrue);
107 }
108
109 void test_inferCompilationUnit_field_multiple_dynamic() {
110 InstanceMemberInferrer inferrer = createInferrer;
111 String fieldName = 'f';
112 CompilationUnitElement unit = resolve('''
113 class A {
114 int $fieldName;
115 }
116 class B {
117 var $fieldName;
118 }
119 class C implements A, B {
120 var $fieldName;
121 }
122 ''');
123 ClassElement classC = unit.getType('C');
124 FieldElement fieldC = classC.getField(fieldName);
125 PropertyAccessorElement getterC = classC.getGetter(fieldName);
126 expect(fieldC.type.isDynamic, isTrue);
127 expect(getterC.returnType.isDynamic, isTrue);
128
129 inferrer.inferCompilationUnit(unit);
130
131 expect(fieldC.type.isDynamic, isTrue);
132 expect(getterC.returnType.isDynamic, isTrue);
133 }
134
135 void test_inferCompilationUnit_field_multiple_same() {
136 InstanceMemberInferrer inferrer = createInferrer;
137 String fieldName = 'f';
138 CompilationUnitElement unit = resolve('''
139 class A {
140 int $fieldName;
141 }
142 class B {
143 int $fieldName;
144 }
145 class C implements A, B {
146 var $fieldName;
147 }
148 ''');
149 ClassElement classA = unit.getType('A');
150 FieldElement fieldA = classA.getField(fieldName);
151 DartType expectedType = fieldA.type;
152 ClassElement classC = unit.getType('C');
153 FieldElement fieldC = classC.getField(fieldName);
154 PropertyAccessorElement getterC = classC.getGetter(fieldName);
155 expect(fieldC.type.isDynamic, isTrue);
156 expect(getterC.returnType.isDynamic, isTrue);
157
158 inferrer.inferCompilationUnit(unit);
159
160 expect(fieldC.type, expectedType);
161 expect(getterC.returnType, expectedType);
162 }
163
164 void test_inferCompilationUnit_field_noOverride() {
165 InstanceMemberInferrer inferrer = createInferrer;
166 String fieldName = 'f';
167 CompilationUnitElement unit = resolve('''
168 class A {
169 final $fieldName = 0;
170 }
171 ''');
172 ClassElement classA = unit.getType('A');
173 FieldElement fieldA = classA.getField(fieldName);
174 PropertyAccessorElement getterA = classA.getGetter(fieldName);
175 expect(fieldA.type.isDynamic, isTrue);
176 expect(getterA.returnType.isDynamic, isTrue);
177
178 inferrer.inferCompilationUnit(unit);
179
180 DartType intType = inferrer.typeProvider.intType;
181 expect(fieldA.type, intType);
182 expect(getterA.returnType, intType);
183 }
184
185 void test_inferCompilationUnit_field_noOverride_bottom() {
186 InstanceMemberInferrer inferrer = createInferrer;
187 String fieldName = 'f';
188 CompilationUnitElement unit = resolve('''
189 class A {
190 var $fieldName = null;
191 }
192 ''');
193 ClassElement classA = unit.getType('A');
194 FieldElement fieldA = classA.getField(fieldName);
195 PropertyAccessorElement getterA = classA.getGetter(fieldName);
196 expect(fieldA.type.isDynamic, isTrue);
197 expect(getterA.returnType.isDynamic, isTrue);
198
199 inferrer.inferCompilationUnit(unit);
200
201 expect(fieldA.type.isDynamic, isTrue);
202 expect(getterA.returnType.isDynamic, isTrue);
203 }
204
205 void test_inferCompilationUnit_field_single_explicitlyDynamic() {
206 InstanceMemberInferrer inferrer = createInferrer;
207 String fieldName = 'f';
208 CompilationUnitElement unit = resolve('''
209 class A {
210 dynamic $fieldName;
211 }
212 class B extends A {
213 var $fieldName = 0;
214 }
215 ''');
216 ClassElement classA = unit.getType('A');
217 FieldElement fieldA = classA.getField(fieldName);
218 PropertyAccessorElement getterA = classA.getGetter(fieldName);
219 ClassElement classB = unit.getType('B');
220 FieldElement fieldB = classB.getField(fieldName);
221 PropertyAccessorElement getterB = classB.getGetter(fieldName);
222 expect(fieldB.type.isDynamic, isTrue);
223 expect(getterB.returnType.isDynamic, isTrue);
224
225 inferrer.inferCompilationUnit(unit);
226
227 expect(fieldB.type, fieldA.type);
228 expect(getterB.returnType, getterA.returnType);
229 }
230
231 void test_inferCompilationUnit_field_single_final() {
232 InstanceMemberInferrer inferrer = createInferrer;
233 String fieldName = 'f';
234 CompilationUnitElement unit = resolve('''
235 class A {
236 final int $fieldName;
237 }
238 class B extends A {
239 final $fieldName;
240 }
241 ''');
242 ClassElement classA = unit.getType('A');
243 FieldElement fieldA = classA.getField(fieldName);
244 PropertyAccessorElement getterA = classA.getGetter(fieldName);
245 ClassElement classB = unit.getType('B');
246 FieldElement fieldB = classB.getField(fieldName);
247 PropertyAccessorElement getterB = classB.getGetter(fieldName);
248 expect(fieldB.type.isDynamic, isTrue);
249 expect(getterB.returnType.isDynamic, isTrue);
250
251 inferrer.inferCompilationUnit(unit);
252
253 expect(fieldB.type, fieldA.type);
254 expect(getterB.returnType, getterA.returnType);
255 }
256
257 void test_inferCompilationUnit_field_single_noModifiers() {
258 InstanceMemberInferrer inferrer = createInferrer;
259 String fieldName = 'f';
260 CompilationUnitElement unit = resolve('''
261 class A {
262 int $fieldName;
263 }
264 class B extends A {
265 var $fieldName;
266 }
267 ''');
268 ClassElement classA = unit.getType('A');
269 FieldElement fieldA = classA.getField(fieldName);
270 PropertyAccessorElement getterA = classA.getGetter(fieldName);
271 ClassElement classB = unit.getType('B');
272 FieldElement fieldB = classB.getField(fieldName);
273 PropertyAccessorElement getterB = classB.getGetter(fieldName);
274 expect(fieldB.type.isDynamic, isTrue);
275 expect(getterB.returnType.isDynamic, isTrue);
276
277 inferrer.inferCompilationUnit(unit);
278
279 expect(fieldB.type, fieldA.type);
280 expect(getterB.returnType, getterA.returnType);
281 }
282
283 void test_inferCompilationUnit_getter_multiple_different() {
284 InstanceMemberInferrer inferrer = createInferrer;
285 String getterName = 'g';
286 CompilationUnitElement unit = resolve('''
287 class A {
288 int get $getterName => 0;
289 }
290 class B {
291 double get $getterName => 0.0;
292 }
293 class C implements A, B {
294 get $getterName => 0;
295 }
296 ''');
297 ClassElement classC = unit.getType('C');
298 FieldElement fieldC = classC.getField(getterName);
299 PropertyAccessorElement getterC = classC.getGetter(getterName);
300 expect(fieldC.type.isDynamic, isTrue);
301 expect(getterC.returnType.isDynamic, isTrue);
302
303 inferrer.inferCompilationUnit(unit);
304
305 expect(fieldC.type.isDynamic, isTrue);
306 expect(getterC.returnType.isDynamic, isTrue);
307 }
308
309 void test_inferCompilationUnit_getter_multiple_dynamic() {
310 InstanceMemberInferrer inferrer = createInferrer;
311 String getterName = 'g';
312 CompilationUnitElement unit = resolve('''
313 class A {
314 int get $getterName => 0;
315 }
316 class B {
317 get $getterName => 0;
318 }
319 class C implements A, B {
320 get $getterName => 0;
321 }
322 ''');
323 ClassElement classC = unit.getType('C');
324 FieldElement fieldC = classC.getField(getterName);
325 PropertyAccessorElement getterC = classC.getGetter(getterName);
326 expect(fieldC.type.isDynamic, isTrue);
327 expect(getterC.returnType.isDynamic, isTrue);
328
329 inferrer.inferCompilationUnit(unit);
330
331 expect(fieldC.type.isDynamic, isTrue);
332 expect(getterC.returnType.isDynamic, isTrue);
333 }
334
335 void test_inferCompilationUnit_getter_multiple_same() {
336 InstanceMemberInferrer inferrer = createInferrer;
337 String getterName = 'g';
338 CompilationUnitElement unit = resolve('''
339 class A {
340 String get $getterName => '';
341 }
342 class B {
343 String get $getterName => '';
344 }
345 class C implements A, B {
346 get $getterName => '';
347 }
348 ''');
349 ClassElement classA = unit.getType('A');
350 PropertyAccessorElement getterA = classA.getGetter(getterName);
351 DartType expectedType = getterA.returnType;
352 ClassElement classC = unit.getType('C');
353 FieldElement fieldC = classC.getField(getterName);
354 PropertyAccessorElement getterC = classC.getGetter(getterName);
355 expect(fieldC.type.isDynamic, isTrue);
356 expect(getterC.returnType.isDynamic, isTrue);
357
358 inferrer.inferCompilationUnit(unit);
359
360 expect(fieldC.type, expectedType);
361 expect(getterC.returnType, expectedType);
362 }
363
364 void test_inferCompilationUnit_getter_single() {
365 InstanceMemberInferrer inferrer = createInferrer;
366 String getterName = 'g';
367 CompilationUnitElement unit = resolve('''
368 class A {
369 int get $getterName => 0;
370 }
371 class B extends A {
372 get $getterName => 0;
373 }
374 ''');
375 ClassElement classA = unit.getType('A');
376 FieldElement fieldA = classA.getField(getterName);
377 PropertyAccessorElement getterA = classA.getGetter(getterName);
378 ClassElement classB = unit.getType('B');
379 FieldElement fieldB = classB.getField(getterName);
380 PropertyAccessorElement getterB = classB.getGetter(getterName);
381 expect(fieldB.type.isDynamic, isTrue);
382 expect(getterB.returnType.isDynamic, isTrue);
383
384 inferrer.inferCompilationUnit(unit);
385
386 expect(fieldB.type, fieldA.type);
387 expect(getterB.returnType, getterA.returnType);
388 }
389
390 void test_inferCompilationUnit_invalid_inheritanceCycle() {
391 InstanceMemberInferrer inferrer = createInferrer;
392 CompilationUnitElement unit = resolve('''
393 class A extends C {}
394 class B extends A {}
395 class C extends B {}
396 ''');
397 inferrer.inferCompilationUnit(unit);
398 }
399
400 void test_inferCompilationUnit_method_multiple_different() {
401 InstanceMemberInferrer inferrer = createInferrer;
402 String methodName = 'm';
403 CompilationUnitElement unit = resolve('''
404 class A {
405 int $methodName() => 0;
406 }
407 class B {
408 double $methodName() => 0.0;
409 }
410 class C implements A, B {
411 $methodName() => 0;
412 }
413 ''');
414 ClassElement classC = unit.getType('C');
415 MethodElement methodC = classC.getMethod(methodName);
416 expect(methodC.returnType.isDynamic, isTrue);
417
418 inferrer.inferCompilationUnit(unit);
419
420 expect(methodC.returnType.isDynamic, isTrue);
421 }
422
423 void test_inferCompilationUnit_method_multiple_dynamic() {
424 InstanceMemberInferrer inferrer = createInferrer;
425 String methodName = 'm';
426 CompilationUnitElement unit = resolve('''
427 class A {
428 int $methodName() => 0;
429 }
430 class B {
431 $methodName() => 0;
432 }
433 class C implements A, B {
434 $methodName() => 0;
435 }
436 ''');
437 ClassElement classC = unit.getType('C');
438 MethodElement methodC = classC.getMethod(methodName);
439 expect(methodC.returnType.isDynamic, isTrue);
440
441 inferrer.inferCompilationUnit(unit);
442
443 expect(methodC.returnType.isDynamic, isTrue);
444 }
445
446 void test_inferCompilationUnit_method_multiple_same_nonVoid() {
447 InstanceMemberInferrer inferrer = createInferrer;
448 String methodName = 'm';
449 CompilationUnitElement unit = resolve('''
450 class A {
451 int $methodName() => 0;
452 }
453 class B {
454 int $methodName() => 0.0;
455 }
456 class C implements A, B {
457 $methodName() => 0;
458 }
459 ''');
460 ClassElement classA = unit.getType('A');
461 MethodElement methodA = classA.getMethod(methodName);
462 DartType expectedType = methodA.returnType;
463 ClassElement classC = unit.getType('C');
464 MethodElement methodC = classC.getMethod(methodName);
465 expect(methodC.returnType.isDynamic, isTrue);
466
467 inferrer.inferCompilationUnit(unit);
468
469 expect(methodC.returnType, expectedType);
470 }
471
472 void test_inferCompilationUnit_method_multiple_same_void() {
473 InstanceMemberInferrer inferrer = createInferrer;
474 String methodName = 'm';
475 CompilationUnitElement unit = resolve('''
476 class A {
477 void $methodName() {};
478 }
479 class B {
480 void $methodName() {};
481 }
482 class C implements A, B {
483 $methodName() {};
484 }
485 ''');
486 ClassElement classA = unit.getType('A');
487 MethodElement methodA = classA.getMethod(methodName);
488 DartType expectedType = methodA.returnType;
489 ClassElement classC = unit.getType('C');
490 MethodElement methodC = classC.getMethod(methodName);
491 expect(methodC.returnType.isDynamic, isTrue);
492
493 inferrer.inferCompilationUnit(unit);
494
495 expect(methodC.returnType, expectedType);
496 }
497
498 void test_inferCompilationUnit_method_multiple_void() {
499 InstanceMemberInferrer inferrer = createInferrer;
500 String methodName = 'm';
501 CompilationUnitElement unit = resolve('''
502 class A {
503 int $methodName() => 0;
504 }
505 class B {
506 void $methodName() => 0;
507 }
508 class C implements A, B {
509 $methodName() => 0;
510 }
511 ''');
512 ClassElement classC = unit.getType('C');
513 MethodElement methodC = classC.getMethod(methodName);
514 expect(methodC.returnType.isDynamic, isTrue);
515
516 inferrer.inferCompilationUnit(unit);
517
518 expect(methodC.returnType.isDynamic, isTrue);
519 }
520
521 void test_inferCompilationUnit_method_single() {
522 InstanceMemberInferrer inferrer = createInferrer;
523 String methodName = 'm';
524 CompilationUnitElement unit = resolve('''
525 class A {
526 int $methodName() => 0;
527 }
528 class B extends A {
529 $methodName() => 0;
530 }
531 ''');
532 ClassElement classA = unit.getType('A');
533 MethodElement methodA = classA.getMethod(methodName);
534 ClassElement classB = unit.getType('B');
535 MethodElement methodB = classB.getMethod(methodName);
536 expect(methodB.returnType.isDynamic, isTrue);
537
538 inferrer.inferCompilationUnit(unit);
539
540 expect(methodB.returnType, methodA.returnType);
541 }
542 }
OLDNEW
« pkg/analyzer/lib/src/task/strong_mode.dart ('K') | « pkg/analyzer/lib/src/task/strong_mode.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698