| 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 /// General type checking tests | 5 /// General type checking tests |
| 6 library dev_compiler.test.checker_test; | 6 library dev_compiler.test.checker_test; |
| 7 | 7 |
| 8 import 'package:test/test.dart'; | 8 import 'package:test/test.dart'; |
| 9 | 9 |
| 10 import 'package:dev_compiler/src/testing.dart'; | 10 import 'package:dev_compiler/src/testing.dart'; |
| (...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 '/main.dart': ''' | 1064 '/main.dart': ''' |
| 1065 | 1065 |
| 1066 class A { | 1066 class A { |
| 1067 void bar() => null; | 1067 void bar() => null; |
| 1068 void foo() => bar; // allowed | 1068 void foo() => bar; // allowed |
| 1069 } | 1069 } |
| 1070 ''' | 1070 ''' |
| 1071 }); | 1071 }); |
| 1072 }); | 1072 }); |
| 1073 | 1073 |
| 1074 test('Generic subtyping: invariance', () { | |
| 1075 testChecker({ | |
| 1076 '/main.dart': ''' | |
| 1077 | |
| 1078 class A {} | |
| 1079 class B extends A {} | |
| 1080 class C implements A {} | |
| 1081 | |
| 1082 class L<T> {} | |
| 1083 class M<T> extends L<T> {} | |
| 1084 class N extends M<A> {} | |
| 1085 | |
| 1086 void main() { | |
| 1087 L<A> lOfAs; | |
| 1088 L<B> lOfBs; | |
| 1089 L<C> lOfCs; | |
| 1090 | |
| 1091 M<A> mOfAs; | |
| 1092 M<B> mOfBs; | |
| 1093 M<C> mOfCs; | |
| 1094 | |
| 1095 N ns; | |
| 1096 | |
| 1097 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1098 lOfAs = lOfAs; | |
| 1099 lOfAs = /*severe:StaticTypeError*/lOfBs; | |
| 1100 lOfAs = /*severe:StaticTypeError*/lOfCs; | |
| 1101 | |
| 1102 // M<S> <: L<S> | |
| 1103 lOfAs = mOfAs; | |
| 1104 lOfAs = /*severe:StaticTypeError*/mOfBs; | |
| 1105 lOfAs = /*severe:StaticTypeError*/mOfCs; | |
| 1106 | |
| 1107 // N <: L<A> | |
| 1108 lOfAs = ns; | |
| 1109 | |
| 1110 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1111 lOfBs = /*severe:StaticTypeError*/lOfAs; | |
| 1112 lOfBs = lOfBs; | |
| 1113 lOfBs = /*severe:StaticTypeError*/lOfCs; | |
| 1114 | |
| 1115 // M<S> <: L<S> | |
| 1116 lOfBs = /*severe:StaticTypeError*/mOfAs; | |
| 1117 lOfBs = mOfBs; | |
| 1118 lOfBs = /*severe:StaticTypeError*/mOfCs; | |
| 1119 | |
| 1120 // N </: L<B> | |
| 1121 lOfBs = /*severe:StaticTypeError*/ns; | |
| 1122 | |
| 1123 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1124 lOfCs = /*severe:StaticTypeError*/lOfAs; | |
| 1125 lOfCs = /*severe:StaticTypeError*/lOfBs; | |
| 1126 lOfCs = lOfCs; | |
| 1127 | |
| 1128 // M<S> <: L<S> | |
| 1129 lOfCs = /*severe:StaticTypeError*/mOfAs; | |
| 1130 lOfCs = /*severe:StaticTypeError*/mOfBs; | |
| 1131 lOfCs = mOfCs; | |
| 1132 | |
| 1133 // N </: L<C> | |
| 1134 lOfCs = /*severe:StaticTypeError*/ns; | |
| 1135 | |
| 1136 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1137 mOfAs = /*warning:DownCastComposite*/lOfAs; | |
| 1138 mOfAs = /*severe:StaticTypeError*/lOfBs; | |
| 1139 mOfAs = /*severe:StaticTypeError*/lOfCs; | |
| 1140 | |
| 1141 // M<S> <: M<S> iff S = dynamic or S=T | |
| 1142 mOfAs = mOfAs; | |
| 1143 mOfAs = /*severe:StaticTypeError*/mOfBs; | |
| 1144 mOfAs = /*severe:StaticTypeError*/mOfCs; | |
| 1145 | |
| 1146 // N <: M<A> | |
| 1147 mOfAs = ns; | |
| 1148 | |
| 1149 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1150 mOfBs = /*severe:StaticTypeError*/lOfAs; | |
| 1151 mOfBs = /*warning:DownCastComposite*/lOfBs; | |
| 1152 mOfBs = /*severe:StaticTypeError*/lOfCs; | |
| 1153 | |
| 1154 // M<S> <: M<S> iff S = dynamic or S=T | |
| 1155 mOfBs = /*severe:StaticTypeError*/mOfAs; | |
| 1156 mOfBs = mOfBs; | |
| 1157 mOfBs = /*severe:StaticTypeError*/mOfCs; | |
| 1158 | |
| 1159 // N </: M<B> | |
| 1160 mOfBs = /*severe:StaticTypeError*/ns; | |
| 1161 | |
| 1162 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1163 mOfCs = /*severe:StaticTypeError*/lOfAs; | |
| 1164 mOfCs = /*severe:StaticTypeError*/lOfBs; | |
| 1165 mOfCs = /*warning:DownCastComposite*/lOfCs; | |
| 1166 | |
| 1167 // M<S> <: M<S> iff S = dynamic or S=T | |
| 1168 mOfCs = /*severe:StaticTypeError*/mOfAs; | |
| 1169 mOfCs = /*severe:StaticTypeError*/mOfBs; | |
| 1170 mOfCs = mOfCs; | |
| 1171 | |
| 1172 // N </: L<C> | |
| 1173 mOfCs = /*severe:StaticTypeError*/ns; | |
| 1174 | |
| 1175 // Concrete subclass subtyping | |
| 1176 ns = /*warning:DownCastImplicit*/lOfAs; | |
| 1177 ns = /*severe:StaticTypeError*/lOfBs; | |
| 1178 ns = /*severe:StaticTypeError*/lOfCs; | |
| 1179 ns = /*warning:DownCastImplicit*/mOfAs; | |
| 1180 ns = /*severe:StaticTypeError*/mOfBs; | |
| 1181 ns = /*severe:StaticTypeError*/mOfCs; | |
| 1182 ns = ns; | |
| 1183 } | |
| 1184 ''' | |
| 1185 }, covariantGenerics: false, relaxedCasts: false); | |
| 1186 }); | |
| 1187 | |
| 1188 test('Generic subtyping: covariant raw types', () { | |
| 1189 testChecker({ | |
| 1190 '/main.dart': ''' | |
| 1191 | |
| 1192 class A {} | |
| 1193 class B extends A {} | |
| 1194 class C implements A {} | |
| 1195 | |
| 1196 class L<T> {} | |
| 1197 class M<T> extends L<T> {} | |
| 1198 class N extends M<A> {} | |
| 1199 | |
| 1200 void main() { | |
| 1201 L lRaw; | |
| 1202 L<dynamic> lOfDynamics; | |
| 1203 L<A> lOfAs; | |
| 1204 L<B> lOfBs; | |
| 1205 L<C> lOfCs; | |
| 1206 | |
| 1207 M mRaw; | |
| 1208 M<dynamic> mOfDynamics; | |
| 1209 M<A> mOfAs; | |
| 1210 M<B> mOfBs; | |
| 1211 M<C> mOfCs; | |
| 1212 | |
| 1213 N ns; | |
| 1214 | |
| 1215 // Raw type subtyping | |
| 1216 lRaw = lRaw; | |
| 1217 lRaw = lOfDynamics; | |
| 1218 lRaw = lOfAs; | |
| 1219 lRaw = lOfBs; | |
| 1220 lRaw = lOfCs; | |
| 1221 lRaw = mRaw; | |
| 1222 lRaw = mOfDynamics; | |
| 1223 lRaw = mOfAs; | |
| 1224 lRaw = mOfBs; | |
| 1225 lRaw = mOfCs; | |
| 1226 lRaw = ns; | |
| 1227 | |
| 1228 // L<dynamic> == L | |
| 1229 lOfDynamics = lRaw; | |
| 1230 lOfDynamics = lOfDynamics; | |
| 1231 lOfDynamics = lOfAs; | |
| 1232 lOfDynamics = lOfBs; | |
| 1233 lOfDynamics = lOfCs; | |
| 1234 lOfDynamics = mRaw; | |
| 1235 lOfDynamics = mOfDynamics; | |
| 1236 lOfDynamics = mOfAs; | |
| 1237 lOfDynamics = mOfBs; | |
| 1238 lOfDynamics = mOfCs; | |
| 1239 lOfDynamics = ns; | |
| 1240 | |
| 1241 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1242 lOfAs = /*warning:DownCastComposite*/lRaw; | |
| 1243 lOfAs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1244 | |
| 1245 // M<dynamic> </:/> L<A> | |
| 1246 lOfAs = /*severe:StaticTypeError*/mRaw; | |
| 1247 lOfAs = /*severe:StaticTypeError*/mOfDynamics; | |
| 1248 | |
| 1249 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1250 lOfBs = /*warning:DownCastComposite*/lRaw; | |
| 1251 lOfBs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1252 | |
| 1253 // M<dynamic> </:/> L<B> | |
| 1254 lOfBs = /*severe:StaticTypeError*/mRaw; | |
| 1255 lOfBs = /*severe:StaticTypeError*/mOfDynamics; | |
| 1256 | |
| 1257 // L<T> <: L<S> iff S = dynamic or S=T | |
| 1258 lOfCs = /*warning:DownCastComposite*/lRaw; | |
| 1259 lOfCs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1260 | |
| 1261 // M<dynamic> </:/> L<C> | |
| 1262 lOfCs = /*severe:StaticTypeError*/mRaw; | |
| 1263 lOfCs = /*severe:StaticTypeError*/mOfDynamics; | |
| 1264 | |
| 1265 // Raw type subtyping | |
| 1266 mRaw = /*warning:DownCastImplicit*/lRaw; | |
| 1267 mRaw = /*warning:DownCastImplicit*/lOfDynamics; | |
| 1268 mRaw = /*severe:StaticTypeError*/lOfAs; | |
| 1269 mRaw = /*severe:StaticTypeError*/lOfBs; | |
| 1270 mRaw = /*severe:StaticTypeError*/lOfCs; | |
| 1271 mRaw = mRaw; | |
| 1272 mRaw = mOfDynamics; | |
| 1273 mRaw = mOfAs; | |
| 1274 mRaw = mOfBs; | |
| 1275 mRaw = mOfCs; | |
| 1276 mRaw = ns; | |
| 1277 | |
| 1278 // M<dynamic> == M | |
| 1279 mOfDynamics = /*warning:DownCastImplicit*/lRaw; | |
| 1280 mOfDynamics = /*warning:DownCastImplicit*/lOfDynamics; | |
| 1281 mOfDynamics = /*severe:StaticTypeError*/lOfAs; | |
| 1282 mOfDynamics = /*severe:StaticTypeError*/lOfBs; | |
| 1283 mOfDynamics = /*severe:StaticTypeError*/lOfCs; | |
| 1284 mOfDynamics = mRaw; | |
| 1285 mOfDynamics = mOfDynamics; | |
| 1286 mOfDynamics = mOfAs; | |
| 1287 mOfDynamics = mOfBs; | |
| 1288 mOfDynamics = mOfCs; | |
| 1289 mOfDynamics = ns; | |
| 1290 | |
| 1291 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1292 mOfAs = /*warning:DownCastComposite*/lRaw; | |
| 1293 mOfAs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1294 | |
| 1295 // M<dynamic> </:/> M<A> | |
| 1296 mOfAs = /*warning:DownCastComposite*/mRaw; | |
| 1297 mOfAs = /*warning:DownCastComposite*/mOfDynamics; | |
| 1298 | |
| 1299 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1300 mOfBs = /*warning:DownCastComposite*/lRaw; | |
| 1301 mOfBs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1302 | |
| 1303 // M<dynamic> </:/> M<B> | |
| 1304 mOfBs = /*warning:DownCastComposite*/mRaw; | |
| 1305 mOfBs = /*warning:DownCastComposite*/mOfDynamics; | |
| 1306 | |
| 1307 // M<T> <: L<S> iff S = dynamic or S=T | |
| 1308 mOfCs = /*warning:DownCastComposite*/lRaw; | |
| 1309 mOfCs = /*warning:DownCastComposite*/lOfDynamics; | |
| 1310 | |
| 1311 // M<dynamic> </:/> M<C> | |
| 1312 mOfCs = /*warning:DownCastComposite*/mRaw; | |
| 1313 mOfCs = /*warning:DownCastComposite*/mOfDynamics; | |
| 1314 | |
| 1315 // Concrete subclass subtyping | |
| 1316 ns = /*warning:DownCastImplicit*/lRaw; | |
| 1317 ns = /*warning:DownCastImplicit*/lOfDynamics; | |
| 1318 ns = /*warning:DownCastImplicit*/mRaw; | |
| 1319 ns = /*warning:DownCastImplicit*/mOfDynamics; | |
| 1320 } | |
| 1321 ''' | |
| 1322 }, covariantGenerics: false, relaxedCasts: false); | |
| 1323 }); | |
| 1324 | |
| 1325 test('Generic subtyping: covariant raw types with multiple parameters', () { | |
| 1326 testChecker({ | |
| 1327 '/main.dart': ''' | |
| 1328 | |
| 1329 class A {} | |
| 1330 | |
| 1331 class L<S, T> {} | |
| 1332 class M<S, T> extends L<S, T> {} | |
| 1333 | |
| 1334 void main() { | |
| 1335 L lRaw; | |
| 1336 /*pass should be severe:StaticTypeError*/L<dynamic> lOfD_; | |
| 1337 /*pass should be severe:StaticTypeError*/L<A> lOfA_; | |
| 1338 L<dynamic, A> lOfDA; | |
| 1339 L<A, dynamic> lOfAD; | |
| 1340 L<dynamic, dynamic> lOfDD; | |
| 1341 L<A, A> lOfAA; | |
| 1342 | |
| 1343 // This is the currently implemented lattice. | |
| 1344 // We may wish to change this to a flat lattice with | |
| 1345 // L<dynamic, dynamic> as the top element | |
| 1346 // | |
| 1347 // L<dynamic, dynamic> | |
| 1348 // / \ | |
| 1349 // L<dynamic, A> L<A, dynamic> | |
| 1350 // \ / | |
| 1351 // L<A, A> | |
| 1352 | |
| 1353 // L == L<dynamic, dynamic> | |
| 1354 lRaw = lRaw; | |
| 1355 lRaw = lOfD_; | |
| 1356 lRaw = lOfA_; | |
| 1357 lRaw = lOfDA; | |
| 1358 lRaw = lOfAD; | |
| 1359 lRaw = lOfDD; | |
| 1360 lRaw = lOfAA; | |
| 1361 | |
| 1362 // L<dynamic> == L<dynamic, dynamic> | |
| 1363 lOfD_ = lRaw; | |
| 1364 lOfD_ = lOfD_; | |
| 1365 lOfD_ = lOfA_; | |
| 1366 lOfD_ = lOfDA; | |
| 1367 lOfD_ = lOfAD; | |
| 1368 lOfD_ = lOfDD; | |
| 1369 lOfD_ = lOfAA; | |
| 1370 | |
| 1371 // L<dynamic, dynamic> | |
| 1372 lOfDD = lRaw; | |
| 1373 lOfDD = lOfD_; | |
| 1374 lOfDD = lOfA_; | |
| 1375 lOfDD = lOfDA; | |
| 1376 lOfDD = lOfAD; | |
| 1377 lOfDD = lOfDD; | |
| 1378 lOfDD = lOfAA; | |
| 1379 | |
| 1380 // L<dynamic, A> | |
| 1381 lOfDA = /*warning:DownCastComposite*/lRaw; | |
| 1382 lOfDA = /*warning:DownCastComposite*/lOfD_; | |
| 1383 lOfDA = /*warning:DownCastComposite*/lOfA_; | |
| 1384 lOfDA = lOfDA; | |
| 1385 lOfDA = /*severe:StaticTypeError*/lOfAD; | |
| 1386 lOfDA = /*warning:DownCastComposite*/lOfDD; | |
| 1387 lOfDA = lOfAA; | |
| 1388 | |
| 1389 // L<A, dynamic> | |
| 1390 lOfAD = /*warning:DownCastComposite*/lRaw; | |
| 1391 lOfAD = /*warning:DownCastComposite*/lOfD_; | |
| 1392 lOfAD = /*warning:DownCastComposite*/lOfA_; | |
| 1393 lOfAD = /*severe:StaticTypeError*/lOfDA; | |
| 1394 lOfAD = lOfAD; | |
| 1395 lOfAD = /*warning:DownCastComposite*/lOfDD; | |
| 1396 lOfAD = lOfAA; | |
| 1397 | |
| 1398 // L<A> == L<dynamic, dynamic> | |
| 1399 lOfA_ = lRaw; | |
| 1400 lOfA_ = lOfD_; | |
| 1401 lOfA_ = lOfA_; | |
| 1402 lOfA_ = lOfDA; | |
| 1403 lOfA_ = lOfAD; | |
| 1404 lOfA_ = lOfDD; | |
| 1405 lOfA_ = lOfAA; | |
| 1406 | |
| 1407 // L<A, A> | |
| 1408 lOfAA = /*warning:DownCastComposite*/lRaw; | |
| 1409 lOfAA = /*warning:DownCastComposite*/lOfD_; | |
| 1410 lOfAA = /*warning:DownCastComposite*/lOfA_; | |
| 1411 lOfAA = /*warning:DownCastComposite*/lOfDA; | |
| 1412 lOfAA = /*warning:DownCastComposite*/lOfAD; | |
| 1413 lOfAA = /*warning:DownCastComposite*/lOfDD; | |
| 1414 lOfAA = lOfAA; | |
| 1415 } | |
| 1416 ''' | |
| 1417 }, covariantGenerics: false, relaxedCasts: false); | |
| 1418 }); | |
| 1419 | |
| 1420 test('Covariant generic subtyping: invariance', () { | 1074 test('Covariant generic subtyping: invariance', () { |
| 1421 testChecker({ | 1075 testChecker({ |
| 1422 '/main.dart': ''' | 1076 '/main.dart': ''' |
| 1423 | 1077 |
| 1424 class A {} | 1078 class A {} |
| 1425 class B extends A {} | 1079 class B extends A {} |
| 1426 class C implements A {} | 1080 class C implements A {} |
| 1427 | 1081 |
| 1428 class L<T> {} | 1082 class L<T> {} |
| 1429 class M<T> extends L<T> {} | 1083 class M<T> extends L<T> {} |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 // Concrete subclass subtyping | 1175 // Concrete subclass subtyping |
| 1522 ns = /*warning:DownCastImplicit*/lOfAs; | 1176 ns = /*warning:DownCastImplicit*/lOfAs; |
| 1523 ns = /*severe:StaticTypeError*/lOfBs; | 1177 ns = /*severe:StaticTypeError*/lOfBs; |
| 1524 ns = /*severe:StaticTypeError*/lOfCs; | 1178 ns = /*severe:StaticTypeError*/lOfCs; |
| 1525 ns = /*warning:DownCastImplicit*/mOfAs; | 1179 ns = /*warning:DownCastImplicit*/mOfAs; |
| 1526 ns = /*severe:StaticTypeError*/mOfBs; | 1180 ns = /*severe:StaticTypeError*/mOfBs; |
| 1527 ns = /*severe:StaticTypeError*/mOfCs; | 1181 ns = /*severe:StaticTypeError*/mOfCs; |
| 1528 ns = ns; | 1182 ns = ns; |
| 1529 } | 1183 } |
| 1530 ''' | 1184 ''' |
| 1531 }, covariantGenerics: true, relaxedCasts: false); | 1185 }, relaxedCasts: false); |
| 1532 }); | 1186 }); |
| 1533 | 1187 |
| 1534 test('Relaxed casts', () { | 1188 test('Relaxed casts', () { |
| 1535 testChecker({ | 1189 testChecker({ |
| 1536 '/main.dart': ''' | 1190 '/main.dart': ''' |
| 1537 | 1191 |
| 1538 class A {} | 1192 class A {} |
| 1539 | 1193 |
| 1540 class L<T> {} | 1194 class L<T> {} |
| 1541 class M<T> extends L<T> {} | 1195 class M<T> extends L<T> {} |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1601 mOfAs = /*warning:DownCastComposite*/mOfDs; | 1255 mOfAs = /*warning:DownCastComposite*/mOfDs; |
| 1602 mOfAs = /*warning:DownCastComposite*/mOfOs; | 1256 mOfAs = /*warning:DownCastComposite*/mOfOs; |
| 1603 mOfAs = mOfAs; | 1257 mOfAs = mOfAs; |
| 1604 mOfAs = /*warning:DownCastComposite*/lOfDs; | 1258 mOfAs = /*warning:DownCastComposite*/lOfDs; |
| 1605 mOfAs = /*warning:DownCastComposite*/lOfOs; | 1259 mOfAs = /*warning:DownCastComposite*/lOfOs; |
| 1606 mOfAs = /*warning:DownCastComposite*/lOfAs; | 1260 mOfAs = /*warning:DownCastComposite*/lOfAs; |
| 1607 } | 1261 } |
| 1608 | 1262 |
| 1609 } | 1263 } |
| 1610 ''' | 1264 ''' |
| 1611 }, covariantGenerics: true, relaxedCasts: true); | 1265 }, relaxedCasts: true); |
| 1612 }); | 1266 }); |
| 1613 | 1267 |
| 1614 test('Subtyping literals', () { | 1268 test('Subtyping literals', () { |
| 1615 testChecker({ | 1269 testChecker({ |
| 1616 '/main.dart': ''' | 1270 '/main.dart': ''' |
| 1617 test() { | 1271 test() { |
| 1618 Iterable i1 = [1, 2, 3]; | 1272 Iterable i1 = [1, 2, 3]; |
| 1619 i1 = <int>[1, 2, 3]; | 1273 i1 = <int>[1, 2, 3]; |
| 1620 | 1274 |
| 1621 List l1 = [1, 2, 3]; | 1275 List l1 = [1, 2, 3]; |
| (...skipping 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3009 '/main.dart': ''' | 2663 '/main.dart': ''' |
| 3010 import 'dart:foobar' show Baz; | 2664 import 'dart:foobar' show Baz; |
| 3011 main() { | 2665 main() { |
| 3012 print(Baz.quux); | 2666 print(Baz.quux); |
| 3013 }''' | 2667 }''' |
| 3014 }, | 2668 }, |
| 3015 customUrlMappings: { | 2669 customUrlMappings: { |
| 3016 'dart:foobar': '$testDirectory/checker/dart_foobar.dart' | 2670 'dart:foobar': '$testDirectory/checker/dart_foobar.dart' |
| 3017 })); | 2671 })); |
| 3018 } | 2672 } |
| OLD | NEW |