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 |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 (/*info:DYNAMIC_INVOKE*/toStringClosure2()); | 493 (/*info:DYNAMIC_INVOKE*/toStringClosure2()); |
494 int hashCode = /*info:DYNAMIC_CAST*/helper.hashCode; | 494 int hashCode = /*info:DYNAMIC_CAST*/helper.hashCode; |
495 | 495 |
496 baz().toString(); | 496 baz().toString(); |
497 baz().hashCode; | 497 baz().hashCode; |
498 } | 498 } |
499 '''); | 499 '''); |
500 } | 500 } |
501 | 501 |
502 void test_covariantOverride() { | 502 void test_covariantOverride() { |
503 addFile(r''' | 503 _addMetaLibrary(); |
504 library meta; | |
505 class _Checked { const _Checked(); } | |
506 const Object checked = const _Checked(); | |
507 ''', name: '/meta.dart'); | |
508 | |
509 checkFile(r''' | 504 checkFile(r''' |
510 import 'meta.dart'; | 505 import 'meta.dart'; |
511 class C { | 506 class C { |
512 num f(num x) => x; | 507 num f(num x) => x; |
513 } | 508 } |
514 class D extends C { | 509 class D extends C { |
515 int f(@checked int x) => x; | 510 int f(@checked int x) => x; |
516 } | 511 } |
517 class E extends D { | 512 class E extends D { |
518 int f(Object x) => /*info:DOWN_CAST_IMPLICIT*/x; | 513 int f(Object x) => /*info:DOWN_CAST_IMPLICIT*/x; |
(...skipping 12 matching lines...) Expand all Loading... |
531 class F_error extends E { | 526 class F_error extends E { |
532 /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0; | 527 /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0; |
533 } | 528 } |
534 class G_error extends E implements D { | 529 class G_error extends E implements D { |
535 /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0; | 530 /*error:INVALID_METHOD_OVERRIDE*/int f(@checked double x) => 0; |
536 } | 531 } |
537 '''); | 532 '''); |
538 } | 533 } |
539 | 534 |
540 void test_covariantOverride_leastUpperBound() { | 535 void test_covariantOverride_leastUpperBound() { |
541 addFile(r''' | 536 _addMetaLibrary(); |
542 library meta; | |
543 class _Checked { const _Checked(); } | |
544 const Object checked = const _Checked(); | |
545 ''', name: '/meta.dart'); | |
546 | |
547 checkFile(r''' | 537 checkFile(r''' |
548 import "meta.dart"; | 538 import "meta.dart"; |
549 abstract class Top {} | 539 abstract class Top {} |
550 abstract class Left implements Top {} | 540 abstract class Left implements Top {} |
551 abstract class Right implements Top {} | 541 abstract class Right implements Top {} |
552 abstract class Bottom implements Left, Right {} | 542 abstract class Bottom implements Left, Right {} |
553 | 543 |
554 abstract class TakesLeft { | 544 abstract class TakesLeft { |
555 m(Left x); | 545 m(Left x); |
556 } | 546 } |
557 abstract class TakesRight { | 547 abstract class TakesRight { |
558 m(Right x); | 548 m(Right x); |
559 } | 549 } |
560 abstract class TakesTop implements TakesLeft, TakesRight { | 550 abstract class TakesTop implements TakesLeft, TakesRight { |
561 m(Top x); // works today | 551 m(Top x); // works today |
562 } | 552 } |
563 abstract class TakesBottom implements TakesLeft, TakesRight { | 553 abstract class TakesBottom implements TakesLeft, TakesRight { |
564 // LUB(Left, Right) == Top, so this is an implicit cast from Top to Bottom. | 554 // LUB(Left, Right) == Top, so this is an implicit cast from Top to Bottom. |
565 m(@checked Bottom x); | 555 m(@checked Bottom x); |
566 } | 556 } |
567 '''); | 557 '''); |
568 } | 558 } |
569 | 559 |
570 void test_covariantOverride_markerIsInherited() { | 560 void test_covariantOverride_markerIsInherited() { |
571 addFile(r''' | 561 _addMetaLibrary(); |
572 library meta; | |
573 class _Checked { const _Checked(); } | |
574 const Object checked = const _Checked(); | |
575 ''', name: '/meta.dart'); | |
576 | |
577 checkFile(r''' | 562 checkFile(r''' |
578 import 'meta.dart'; | 563 import 'meta.dart'; |
579 class C { | 564 class C { |
580 num f(@checked num x) => x; | 565 num f(@checked num x) => x; |
581 } | 566 } |
582 class D extends C { | 567 class D extends C { |
583 int f(int x) => x; | 568 int f(int x) => x; |
584 } | 569 } |
585 class E extends D { | 570 class E extends D { |
586 int f(Object x) => /*info:DOWN_CAST_IMPLICIT*/x; | 571 int f(Object x) => /*info:DOWN_CAST_IMPLICIT*/x; |
(...skipping 2521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3108 n(B b); | 3093 n(B b); |
3109 } | 3094 } |
3110 abstract class D extends C { | 3095 abstract class D extends C { |
3111 /*error:INVALID_METHOD_OVERRIDE*/m(B b); | 3096 /*error:INVALID_METHOD_OVERRIDE*/m(B b); |
3112 n(A a); | 3097 n(A a); |
3113 } | 3098 } |
3114 '''); | 3099 '''); |
3115 check(implicitCasts: false); | 3100 check(implicitCasts: false); |
3116 } | 3101 } |
3117 | 3102 |
| 3103 void test_overrideNarrowsType_noDuplicateError() { |
| 3104 // Regression test for https://github.com/dart-lang/sdk/issues/25232 |
| 3105 _addMetaLibrary(); |
| 3106 checkFile(r''' |
| 3107 import 'meta.dart'; |
| 3108 abstract class A { void test(A arg) { } } |
| 3109 abstract class B extends A { |
| 3110 /*error:INVALID_METHOD_OVERRIDE*/void test(B arg) { } |
| 3111 } |
| 3112 abstract class X implements A { } |
| 3113 class C extends B with X { } |
| 3114 |
| 3115 // We treat "implements A" as asking for another check. |
| 3116 // This feels inconsistent to me. |
| 3117 class D /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends B implements A { } |
| 3118 '''); |
| 3119 } |
| 3120 |
| 3121 void test_overrideNarrowsType_legalWithChecked() { |
| 3122 // Regression test for https://github.com/dart-lang/sdk/issues/25232 |
| 3123 _addMetaLibrary(); |
| 3124 checkFile(r''' |
| 3125 import 'meta.dart'; |
| 3126 abstract class A { void test(A arg) { } } |
| 3127 abstract class B extends A { void test(@checked B arg) { } } |
| 3128 abstract class X implements A { } |
| 3129 class C extends B with X { } |
| 3130 class D extends B implements A { } |
| 3131 '''); |
| 3132 } |
| 3133 |
3118 void test_privateOverride() { | 3134 void test_privateOverride() { |
3119 addFile( | 3135 addFile( |
3120 ''' | 3136 ''' |
3121 import 'main.dart' as main; | 3137 import 'main.dart' as main; |
3122 | 3138 |
3123 class Base { | 3139 class Base { |
3124 var f1; | 3140 var f1; |
3125 var _f2; | 3141 var _f2; |
3126 var _f3; | 3142 var _f3; |
3127 get _f4 => null; | 3143 get _f4 => null; |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3833 // Regression test for https://github.com/dart-lang/sdk/issues/25069 | 3849 // Regression test for https://github.com/dart-lang/sdk/issues/25069 |
3834 checkFile(''' | 3850 checkFile(''' |
3835 typedef int Foo(); | 3851 typedef int Foo(); |
3836 void foo() {} | 3852 void foo() {} |
3837 void main () { | 3853 void main () { |
3838 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); | 3854 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); |
3839 } | 3855 } |
3840 '''); | 3856 '''); |
3841 } | 3857 } |
3842 } | 3858 } |
| 3859 |
| 3860 void _addMetaLibrary() { |
| 3861 addFile(r''' |
| 3862 library meta; |
| 3863 class _Checked { const _Checked(); } |
| 3864 const Object checked = const _Checked(); |
| 3865 ''', name: '/meta.dart'); |
| 3866 } |
OLD | NEW |