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 |
1143 testChecker('getter/getter override', { | 1150 testChecker('getter/getter override', { |
1144 '/main.dart': ''' | 1151 '/main.dart': ''' |
(...skipping 24 matching lines...) Expand all Loading... |
1169 class C extends B {} | 1176 class C extends B {} |
1170 | 1177 |
1171 abstract class Base { | 1178 abstract class Base { |
1172 B f1; | 1179 B f1; |
1173 B f2; | 1180 B f2; |
1174 B f3; | 1181 B f3; |
1175 B f4; | 1182 B f4; |
1176 } | 1183 } |
1177 | 1184 |
1178 class Child extends Base { | 1185 class Child extends Base { |
| 1186 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/A get f1
=> null; |
| 1187 /*severe:InvalidFieldOverride*/C get f2 => null; |
| 1188 /*severe:InvalidFieldOverride*/get f3 => null; |
| 1189 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/dynamic
get f4 => null; |
| 1190 } |
| 1191 |
| 1192 class Child2 implements Base { |
1179 /*severe:InvalidMethodOverride*/A get f1 => null; | 1193 /*severe:InvalidMethodOverride*/A get f1 => null; |
1180 C get f2 => null; | 1194 C get f2 => null; |
1181 get f3 => null; | 1195 get f3 => null; |
1182 /*severe:InvalidMethodOverride*/dynamic get f4 => null; | 1196 /*severe:InvalidMethodOverride*/dynamic get f4 => null; |
1183 } | 1197 } |
1184 ''' | 1198 ''' |
1185 }); | 1199 }); |
1186 | 1200 |
1187 testChecker('setter/setter override', { | 1201 testChecker('setter/setter override', { |
1188 '/main.dart': ''' | 1202 '/main.dart': ''' |
(...skipping 27 matching lines...) Expand all Loading... |
1216 | 1230 |
1217 class Base { | 1231 class Base { |
1218 B f1; | 1232 B f1; |
1219 B f2; | 1233 B f2; |
1220 B f3; | 1234 B f3; |
1221 B f4; | 1235 B f4; |
1222 B f5; | 1236 B f5; |
1223 } | 1237 } |
1224 | 1238 |
1225 class Child extends Base { | 1239 class Child extends Base { |
| 1240 /*severe:InvalidFieldOverride*/B get f1 => null; |
| 1241 /*severe:InvalidFieldOverride*/B get f2 => null; |
| 1242 /*severe:InvalidFieldOverride*/B get f3 => null; |
| 1243 /*severe:InvalidFieldOverride*/B get f4 => null; |
| 1244 /*severe:InvalidFieldOverride*/B get f5 => null; |
| 1245 |
| 1246 /*severe:InvalidFieldOverride*/void set f1(A value) {} |
| 1247 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/void set
f2(C value) {} |
| 1248 /*severe:InvalidFieldOverride*/void set f3(value) {} |
| 1249 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/void set
f4(dynamic value) {} |
| 1250 /*severe:InvalidFieldOverride*/set f5(B value) {} |
| 1251 } |
| 1252 |
| 1253 class Child2 implements Base { |
1226 B get f1 => null; | 1254 B get f1 => null; |
1227 B get f2 => null; | 1255 B get f2 => null; |
1228 B get f3 => null; | 1256 B get f3 => null; |
1229 B get f4 => null; | 1257 B get f4 => null; |
1230 B get f5 => null; | 1258 B get f5 => null; |
1231 | 1259 |
1232 void set f1(A value) {} | 1260 void set f1(A value) {} |
1233 /*severe:InvalidMethodOverride*/void set f2(C value) {} | 1261 /*severe:InvalidMethodOverride*/void set f2(C value) {} |
1234 void set f3(value) {} | 1262 void set f3(value) {} |
1235 /*severe:InvalidMethodOverride*/void set f4(dynamic value) {} | 1263 /*severe:InvalidMethodOverride*/void set f4(dynamic value) {} |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1501 testChecker('child override', { | 1529 testChecker('child override', { |
1502 '/main.dart': ''' | 1530 '/main.dart': ''' |
1503 class A {} | 1531 class A {} |
1504 class B {} | 1532 class B {} |
1505 | 1533 |
1506 class Base { | 1534 class Base { |
1507 A f; | 1535 A f; |
1508 } | 1536 } |
1509 | 1537 |
1510 class T1 extends Base { | 1538 class T1 extends Base { |
| 1539 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/B get
f => null; |
| 1540 } |
| 1541 |
| 1542 class T2 extends Base { |
| 1543 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/set f(
B b) => null; |
| 1544 } |
| 1545 |
| 1546 class T3 extends Base { |
| 1547 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride*/final
B f; |
| 1548 } |
| 1549 class T4 extends Base { |
| 1550 // two: one for the getter one for the setter. |
| 1551 /*severe:InvalidFieldOverride,severe:InvalidMethodOverride,severe:
InvalidMethodOverride*/B f; |
| 1552 } |
| 1553 |
| 1554 class T5 implements Base { |
1511 /*severe:InvalidMethodOverride*/B get f => null; | 1555 /*severe:InvalidMethodOverride*/B get f => null; |
1512 } | 1556 } |
1513 | 1557 |
1514 class T2 extends Base { | 1558 class T6 implements Base { |
1515 /*severe:InvalidMethodOverride*/set f(B b) => null; | 1559 /*severe:InvalidMethodOverride*/set f(B b) => null; |
1516 } | 1560 } |
1517 | 1561 |
1518 class T3 extends Base { | 1562 class T7 implements Base { |
1519 /*severe:InvalidMethodOverride*/final B f; | 1563 /*severe:InvalidMethodOverride*/final B f; |
1520 } | 1564 } |
1521 class T4 extends Base { | 1565 class T8 implements Base { |
1522 // two: one for the getter one for the setter. | 1566 // two: one for the getter one for the setter. |
1523 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/B f; | 1567 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/B f; |
1524 } | 1568 } |
1525 ''' | 1569 ''' |
1526 }); | 1570 }); |
1527 | 1571 |
1528 testChecker('child override 2', { | 1572 testChecker('child override 2', { |
1529 '/main.dart': ''' | 1573 '/main.dart': ''' |
1530 class A {} | 1574 class A {} |
1531 class B {} | 1575 class B {} |
1532 | 1576 |
1533 class Base { | 1577 class Base { |
1534 m(A a) {} | 1578 m(A a) {} |
1535 } | 1579 } |
1536 | 1580 |
1537 class Test extends Base { | 1581 class Test extends Base { |
1538 /*severe:InvalidMethodOverride*/m(B a) {} | 1582 /*severe:InvalidMethodOverride*/m(B a) {} |
1539 } | 1583 } |
1540 ''' | 1584 ''' |
1541 }); | 1585 }); |
1542 testChecker('grandchild override', { | 1586 testChecker('grandchild override', { |
1543 '/main.dart': ''' | 1587 '/main.dart': ''' |
1544 class A {} | 1588 class A {} |
1545 class B {} | 1589 class B {} |
1546 | 1590 |
1547 class Grandparent { | 1591 class Grandparent { |
1548 m(A a) {} | 1592 m(A a) {} |
| 1593 int x; |
1549 } | 1594 } |
1550 class Parent extends Grandparent { | 1595 class Parent extends Grandparent { |
1551 } | 1596 } |
1552 | 1597 |
1553 class Test extends Parent { | 1598 class Test extends Parent { |
1554 /*severe:InvalidMethodOverride*/m(B a) {} | 1599 /*severe:InvalidMethodOverride*/m(B a) {} |
| 1600 /*severe:InvalidFieldOverride*/int x; |
1555 } | 1601 } |
1556 ''' | 1602 ''' |
1557 }); | 1603 }); |
1558 | 1604 |
1559 testChecker('double override', { | 1605 testChecker('double override', { |
1560 '/main.dart': ''' | 1606 '/main.dart': ''' |
1561 class A {} | 1607 class A {} |
1562 class B {} | 1608 class B {} |
1563 | 1609 |
1564 class Grandparent { | 1610 class Grandparent { |
(...skipping 28 matching lines...) Expand all Loading... |
1593 ''' | 1639 ''' |
1594 }); | 1640 }); |
1595 | 1641 |
1596 testChecker('mixin override to base', { | 1642 testChecker('mixin override to base', { |
1597 '/main.dart': ''' | 1643 '/main.dart': ''' |
1598 class A {} | 1644 class A {} |
1599 class B {} | 1645 class B {} |
1600 | 1646 |
1601 class Base { | 1647 class Base { |
1602 m(A a) {} | 1648 m(A a) {} |
| 1649 int x; |
1603 } | 1650 } |
1604 | 1651 |
1605 class M1 { | 1652 class M1 { |
1606 m(B a) {} | 1653 m(B a) {} |
1607 } | 1654 } |
1608 | 1655 |
1609 class M2 {} | 1656 class M2 { |
| 1657 int x; |
| 1658 } |
1610 | 1659 |
1611 class T1 extends Base with /*severe:InvalidMethodOverride*/M1 {} | 1660 class T1 extends Base with /*severe:InvalidMethodOverride*/M1 {} |
1612 class T2 extends Base with /*severe:InvalidMethodOverride*/M1, M2 {} | 1661 class T2 extends Base with /*severe:InvalidMethodOverride*/M1, /*sev
ere:InvalidFieldOverride*/M2 {} |
1613 class T3 extends Base with M2, /*severe:InvalidMethodOverride*/M1 {} | 1662 class T3 extends Base with /*severe:InvalidFieldOverride*/M2, /*seve
re:InvalidMethodOverride*/M1 {} |
1614 ''' | 1663 ''' |
1615 }); | 1664 }); |
1616 | 1665 |
1617 testChecker('mixin override to mixin', { | 1666 testChecker('mixin override to mixin', { |
1618 '/main.dart': ''' | 1667 '/main.dart': ''' |
1619 class A {} | 1668 class A {} |
1620 class B {} | 1669 class B {} |
1621 | 1670 |
1622 class Base { | 1671 class Base { |
1623 } | 1672 } |
1624 | 1673 |
1625 class M1 { | 1674 class M1 { |
1626 m(B a) {} | 1675 m(B a) {} |
| 1676 int x; |
1627 } | 1677 } |
1628 | 1678 |
1629 class M2 { | 1679 class M2 { |
1630 m(A a) {} | 1680 m(A a) {} |
| 1681 int x; |
1631 } | 1682 } |
1632 | 1683 |
1633 class T1 extends Base with M1, /*severe:InvalidMethodOverride*/M2 {} | 1684 class T1 extends Base with M1, /*severe:InvalidMethodOverride,severe
:InvalidFieldOverride*/M2 {} |
1634 ''' | 1685 ''' |
1635 }); | 1686 }); |
1636 | 1687 |
1637 // This is a regression test for a bug in an earlier implementation were | 1688 // 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, | 1689 // names were hiding errors if the first mixin override looked correct, |
1639 // but subsequent ones did not. | 1690 // but subsequent ones did not. |
1640 testChecker('no duplicate mixin override', { | 1691 testChecker('no duplicate mixin override', { |
1641 '/main.dart': ''' | 1692 '/main.dart': ''' |
1642 class A {} | 1693 class A {} |
1643 class B {} | 1694 class B {} |
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2314 | 2365 |
2315 baz1() sync* { yield* (/*info:DynamicCast*/x); } | 2366 baz1() sync* { yield* (/*info:DynamicCast*/x); } |
2316 Iterable baz2() sync* { yield* (/*info:DynamicCast*/x); } | 2367 Iterable baz2() sync* { yield* (/*info:DynamicCast*/x); } |
2317 Iterable<int> baz3() sync* { yield* (/*warning:DownCastComposite*/x); } | 2368 Iterable<int> baz3() sync* { yield* (/*warning:DownCastComposite*/x); } |
2318 Iterable<int> baz4() sync* { yield* new Iterable<int>(); } | 2369 Iterable<int> baz4() sync* { yield* new Iterable<int>(); } |
2319 Iterable<int> baz5() sync* { yield* (/*info:InferredTypeAllocation*/new
Iterable()); } | 2370 Iterable<int> baz5() sync* { yield* (/*info:InferredTypeAllocation*/new
Iterable()); } |
2320 ''' | 2371 ''' |
2321 }); | 2372 }); |
2322 }); | 2373 }); |
2323 } | 2374 } |
OLD | NEW |