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

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: fix typo 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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/task/strong/info.dart ('k') | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698