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

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: Created 5 years, 4 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 (fieldC as FieldElementImpl).hasImplicitType = true;
103
104 inferrer.inferCompilationUnit(unit);
105
106 expect(fieldC.type.isDynamic, isTrue);
107 expect(getterC.returnType.isDynamic, isTrue);
108 }
109
110 void test_inferCompilationUnit_field_multiple_dynamic() {
111 InstanceMemberInferrer inferrer = createInferrer;
112 String fieldName = 'f';
113 CompilationUnitElement unit = resolve('''
114 class A {
115 int $fieldName;
116 }
117 class B {
118 var $fieldName;
119 }
120 class C implements A, B {
121 var $fieldName;
122 }
123 ''');
124 ClassElement classC = unit.getType('C');
125 FieldElement fieldC = classC.getField(fieldName);
126 PropertyAccessorElement getterC = classC.getGetter(fieldName);
127 expect(fieldC.type.isDynamic, isTrue);
128 expect(getterC.returnType.isDynamic, isTrue);
129 (fieldC as FieldElementImpl).hasImplicitType = true;
130
131 inferrer.inferCompilationUnit(unit);
132
133 expect(fieldC.type.isDynamic, isTrue);
134 expect(getterC.returnType.isDynamic, isTrue);
135 }
136
137 void test_inferCompilationUnit_field_multiple_same() {
138 InstanceMemberInferrer inferrer = createInferrer;
139 String fieldName = 'f';
140 CompilationUnitElement unit = resolve('''
141 class A {
142 int $fieldName;
143 }
144 class B {
145 int $fieldName;
146 }
147 class C implements A, B {
148 var $fieldName;
149 }
150 ''');
151 ClassElement classA = unit.getType('A');
152 FieldElement fieldA = classA.getField(fieldName);
153 DartType expectedType = fieldA.type;
154 ClassElement classC = unit.getType('C');
155 FieldElement fieldC = classC.getField(fieldName);
156 PropertyAccessorElement getterC = classC.getGetter(fieldName);
157 expect(fieldC.type.isDynamic, isTrue);
158 expect(getterC.returnType.isDynamic, isTrue);
159 (fieldC as FieldElementImpl).hasImplicitType = true;
Leaf 2015/08/22 00:06:55 Why does this need to be set manually?
Brian Wilkerson 2015/08/24 16:52:58 I don't remember why I originally needed to add th
160
161 inferrer.inferCompilationUnit(unit);
162
163 expect(fieldC.type, expectedType);
164 expect(getterC.returnType, expectedType);
165 }
166
167 void test_inferCompilationUnit_field_noOverride() {
168 InstanceMemberInferrer inferrer = createInferrer;
169 String fieldName = 'f';
170 CompilationUnitElement unit = resolve('''
171 class A {
172 final $fieldName = 0;
173 }
174 ''');
175 ClassElement classA = unit.getType('A');
176 FieldElement fieldA = classA.getField(fieldName);
177 PropertyAccessorElement getterA = classA.getGetter(fieldName);
178 expect(fieldA.type.isDynamic, isTrue);
179 expect(getterA.returnType.isDynamic, isTrue);
180 (fieldA as FieldElementImpl).hasImplicitType = true;
181
182 inferrer.inferCompilationUnit(unit);
183
184 DartType intType = inferrer.typeProvider.intType;
185 expect(fieldA.type, intType);
186 expect(getterA.returnType, intType);
187 }
188
189 void test_inferCompilationUnit_field_single_final() {
190 InstanceMemberInferrer inferrer = createInferrer;
191 String fieldName = 'f';
192 CompilationUnitElement unit = resolve('''
193 class A {
194 final int $fieldName;
195 }
196 class B extends A {
197 final $fieldName;
198 }
199 ''');
200 ClassElement classA = unit.getType('A');
201 FieldElement fieldA = classA.getField(fieldName);
202 PropertyAccessorElement getterA = classA.getGetter(fieldName);
203 ClassElement classB = unit.getType('B');
204 FieldElement fieldB = classB.getField(fieldName);
205 PropertyAccessorElement getterB = classB.getGetter(fieldName);
206 expect(fieldB.type.isDynamic, isTrue);
207 expect(getterB.returnType.isDynamic, isTrue);
208 (fieldB as FieldElementImpl).hasImplicitType = true;
209
210 inferrer.inferCompilationUnit(unit);
211
212 expect(fieldB.type, fieldA.type);
213 expect(getterB.returnType, getterA.returnType);
214 }
215
216 void test_inferCompilationUnit_field_single_noModifiers() {
217 InstanceMemberInferrer inferrer = createInferrer;
218 String fieldName = 'f';
219 CompilationUnitElement unit = resolve('''
220 class A {
221 int $fieldName;
222 }
223 class B extends A {
224 var $fieldName;
225 }
226 ''');
227 ClassElement classA = unit.getType('A');
228 FieldElement fieldA = classA.getField(fieldName);
229 PropertyAccessorElement getterA = classA.getGetter(fieldName);
230 ClassElement classB = unit.getType('B');
231 FieldElement fieldB = classB.getField(fieldName);
232 PropertyAccessorElement getterB = classB.getGetter(fieldName);
233 expect(fieldB.type.isDynamic, isTrue);
234 expect(getterB.returnType.isDynamic, isTrue);
235 (fieldB as FieldElementImpl).hasImplicitType = true;
236
237 inferrer.inferCompilationUnit(unit);
238
239 expect(fieldB.type, fieldA.type);
240 expect(getterB.returnType, getterA.returnType);
241 }
242
243 void test_inferCompilationUnit_getter_multiple_different() {
244 InstanceMemberInferrer inferrer = createInferrer;
245 String getterName = 'g';
246 CompilationUnitElement unit = resolve('''
247 class A {
248 int get $getterName => 0;
249 }
250 class B {
251 double get $getterName => 0.0;
252 }
253 class C implements A, B {
254 get $getterName => 0;
255 }
256 ''');
257 ClassElement classC = unit.getType('C');
258 FieldElement fieldC = classC.getField(getterName);
259 PropertyAccessorElement getterC = classC.getGetter(getterName);
260 expect(fieldC.type.isDynamic, isTrue);
261 expect(getterC.returnType.isDynamic, isTrue);
262 (fieldC as FieldElementImpl).hasImplicitType = true;
263
264 inferrer.inferCompilationUnit(unit);
265
266 expect(fieldC.type.isDynamic, isTrue);
267 expect(getterC.returnType.isDynamic, isTrue);
268 }
269
270 void test_inferCompilationUnit_getter_multiple_dynamic() {
271 InstanceMemberInferrer inferrer = createInferrer;
272 String getterName = 'g';
273 CompilationUnitElement unit = resolve('''
274 class A {
275 int get $getterName => 0;
276 }
277 class B {
278 get $getterName => 0;
279 }
280 class C implements A, B {
281 get $getterName => 0;
282 }
283 ''');
284 ClassElement classC = unit.getType('C');
285 FieldElement fieldC = classC.getField(getterName);
286 PropertyAccessorElement getterC = classC.getGetter(getterName);
287 expect(fieldC.type.isDynamic, isTrue);
288 expect(getterC.returnType.isDynamic, isTrue);
289 (fieldC as FieldElementImpl).hasImplicitType = true;
290
291 inferrer.inferCompilationUnit(unit);
292
293 expect(fieldC.type.isDynamic, isTrue);
294 expect(getterC.returnType.isDynamic, isTrue);
295 }
296
297 void test_inferCompilationUnit_getter_multiple_same() {
298 InstanceMemberInferrer inferrer = createInferrer;
299 String getterName = 'g';
300 CompilationUnitElement unit = resolve('''
301 class A {
302 String get $getterName => '';
303 }
304 class B {
305 String get $getterName => '';
306 }
307 class C implements A, B {
308 get $getterName => '';
309 }
310 ''');
311 ClassElement classA = unit.getType('A');
312 PropertyAccessorElement getterA = classA.getGetter(getterName);
313 DartType expectedType = getterA.returnType;
314 ClassElement classC = unit.getType('C');
315 FieldElement fieldC = classC.getField(getterName);
316 PropertyAccessorElement getterC = classC.getGetter(getterName);
317 expect(fieldC.type.isDynamic, isTrue);
318 expect(getterC.returnType.isDynamic, isTrue);
319 (fieldC as FieldElementImpl).hasImplicitType = true;
320
321 inferrer.inferCompilationUnit(unit);
322
323 expect(fieldC.type, expectedType);
324 expect(getterC.returnType, expectedType);
325 }
326
327 void test_inferCompilationUnit_getter_single() {
328 InstanceMemberInferrer inferrer = createInferrer;
329 String getterName = 'g';
330 CompilationUnitElement unit = resolve('''
331 class A {
332 int get $getterName => 0;
333 }
334 class B extends A {
335 get $getterName => 0;
336 }
337 ''');
338 ClassElement classA = unit.getType('A');
339 FieldElement fieldA = classA.getField(getterName);
340 PropertyAccessorElement getterA = classA.getGetter(getterName);
341 ClassElement classB = unit.getType('B');
342 FieldElement fieldB = classB.getField(getterName);
343 PropertyAccessorElement getterB = classB.getGetter(getterName);
344 expect(fieldB.type.isDynamic, isTrue);
345 expect(getterB.returnType.isDynamic, isTrue);
346 (fieldB as FieldElementImpl).hasImplicitType = true;
347
348 inferrer.inferCompilationUnit(unit);
349
350 expect(fieldB.type, fieldA.type);
351 expect(getterB.returnType, getterA.returnType);
352 }
353
354 void test_inferCompilationUnit_invalid_inheritanceCycle() {
355 InstanceMemberInferrer inferrer = createInferrer;
356 CompilationUnitElement unit = resolve('''
357 class A extends C {}
358 class B extends A {}
359 class C extends B {}
360 ''');
361 inferrer.inferCompilationUnit(unit);
362 }
363
364 void test_inferCompilationUnit_method_multiple_different() {
365 InstanceMemberInferrer inferrer = createInferrer;
366 String methodName = 'm';
367 CompilationUnitElement unit = resolve('''
368 class A {
369 int $methodName() => 0;
370 }
371 class B {
372 double $methodName() => 0.0;
373 }
374 class C implements A, B {
375 $methodName() => 0;
376 }
377 ''');
378 ClassElement classC = unit.getType('C');
379 MethodElement methodC = classC.getMethod(methodName);
380 expect(methodC.returnType.isDynamic, isTrue);
381 (methodC as MethodElementImpl).hasImplicitReturnType = true;
382
383 inferrer.inferCompilationUnit(unit);
384
385 expect(methodC.returnType.isDynamic, isTrue);
386 }
387
388 void test_inferCompilationUnit_method_multiple_dynamic() {
389 InstanceMemberInferrer inferrer = createInferrer;
390 String methodName = 'm';
391 CompilationUnitElement unit = resolve('''
392 class A {
393 int $methodName() => 0;
394 }
395 class B {
396 $methodName() => 0;
397 }
398 class C implements A, B {
399 $methodName() => 0;
400 }
401 ''');
402 ClassElement classC = unit.getType('C');
403 MethodElement methodC = classC.getMethod(methodName);
404 expect(methodC.returnType.isDynamic, isTrue);
405 (methodC as MethodElementImpl).hasImplicitReturnType = true;
406
407 inferrer.inferCompilationUnit(unit);
408
409 expect(methodC.returnType.isDynamic, isTrue);
410 }
411
412 void test_inferCompilationUnit_method_multiple_same_nonVoid() {
413 InstanceMemberInferrer inferrer = createInferrer;
414 String methodName = 'm';
415 CompilationUnitElement unit = resolve('''
416 class A {
417 int $methodName() => 0;
418 }
419 class B {
420 int $methodName() => 0.0;
421 }
422 class C implements A, B {
423 $methodName() => 0;
424 }
425 ''');
Leaf 2015/08/22 00:06:55 Might be worth having a test or two that validates
Brian Wilkerson 2015/08/24 16:52:58 That would be good, but these tests are only testi
426 ClassElement classA = unit.getType('A');
427 MethodElement methodA = classA.getMethod(methodName);
428 DartType expectedType = methodA.returnType;
429 ClassElement classC = unit.getType('C');
430 MethodElement methodC = classC.getMethod(methodName);
431 expect(methodC.returnType.isDynamic, isTrue);
432 (methodC as MethodElementImpl).hasImplicitReturnType = true;
433
434 inferrer.inferCompilationUnit(unit);
435
436 expect(methodC.returnType, expectedType);
437 }
438
439 void test_inferCompilationUnit_method_multiple_same_void() {
440 InstanceMemberInferrer inferrer = createInferrer;
441 String methodName = 'm';
442 CompilationUnitElement unit = resolve('''
443 class A {
444 void $methodName() {};
445 }
446 class B {
447 void $methodName() {};
448 }
449 class C implements A, B {
450 $methodName() {};
451 }
452 ''');
453 ClassElement classA = unit.getType('A');
454 MethodElement methodA = classA.getMethod(methodName);
455 DartType expectedType = methodA.returnType;
456 ClassElement classC = unit.getType('C');
457 MethodElement methodC = classC.getMethod(methodName);
458 expect(methodC.returnType.isDynamic, isTrue);
459 (methodC as MethodElementImpl).hasImplicitReturnType = true;
460
461 inferrer.inferCompilationUnit(unit);
462
463 expect(methodC.returnType, expectedType);
464 }
465
466 void test_inferCompilationUnit_method_multiple_void() {
467 InstanceMemberInferrer inferrer = createInferrer;
468 String methodName = 'm';
469 CompilationUnitElement unit = resolve('''
470 class A {
471 int $methodName() => 0;
472 }
473 class B {
474 void $methodName() => 0;
475 }
476 class C implements A, B {
477 $methodName() => 0;
478 }
479 ''');
480 ClassElement classC = unit.getType('C');
481 MethodElement methodC = classC.getMethod(methodName);
482 expect(methodC.returnType.isDynamic, isTrue);
483 (methodC as MethodElementImpl).hasImplicitReturnType = true;
484
485 inferrer.inferCompilationUnit(unit);
486
487 expect(methodC.returnType.isDynamic, isTrue);
488 }
489
490 void test_inferCompilationUnit_method_single() {
491 InstanceMemberInferrer inferrer = createInferrer;
492 String methodName = 'm';
493 CompilationUnitElement unit = resolve('''
494 class A {
495 int $methodName() => 0;
496 }
497 class B extends A {
498 $methodName() => 0;
499 }
500 ''');
501 ClassElement classA = unit.getType('A');
502 MethodElement methodA = classA.getMethod(methodName);
503 ClassElement classB = unit.getType('B');
504 MethodElement methodB = classB.getMethod(methodName);
505 expect(methodB.returnType.isDynamic, isTrue);
506 (methodB as MethodElementImpl).hasImplicitReturnType = true;
507
508 inferrer.inferCompilationUnit(unit);
509
510 expect(methodB.returnType, methodA.returnType);
511 }
512 }
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