OLD | NEW |
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 analyzer.test.src.task.strong.checker_test; | 5 library analyzer.test.src.task.strong.checker_test; |
6 | 6 |
7 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 7 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
8 | 8 |
9 import 'strong_test_helper.dart'; | 9 import 'strong_test_helper.dart'; |
10 | 10 |
11 void main() { | 11 void main() { |
12 initStrongModeTests(); | 12 defineReflectiveSuite(() { |
13 defineReflectiveTests(CheckerTest); | 13 defineReflectiveTests(CheckerTest); |
| 14 }); |
| 15 } |
| 16 |
| 17 void _addMetaLibrary() { |
| 18 addFile( |
| 19 r''' |
| 20 library meta; |
| 21 class _Checked { const _Checked(); } |
| 22 const Object checked = const _Checked(); |
| 23 |
| 24 class _Virtual { const _Virtual(); } |
| 25 const Object virtual = const _Virtual(); |
| 26 ''', |
| 27 name: '/meta.dart'); |
14 } | 28 } |
15 | 29 |
16 @reflectiveTest | 30 @reflectiveTest |
17 class CheckerTest { | 31 class CheckerTest { |
| 32 void setUp() { |
| 33 doSetUp(); |
| 34 } |
| 35 |
| 36 void tearDown() { |
| 37 doTearDown(); |
| 38 } |
| 39 |
18 void test_awaitForInCastsStreamElementToVariable() { | 40 void test_awaitForInCastsStreamElementToVariable() { |
19 checkFile(''' | 41 checkFile(''' |
20 import 'dart:async'; | 42 import 'dart:async'; |
21 main() async { | 43 main() async { |
22 // Don't choke if sequence is not stream. | 44 // Don't choke if sequence is not stream. |
23 await for (var i in /*error:FOR_IN_OF_INVALID_TYPE*/1234) {} | 45 await for (var i in /*error:FOR_IN_OF_INVALID_TYPE*/1234) {} |
24 | 46 |
25 // Dynamic cast. | 47 // Dynamic cast. |
26 await for (String /*info:DYNAMIC_CAST*/s in new Stream<dynamic>()) {} | 48 await for (String /*info:DYNAMIC_CAST*/s in new Stream<dynamic>()) {} |
27 | 49 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 m(A a); | 254 m(A a); |
233 } | 255 } |
234 abstract class I2 extends I1 {} | 256 abstract class I2 extends I1 {} |
235 | 257 |
236 class T1 implements I2 { | 258 class T1 implements I2 { |
237 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} | 259 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} |
238 } | 260 } |
239 '''); | 261 '''); |
240 } | 262 } |
241 | 263 |
| 264 void test_compoundAssignment_returnsDynamic() { |
| 265 checkFile(r''' |
| 266 class Foo { |
| 267 operator +(other) => null; |
| 268 } |
| 269 |
| 270 main() { |
| 271 var foo = new Foo(); |
| 272 foo = /*info:DYNAMIC_CAST*/foo + 1; |
| 273 /*info:DYNAMIC_CAST*/foo += 1; |
| 274 } |
| 275 '''); |
| 276 } |
| 277 |
242 void test_compoundAssignments() { | 278 void test_compoundAssignments() { |
243 checkFile(''' | 279 checkFile(''' |
244 class A { | 280 class A { |
245 A operator *(B b) => null; | 281 A operator *(B b) => null; |
246 A operator /(B b) => null; | 282 A operator /(B b) => null; |
247 A operator ~/(B b) => null; | 283 A operator ~/(B b) => null; |
248 A operator %(B b) => null; | 284 A operator %(B b) => null; |
249 A operator +(B b) => null; | 285 A operator +(B b) => null; |
250 A operator -(B b) => null; | 286 A operator -(B b) => null; |
251 A operator <<(B b) => null; | 287 A operator <<(B b) => null; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; | 409 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; |
374 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; | 410 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; |
375 const C(); | 411 const C(); |
376 } | 412 } |
377 main() { | 413 main() { |
378 const SetEquality<String>(); | 414 const SetEquality<String>(); |
379 } | 415 } |
380 '''); | 416 '''); |
381 } | 417 } |
382 | 418 |
383 void test_compoundAssignment_returnsDynamic() { | |
384 checkFile(r''' | |
385 class Foo { | |
386 operator +(other) => null; | |
387 } | |
388 | |
389 main() { | |
390 var foo = new Foo(); | |
391 foo = /*info:DYNAMIC_CAST*/foo + 1; | |
392 /*info:DYNAMIC_CAST*/foo += 1; | |
393 } | |
394 '''); | |
395 } | |
396 | |
397 void test_constructorInvalid() { | 419 void test_constructorInvalid() { |
398 // Regression test for https://github.com/dart-lang/sdk/issues/26695 | 420 // Regression test for https://github.com/dart-lang/sdk/issues/26695 |
399 checkFile(''' | 421 checkFile(''' |
400 class A { | 422 class A { |
401 B({ /*error:FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR*/this.test: 1.0 }) {} | 423 B({ /*error:FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR*/this.test: 1.0 }) {} |
402 final double test = 0.0; | 424 final double test = 0.0; |
403 } | 425 } |
404 '''); | 426 '''); |
405 } | 427 } |
406 | 428 |
(...skipping 2761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3168 n(B b); | 3190 n(B b); |
3169 } | 3191 } |
3170 abstract class D extends C { | 3192 abstract class D extends C { |
3171 /*error:INVALID_METHOD_OVERRIDE*/m(B b); | 3193 /*error:INVALID_METHOD_OVERRIDE*/m(B b); |
3172 n(A a); | 3194 n(A a); |
3173 } | 3195 } |
3174 '''); | 3196 '''); |
3175 check(implicitCasts: false); | 3197 check(implicitCasts: false); |
3176 } | 3198 } |
3177 | 3199 |
| 3200 void test_overrideNarrowsType_legalWithChecked() { |
| 3201 // Regression test for https://github.com/dart-lang/sdk/issues/25232 |
| 3202 _addMetaLibrary(); |
| 3203 checkFile(r''' |
| 3204 import 'meta.dart'; |
| 3205 abstract class A { void test(A arg) { } } |
| 3206 abstract class B extends A { void test(@checked B arg) { } } |
| 3207 abstract class X implements A { } |
| 3208 class C extends B with X { } |
| 3209 class D extends B implements A { } |
| 3210 '''); |
| 3211 } |
| 3212 |
3178 void test_overrideNarrowsType_noDuplicateError() { | 3213 void test_overrideNarrowsType_noDuplicateError() { |
3179 // Regression test for https://github.com/dart-lang/sdk/issues/25232 | 3214 // Regression test for https://github.com/dart-lang/sdk/issues/25232 |
3180 _addMetaLibrary(); | 3215 _addMetaLibrary(); |
3181 checkFile(r''' | 3216 checkFile(r''' |
3182 import 'meta.dart'; | 3217 import 'meta.dart'; |
3183 abstract class A { void test(A arg) { } } | 3218 abstract class A { void test(A arg) { } } |
3184 abstract class B extends A { | 3219 abstract class B extends A { |
3185 /*error:INVALID_METHOD_OVERRIDE*/void test(B arg) { } | 3220 /*error:INVALID_METHOD_OVERRIDE*/void test(B arg) { } |
3186 } | 3221 } |
3187 abstract class X implements A { } | 3222 abstract class X implements A { } |
3188 class C extends B with X { } | 3223 class C extends B with X { } |
3189 | 3224 |
3190 // We treat "implements A" as asking for another check. | 3225 // We treat "implements A" as asking for another check. |
3191 // This feels inconsistent to me. | 3226 // This feels inconsistent to me. |
3192 class D /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends B implements A { } | 3227 class D /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends B implements A { } |
3193 '''); | 3228 '''); |
3194 } | 3229 } |
3195 | 3230 |
3196 void test_overrideNarrowsType_legalWithChecked() { | |
3197 // Regression test for https://github.com/dart-lang/sdk/issues/25232 | |
3198 _addMetaLibrary(); | |
3199 checkFile(r''' | |
3200 import 'meta.dart'; | |
3201 abstract class A { void test(A arg) { } } | |
3202 abstract class B extends A { void test(@checked B arg) { } } | |
3203 abstract class X implements A { } | |
3204 class C extends B with X { } | |
3205 class D extends B implements A { } | |
3206 '''); | |
3207 } | |
3208 | |
3209 void test_privateOverride() { | 3231 void test_privateOverride() { |
3210 addFile( | 3232 addFile( |
3211 ''' | 3233 ''' |
3212 import 'main.dart' as main; | 3234 import 'main.dart' as main; |
3213 | 3235 |
3214 class Base { | 3236 class Base { |
3215 var f1; | 3237 var f1; |
3216 var _f2; | 3238 var _f2; |
3217 var _f3; | 3239 var _f3; |
3218 get _f4 => null; | 3240 get _f4 => null; |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3938 // Regression test for https://github.com/dart-lang/sdk/issues/25069 | 3960 // Regression test for https://github.com/dart-lang/sdk/issues/25069 |
3939 checkFile(''' | 3961 checkFile(''' |
3940 typedef int Foo(); | 3962 typedef int Foo(); |
3941 void foo() {} | 3963 void foo() {} |
3942 void main () { | 3964 void main () { |
3943 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); | 3965 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); |
3944 } | 3966 } |
3945 '''); | 3967 '''); |
3946 } | 3968 } |
3947 } | 3969 } |
3948 | |
3949 void _addMetaLibrary() { | |
3950 addFile(r''' | |
3951 library meta; | |
3952 class _Checked { const _Checked(); } | |
3953 const Object checked = const _Checked(); | |
3954 | |
3955 class _Virtual { const _Virtual(); } | |
3956 const Object virtual = const _Virtual(); | |
3957 ''', name: '/meta.dart'); | |
3958 } | |
OLD | NEW |