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 // TODO(jmesserly): this file needs to be refactored, it's a port from | 5 // TODO(jmesserly): this file needs to be refactored, it's a port from |
6 // package:dev_compiler's tests | 6 // package:dev_compiler's tests |
7 /// General type checking tests | 7 /// General type checking tests |
8 library test.src.task.strong.checker_test; | 8 library test.src.task.strong.checker_test; |
9 | 9 |
10 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 class C extends B {} | 1125 class C extends B {} |
1126 | 1126 |
1127 class Base { | 1127 class Base { |
1128 B f1; | 1128 B f1; |
1129 B f2; | 1129 B f2; |
1130 B f3; | 1130 B f3; |
1131 B f4; | 1131 B f4; |
1132 } | 1132 } |
1133 | 1133 |
1134 class Child extends Base { | 1134 class Child extends Base { |
| 1135 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/A f1; //
invalid for getter |
| 1136 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/C f2; //
invalid for setter |
| 1137 /*severe:InvalidFieldOverride*/var f3; |
| 1138 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride,severe:In
validMethodOverride*/dynamic f4; |
| 1139 } |
| 1140 |
| 1141 class Child2 implements Base { |
1135 /*severe:InvalidMethodOverride*/A f1; // invalid for getter | 1142 /*severe:InvalidMethodOverride*/A f1; // invalid for getter |
1136 /*severe:InvalidMethodOverride*/C f2; // invalid for setter | 1143 /*severe:InvalidMethodOverride*/C f2; // invalid for setter |
1137 var f3; | 1144 var f3; |
1138 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/dynamic
f4; | 1145 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/dynamic
f4; |
1139 } | 1146 } |
1140 ''' | 1147 ''' |
1141 }); | 1148 }); |
1142 | 1149 |
| 1150 testChecker('private override', { |
| 1151 '/helper.dart': ''' |
| 1152 import 'main.dart' as main; |
| 1153 |
| 1154 class Base { |
| 1155 var f1; |
| 1156 var _f2; |
| 1157 var _f3; |
| 1158 get _f4 => null; |
| 1159 |
| 1160 int _m1(); |
| 1161 } |
| 1162 |
| 1163 class GrandChild extends main.Child { |
| 1164 /*severe:InvalidFieldOverride*/var _f2; |
| 1165 /*severe:InvalidFieldOverride*/var _f3; |
| 1166 var _f4; |
| 1167 |
| 1168 /*severe:InvalidMethodOverride*/String _m1(); |
| 1169 } |
| 1170 ''', |
| 1171 '/main.dart': ''' |
| 1172 import 'helper.dart' as helper; |
| 1173 |
| 1174 class Child extends helper.Base { |
| 1175 /*severe:InvalidFieldOverride*/var f1; |
| 1176 var _f2; |
| 1177 var _f4; |
| 1178 |
| 1179 String _m1(); |
| 1180 } |
| 1181 ''' |
| 1182 }); |
| 1183 |
1143 testChecker('getter/getter override', { | 1184 testChecker('getter/getter override', { |
1144 '/main.dart': ''' | 1185 '/main.dart': ''' |
1145 class A {} | 1186 class A {} |
1146 class B extends A {} | 1187 class B extends A {} |
1147 class C extends B {} | 1188 class C extends B {} |
1148 | 1189 |
1149 abstract class Base { | 1190 abstract class Base { |
1150 B get f1; | 1191 B get f1; |
1151 B get f2; | 1192 B get f2; |
1152 B get f3; | 1193 B get f3; |
(...skipping 16 matching lines...) Expand all Loading... |
1169 class C extends B {} | 1210 class C extends B {} |
1170 | 1211 |
1171 abstract class Base { | 1212 abstract class Base { |
1172 B f1; | 1213 B f1; |
1173 B f2; | 1214 B f2; |
1174 B f3; | 1215 B f3; |
1175 B f4; | 1216 B f4; |
1176 } | 1217 } |
1177 | 1218 |
1178 class Child extends Base { | 1219 class Child extends Base { |
| 1220 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/A get f1
=> null; |
| 1221 /*severe:InvalidFieldOverride*/C get f2 => null; |
| 1222 /*severe:InvalidFieldOverride*/get f3 => null; |
| 1223 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/dynamic
get f4 => null; |
| 1224 } |
| 1225 |
| 1226 class Child2 implements Base { |
1179 /*severe:InvalidMethodOverride*/A get f1 => null; | 1227 /*severe:InvalidMethodOverride*/A get f1 => null; |
1180 C get f2 => null; | 1228 C get f2 => null; |
1181 get f3 => null; | 1229 get f3 => null; |
1182 /*severe:InvalidMethodOverride*/dynamic get f4 => null; | 1230 /*severe:InvalidMethodOverride*/dynamic get f4 => null; |
1183 } | 1231 } |
1184 ''' | 1232 ''' |
1185 }); | 1233 }); |
1186 | 1234 |
1187 testChecker('setter/setter override', { | 1235 testChecker('setter/setter override', { |
1188 '/main.dart': ''' | 1236 '/main.dart': ''' |
(...skipping 27 matching lines...) Expand all Loading... |
1216 | 1264 |
1217 class Base { | 1265 class Base { |
1218 B f1; | 1266 B f1; |
1219 B f2; | 1267 B f2; |
1220 B f3; | 1268 B f3; |
1221 B f4; | 1269 B f4; |
1222 B f5; | 1270 B f5; |
1223 } | 1271 } |
1224 | 1272 |
1225 class Child extends Base { | 1273 class Child extends Base { |
| 1274 /*severe:InvalidFieldOverride*/B get f1 => null; |
| 1275 /*severe:InvalidFieldOverride*/B get f2 => null; |
| 1276 /*severe:InvalidFieldOverride*/B get f3 => null; |
| 1277 /*severe:InvalidFieldOverride*/B get f4 => null; |
| 1278 /*severe:InvalidFieldOverride*/B get f5 => null; |
| 1279 |
| 1280 /*severe:InvalidFieldOverride*/void set f1(A value) {} |
| 1281 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/void set
f2(C value) {} |
| 1282 /*severe:InvalidFieldOverride*/void set f3(value) {} |
| 1283 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/void set
f4(dynamic value) {} |
| 1284 /*severe:InvalidFieldOverride*/set f5(B value) {} |
| 1285 } |
| 1286 |
| 1287 class Child2 implements Base { |
1226 B get f1 => null; | 1288 B get f1 => null; |
1227 B get f2 => null; | 1289 B get f2 => null; |
1228 B get f3 => null; | 1290 B get f3 => null; |
1229 B get f4 => null; | 1291 B get f4 => null; |
1230 B get f5 => null; | 1292 B get f5 => null; |
1231 | 1293 |
1232 void set f1(A value) {} | 1294 void set f1(A value) {} |
1233 /*severe:InvalidMethodOverride*/void set f2(C value) {} | 1295 /*severe:InvalidMethodOverride*/void set f2(C value) {} |
1234 void set f3(value) {} | 1296 void set f3(value) {} |
1235 /*severe:InvalidMethodOverride*/void set f4(dynamic value) {} | 1297 /*severe:InvalidMethodOverride*/void set f4(dynamic value) {} |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1501 testChecker('child override', { | 1563 testChecker('child override', { |
1502 '/main.dart': ''' | 1564 '/main.dart': ''' |
1503 class A {} | 1565 class A {} |
1504 class B {} | 1566 class B {} |
1505 | 1567 |
1506 class Base { | 1568 class Base { |
1507 A f; | 1569 A f; |
1508 } | 1570 } |
1509 | 1571 |
1510 class T1 extends Base { | 1572 class T1 extends Base { |
| 1573 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/B get
f => null; |
| 1574 } |
| 1575 |
| 1576 class T2 extends Base { |
| 1577 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/set f(
B b) => null; |
| 1578 } |
| 1579 |
| 1580 class T3 extends Base { |
| 1581 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/final
B f; |
| 1582 } |
| 1583 class T4 extends Base { |
| 1584 // two: one for the getter one for the setter. |
| 1585 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride,severe:
InvalidMethodOverride*/B f; |
| 1586 } |
| 1587 |
| 1588 class T5 implements Base { |
1511 /*severe:InvalidMethodOverride*/B get f => null; | 1589 /*severe:InvalidMethodOverride*/B get f => null; |
1512 } | 1590 } |
1513 | 1591 |
1514 class T2 extends Base { | 1592 class T6 implements Base { |
1515 /*severe:InvalidMethodOverride*/set f(B b) => null; | 1593 /*severe:InvalidMethodOverride*/set f(B b) => null; |
1516 } | 1594 } |
1517 | 1595 |
1518 class T3 extends Base { | 1596 class T7 implements Base { |
1519 /*severe:InvalidMethodOverride*/final B f; | 1597 /*severe:InvalidMethodOverride*/final B f; |
1520 } | 1598 } |
1521 class T4 extends Base { | 1599 class T8 implements Base { |
1522 // two: one for the getter one for the setter. | 1600 // two: one for the getter one for the setter. |
1523 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/B f; | 1601 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/B f; |
1524 } | 1602 } |
1525 ''' | 1603 ''' |
1526 }); | 1604 }); |
1527 | 1605 |
1528 testChecker('child override 2', { | 1606 testChecker('child override 2', { |
1529 '/main.dart': ''' | 1607 '/main.dart': ''' |
1530 class A {} | 1608 class A {} |
1531 class B {} | 1609 class B {} |
1532 | 1610 |
1533 class Base { | 1611 class Base { |
1534 m(A a) {} | 1612 m(A a) {} |
1535 } | 1613 } |
1536 | 1614 |
1537 class Test extends Base { | 1615 class Test extends Base { |
1538 /*severe:InvalidMethodOverride*/m(B a) {} | 1616 /*severe:InvalidMethodOverride*/m(B a) {} |
1539 } | 1617 } |
1540 ''' | 1618 ''' |
1541 }); | 1619 }); |
1542 testChecker('grandchild override', { | 1620 testChecker('grandchild override', { |
1543 '/main.dart': ''' | 1621 '/main.dart': ''' |
1544 class A {} | 1622 class A {} |
1545 class B {} | 1623 class B {} |
1546 | 1624 |
1547 class Grandparent { | 1625 class Grandparent { |
1548 m(A a) {} | 1626 m(A a) {} |
| 1627 int x; |
1549 } | 1628 } |
1550 class Parent extends Grandparent { | 1629 class Parent extends Grandparent { |
1551 } | 1630 } |
1552 | 1631 |
1553 class Test extends Parent { | 1632 class Test extends Parent { |
1554 /*severe:InvalidMethodOverride*/m(B a) {} | 1633 /*severe:InvalidMethodOverride*/m(B a) {} |
| 1634 /*severe:InvalidFieldOverride*/int x; |
1555 } | 1635 } |
1556 ''' | 1636 ''' |
1557 }); | 1637 }); |
1558 | 1638 |
1559 testChecker('double override', { | 1639 testChecker('double override', { |
1560 '/main.dart': ''' | 1640 '/main.dart': ''' |
1561 class A {} | 1641 class A {} |
1562 class B {} | 1642 class B {} |
1563 | 1643 |
1564 class Grandparent { | 1644 class Grandparent { |
(...skipping 28 matching lines...) Expand all Loading... |
1593 ''' | 1673 ''' |
1594 }); | 1674 }); |
1595 | 1675 |
1596 testChecker('mixin override to base', { | 1676 testChecker('mixin override to base', { |
1597 '/main.dart': ''' | 1677 '/main.dart': ''' |
1598 class A {} | 1678 class A {} |
1599 class B {} | 1679 class B {} |
1600 | 1680 |
1601 class Base { | 1681 class Base { |
1602 m(A a) {} | 1682 m(A a) {} |
| 1683 int x; |
1603 } | 1684 } |
1604 | 1685 |
1605 class M1 { | 1686 class M1 { |
1606 m(B a) {} | 1687 m(B a) {} |
1607 } | 1688 } |
1608 | 1689 |
1609 class M2 {} | 1690 class M2 { |
| 1691 int x; |
| 1692 } |
1610 | 1693 |
1611 class T1 extends Base with /*severe:InvalidMethodOverride*/M1 {} | 1694 class T1 extends Base with /*severe:InvalidMethodOverride*/M1 {} |
1612 class T2 extends Base with /*severe:InvalidMethodOverride*/M1, M2 {} | 1695 class T2 extends Base with /*severe:InvalidMethodOverride*/M1, /*sev
ere:InvalidFieldOverride*/M2 {} |
1613 class T3 extends Base with M2, /*severe:InvalidMethodOverride*/M1 {} | 1696 class T3 extends Base with /*severe:InvalidFieldOverride*/M2, /*seve
re:InvalidMethodOverride*/M1 {} |
1614 ''' | 1697 ''' |
1615 }); | 1698 }); |
1616 | 1699 |
1617 testChecker('mixin override to mixin', { | 1700 testChecker('mixin override to mixin', { |
1618 '/main.dart': ''' | 1701 '/main.dart': ''' |
1619 class A {} | 1702 class A {} |
1620 class B {} | 1703 class B {} |
1621 | 1704 |
1622 class Base { | 1705 class Base { |
1623 } | 1706 } |
1624 | 1707 |
1625 class M1 { | 1708 class M1 { |
1626 m(B a) {} | 1709 m(B a) {} |
| 1710 int x; |
1627 } | 1711 } |
1628 | 1712 |
1629 class M2 { | 1713 class M2 { |
1630 m(A a) {} | 1714 m(A a) {} |
| 1715 int x; |
1631 } | 1716 } |
1632 | 1717 |
1633 class T1 extends Base with M1, /*severe:InvalidMethodOverride*/M2 {} | 1718 class T1 extends Base with M1, /*severe:InvalidMethodOverride,severe
:InvalidFieldOverride*/M2 {} |
1634 ''' | 1719 ''' |
1635 }); | 1720 }); |
1636 | 1721 |
1637 // This is a regression test for a bug in an earlier implementation were | 1722 // This is a regression test for a bug in an earlier implementation were |
1638 // names were hiding errors if the first mixin override looked correct, | 1723 // names were hiding errors if the first mixin override looked correct, |
1639 // but subsequent ones did not. | 1724 // but subsequent ones did not. |
1640 testChecker('no duplicate mixin override', { | 1725 testChecker('no duplicate mixin override', { |
1641 '/main.dart': ''' | 1726 '/main.dart': ''' |
1642 class A {} | 1727 class A {} |
1643 class B {} | 1728 class B {} |
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2314 | 2399 |
2315 baz1() sync* { yield* (/*info:DynamicCast*/x); } | 2400 baz1() sync* { yield* (/*info:DynamicCast*/x); } |
2316 Iterable baz2() sync* { yield* (/*info:DynamicCast*/x); } | 2401 Iterable baz2() sync* { yield* (/*info:DynamicCast*/x); } |
2317 Iterable<int> baz3() sync* { yield* (/*warning:DownCastComposite*/x); } | 2402 Iterable<int> baz3() sync* { yield* (/*warning:DownCastComposite*/x); } |
2318 Iterable<int> baz4() sync* { yield* new Iterable<int>(); } | 2403 Iterable<int> baz4() sync* { yield* new Iterable<int>(); } |
2319 Iterable<int> baz5() sync* { yield* (/*info:InferredTypeAllocation*/new
Iterable()); } | 2404 Iterable<int> baz5() sync* { yield* (/*info:InferredTypeAllocation*/new
Iterable()); } |
2320 ''' | 2405 ''' |
2321 }); | 2406 }); |
2322 }); | 2407 }); |
2323 } | 2408 } |
OLD | NEW |