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

Side by Side Diff: pkg/analyzer/test/src/task/strong/checker_test.dart

Issue 1430953004: Check field overrides (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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) 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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698