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

Side by Side Diff: pkg/analyzer/test/src/summary/top_level_inference_test.dart

Issue 2754423002: Fail inference when an instance field is referenced. (Closed)
Patch Set: Clean up and move tests. Created 3 years, 9 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) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:analyzer/dart/element/element.dart'; 7 import 'package:analyzer/dart/element/element.dart';
8 import 'package:analyzer/src/dart/analysis/driver.dart'; 8 import 'package:analyzer/src/dart/analysis/driver.dart';
9 import 'package:test_reflective_loader/test_reflective_loader.dart'; 9 import 'package:test_reflective_loader/test_reflective_loader.dart';
10 10
11 import '../dart/analysis/base.dart'; 11 import '../dart/analysis/base.dart';
12 import 'element_text.dart'; 12 import 'element_text.dart';
13 13
14 main() { 14 main() {
15 defineReflectiveSuite(() { 15 defineReflectiveSuite(() {
16 defineReflectiveTests(TopLevelInferenceTest); 16 defineReflectiveTests(TopLevelInferenceTest);
17 // defineReflectiveTests(ApplyCheckElementTextReplacements); 17 // defineReflectiveTests(ApplyCheckElementTextReplacements);
18 }); 18 });
19 } 19 }
20 20
21 @reflectiveTest 21 @reflectiveTest
22 class ApplyCheckElementTextReplacements { 22 class ApplyCheckElementTextReplacements {
23 test_applyReplacements() { 23 test_applyReplacements() {
24 applyCheckElementTextReplacements(); 24 applyCheckElementTextReplacements();
25 } 25 }
26 } 26 }
27 27
28 @reflectiveTest 28 @reflectiveTest
29 class TopLevelInferenceTest extends BaseAnalysisDriverTest { 29 class TopLevelInferenceTest extends BaseAnalysisDriverTest {
30 void addFile(String path, String code) {
31 provider.newFile(_p(path), code);
32 }
33
30 test_initializer_as() async { 34 test_initializer_as() async {
31 var library = await _encodeDecodeLibrary(r''' 35 var library = await _encodeDecodeLibrary(r'''
32 var V = 1 as num; 36 var V = 1 as num;
33 '''); 37 ''');
34 checkElementText( 38 checkElementText(
35 library, 39 library,
36 r''' 40 r'''
37 num V; 41 num V;
38 '''); 42 ''');
39 } 43 }
40 44
41 @failingTest
42 test_initializer_assignment() async {
43 var library = await _encodeDecodeLibrary(r'''
44 var a = 1;
45 var b = a = 2;
46 var c = a += 2;
47 ''');
48 // TODO(scheglov) test for inference failure error
49 checkElementText(
50 library,
51 r'''
52 int a;
53 dynamic b;
54 dynamic c;
55 ''');
56 }
57
58 test_initializer_await() async { 45 test_initializer_await() async {
59 var library = await _encodeDecodeLibrary(r''' 46 var library = await _encodeDecodeLibrary(r'''
60 import 'dart:async'; 47 import 'dart:async';
61 int fValue() => 42; 48 int fValue() => 42;
62 Future<int> fFuture() async => 42; 49 Future<int> fFuture() async => 42;
63 var uValue = () async => await fValue(); 50 var uValue = () async => await fValue();
64 var uFuture = () async => await fFuture(); 51 var uFuture = () async => await fFuture();
65 '''); 52 ''');
66 checkElementText( 53 checkElementText(
67 library, 54 library,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 var library = await _encodeDecodeLibrary(r''' 107 var library = await _encodeDecodeLibrary(r'''
121 var V = true ? 1 : 2.3; 108 var V = true ? 1 : 2.3;
122 '''); 109 ''');
123 checkElementText( 110 checkElementText(
124 library, 111 library,
125 r''' 112 r'''
126 num V; 113 num V;
127 '''); 114 ''');
128 } 115 }
129 116
117 test_initializer_error_assign() async {
118 var library = await _encodeDecodeLibrary(r'''
119 var a = 1;
120 var t1 = (a = 2);
121 var t2 = (a += 2);
122 ''');
123 // TODO(scheglov) test for inference failure error
124 checkElementText(
125 library,
126 r'''
127 int a;
128 dynamic t1;
129 dynamic t2;
130 ''');
131 }
132
133 test_initializer_error_assign_prefixed() async {
134 var library = await _encodeDecodeLibrary(r'''
135 class A {
136 int f;
137 }
138 var a = new A();
139 var t1 = (a.f = 1);
140 var t2 = (a.f += 2);
141 ''');
142 // TODO(scheglov) test for inference failure error
143 checkElementText(
144 library,
145 r'''
146 class A {
147 int f;
148 }
149 A a;
150 dynamic t1;
151 dynamic t2;
152 ''');
153 }
154
155 test_initializer_error_assign_prefixed_viaInterface() async {
156 var library = await _encodeDecodeLibrary(r'''
157 class I {
158 int f;
159 }
160 abstract class C implements I {}
161 C c;
162 var t1 = (c.f = 1);
163 var t2 = (c.f += 2);
164 ''');
165 // TODO(scheglov) test for inference failure error
166 checkElementText(
167 library,
168 r'''
169 class I {
170 int f;
171 }
172 abstract class C implements I {
173 }
174 C c;
175 dynamic t1;
176 dynamic t2;
177 ''');
178 }
179
180 test_initializer_error_assign_viaInterface() async {
181 var library = await _encodeDecodeLibrary(r'''
182 class I {
183 int f;
184 }
185 abstract class C implements I {}
186 C getC() => null;
187 var t1 = (getC().f = 1);
188 var t2 = (getC().f += 2);
189 ''');
190 // TODO(scheglov) test for inference failure error
191 checkElementText(
192 library,
193 r'''
194 class I {
195 int f;
196 }
197 abstract class C implements I {
198 }
199 dynamic t1;
200 dynamic t2;
201 C getC() {}
202 ''');
203 }
204
205 /**
206 * A simple or qualified identifier referring to a top level function, static
207 * variable, field, getter; or a static class variable, static getter or
208 * method; or an instance method; has the inferred type of the identifier.
209 *
210 * Note: specifically, references to instance fields and instance getters are
211 * disallowed here.
212 */
213 test_initializer_error_classField_useInstanceGetter() async {
214 var library = await _encodeDecodeLibrary(r'''
215 class A {
216 int f = 1;
217 }
218 class B {
219 A a;
220 }
221 class C {
222 B b;
223 }
224 class X {
225 A a = new A();
226 B b = new B();
227 C c = new C();
228 var t01 = a.f;
229 var t02 = b.a.f;
230 var t03 = c.b.a.f;
231 var t11 = new A().f;
232 var t12 = new B().a.f;
233 var t13 = new C().b.a.f;
234 var t21 = newA().f;
235 var t22 = newB().a.f;
236 var t23 = newC().b.a.f;
237 }
238 A newA() => new A();
239 B newB() => new B();
240 C newC() => new C();
241 ''');
242 // TODO(scheglov) test for inference failure error
243 checkElementText(
244 library,
245 r'''
246 class A {
247 int f;
248 }
249 class B {
250 A a;
251 }
252 class C {
253 B b;
254 }
255 class X {
256 A a;
257 B b;
258 C c;
259 dynamic t01;
260 dynamic t02;
261 dynamic t03;
262 dynamic t11;
263 dynamic t12;
264 dynamic t13;
265 dynamic t21;
266 dynamic t22;
267 dynamic t23;
268 }
269 A newA() {}
270 B newB() {}
271 C newC() {}
272 ''');
273 }
274
275 test_initializer_error_extractProperty() async {
276 var library = await _encodeDecodeLibrary(r'''
277 class C {
278 bool b;
279 }
280 C f() => null;
281 var x = f().b;
282 ''');
283 // TODO(scheglov) test for inference failure error
284 checkElementText(
285 library,
286 r'''
287 class C {
288 bool b;
289 }
290 dynamic x;
291 C f() {}
292 ''');
293 }
294
295 test_initializer_error_extractProperty_inOtherLibraryCycle() async {
296 addFile(
297 '/a.dart',
298 r'''
299 import 'b.dart';
300 var x = new C().f;
301 ''');
302 addFile(
303 '/b.dart',
304 r'''
305 class C {
306 var f = 0;
307 }
308 ''');
309 var library = await _encodeDecodeLibrary(r'''
310 import 'a.dart';
311 var t1 = x;
312 ''');
313 checkElementText(
314 library,
315 r'''
316 import 'a.dart';
317 dynamic t1;
318 ''');
319 }
320
321 test_initializer_error_extractProperty_inStaticField() async {
322 var library = await _encodeDecodeLibrary(r'''
323 class A {
324 int f;
325 }
326 class B {
327 static var t = new A().f;
328 }
329 ''');
330 // TODO(scheglov) test for inference failure error
331 checkElementText(
332 library,
333 r'''
334 class A {
335 int f;
336 }
337 class B {
338 static dynamic t;
339 }
340 ''');
341 }
342
343 test_initializer_error_extractProperty_prefixedIdentifier() async {
344 var library = await _encodeDecodeLibrary(r'''
345 class C {
346 bool b;
347 }
348 C c;
349 var x = c.b;
350 ''');
351 // TODO(scheglov) test for inference failure error
352 checkElementText(
353 library,
354 r'''
355 class C {
356 bool b;
357 }
358 C c;
359 dynamic x;
360 ''');
361 }
362
363 test_initializer_error_extractProperty_prefixedIdentifier_viaInterface() async {
364 var library = await _encodeDecodeLibrary(r'''
365 class I {
366 bool b;
367 }
368 abstract class C implements I {}
369 C c;
370 var x = c.b;
371 ''');
372 // TODO(scheglov) test for inference failure error
373 checkElementText(
374 library,
375 r'''
376 class I {
377 bool b;
378 }
379 abstract class C implements I {
380 }
381 C c;
382 dynamic x;
383 ''');
384 }
385
386 test_initializer_error_extractProperty_viaInterface() async {
387 var library = await _encodeDecodeLibrary(r'''
388 class I {
389 bool b;
390 }
391 abstract class C implements I {}
392 C f() => null;
393 var x = f().b;
394 ''');
395 // TODO(scheglov) test for inference failure error
396 checkElementText(
397 library,
398 r'''
399 class I {
400 bool b;
401 }
402 abstract class C implements I {
403 }
404 dynamic x;
405 C f() {}
406 ''');
407 }
408
409 test_initializer_error_instanceGetterOfObject() async {
410 var library = await _encodeDecodeLibrary(r'''
411 dynamic f() => null;
412 var s = f().toString();
413 var h = f().hashCode;
414 ''');
415 // TODO(scheglov) test for inference failure error
416 checkElementText(
417 library,
418 r'''
419 String s;
420 dynamic h;
421 dynamic f() {}
422 ''');
423 }
424
425 test_initializer_error_instanceGetterOfObject_prefixed() async {
426 var library = await _encodeDecodeLibrary(r'''
427 dynamic d;
428 var s = d.toString();
429 var h = d.hashCode;
430 ''');
431 // TODO(scheglov) test for inference failure error
432 checkElementText(
433 library,
434 r'''
435 dynamic d;
436 String s;
437 dynamic h;
438 ''');
439 }
440
441 test_initializer_error_referenceToFieldOfStaticField() async {
442 var library = await _encodeDecodeLibrary(r'''
443 class C {
444 static D d;
445 }
446 class D {
447 int i;
448 }
449 final x = C.d.i;
450 ''');
451 // TODO(scheglov) test for inference failure error
452 checkElementText(
453 library,
454 r'''
455 class C {
456 static D d;
457 }
458 class D {
459 int i;
460 }
461 final dynamic x;
462 ''');
463 }
464
465 test_initializer_error_referenceToFieldOfStaticGetter() async {
466 var library = await _encodeDecodeLibrary(r'''
467 class C {
468 static D get d => null;
469 }
470 class D {
471 int i;
472 }
473 var x = C.d.i;
474 ''');
475 // TODO(scheglov) test for inference failure error
476 checkElementText(
477 library,
478 r'''
479 class C {
480 static D get d {}
481 }
482 class D {
483 int i;
484 }
485 dynamic x;
486 ''');
487 }
488
130 test_initializer_functionExpression() async { 489 test_initializer_functionExpression() async {
131 var library = await _encodeDecodeLibrary(r''' 490 var library = await _encodeDecodeLibrary(r'''
132 import 'dart:async'; 491 import 'dart:async';
133 var vFuture = new Future<int>(42); 492 var vFuture = new Future<int>(42);
134 var v_noParameters_inferredReturnType = () => 42; 493 var v_noParameters_inferredReturnType = () => 42;
135 var v_hasParameter_withType_inferredReturnType = (String a) => 42; 494 var v_hasParameter_withType_inferredReturnType = (String a) => 42;
136 var v_hasParameter_withType_returnParameter = (String a) => a; 495 var v_hasParameter_withType_returnParameter = (String a) => a;
137 var v_async_returnValue = () async => 42; 496 var v_async_returnValue = () async => 42;
138 var v_async_returnFuture = () async => vFuture; 497 var v_async_returnFuture = () async => vFuture;
139 '''); 498 ''');
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 /** 1226 /**
868 * A getter, setter or field which overrides/implements only a getter is 1227 * A getter, setter or field which overrides/implements only a getter is
869 * inferred to have the type taken from the overridden getter result type. 1228 * inferred to have the type taken from the overridden getter result type.
870 * 1229 *
871 * Note that overriding a field is addressed via the implicit induced 1230 * Note that overriding a field is addressed via the implicit induced
872 * getter/setter pair (or just getter in the case of a final field). 1231 * getter/setter pair (or just getter in the case of a final field).
873 * 1232 *
874 * A field with no annotated type that does not override anything has the 1233 * A field with no annotated type that does not override anything has the
875 * type inferred from its initializer. 1234 * type inferred from its initializer.
876 */ 1235 */
877 @failingTest
878 test_instanceField_preferOverride() async { 1236 test_instanceField_preferOverride() async {
879 var library = await _encodeDecodeLibrary(r''' 1237 var library = await _encodeDecodeLibrary(r'''
880 abstract class A { 1238 abstract class A {
881 num x; 1239 num x;
882 var y = 2; 1240 var y = 2;
883 } 1241 }
884 class B implements A { 1242 class B implements A {
885 var x = 1; 1243 var x = 1;
886 var y = 2; 1244 var y = 2;
887 var z = 3; 1245 var z = 3;
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 1857
1500 Future<LibraryElement> _encodeDecodeLibrary(String text) async { 1858 Future<LibraryElement> _encodeDecodeLibrary(String text) async {
1501 String path = _p('/test.dart'); 1859 String path = _p('/test.dart');
1502 provider.newFile(path, text); 1860 provider.newFile(path, text);
1503 UnitElementResult result = await driver.getUnitElement(path); 1861 UnitElementResult result = await driver.getUnitElement(path);
1504 return result.element.library; 1862 return result.element.library;
1505 } 1863 }
1506 1864
1507 String _p(String path) => provider.convertPath(path); 1865 String _p(String path) => provider.convertPath(path);
1508 } 1866 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/summary/summary_common.dart ('k') | pkg/analyzer/test/src/task/dart_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698