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 library world_test; | 5 library world_test; |
6 | 6 |
7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
8 import 'package:async_helper/async_helper.dart'; | 8 import 'package:async_helper/async_helper.dart'; |
9 import 'type_test_helper.dart'; | 9 import 'type_test_helper.dart'; |
10 import 'package:compiler/src/common/names.dart'; | 10 import 'package:compiler/src/common/names.dart'; |
11 import 'package:compiler/src/elements/elements.dart' | 11 import 'package:compiler/src/elements/elements.dart' |
12 show Element, ClassElement, LibraryElement; | 12 show ClassElement, LibraryElement; |
| 13 import 'package:compiler/src/elements/entities.dart'; |
13 import 'package:compiler/src/universe/class_set.dart'; | 14 import 'package:compiler/src/universe/class_set.dart'; |
14 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld; | 15 import 'package:compiler/src/world.dart' show ClassQuery, ClosedWorld; |
15 | 16 |
16 void main() { | 17 void main() { |
17 asyncTest(() async { | 18 asyncTest(() async { |
18 await testClassSets(); | 19 await testClassSets(); |
19 await testProperties(); | 20 await testProperties(); |
20 await testNativeClasses(); | 21 await testNativeClasses(); |
21 await testCommonSubclasses(); | 22 await testCommonSubclasses(); |
22 }); | 23 }); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 ClassElement Object_ = env.getElement("Object"); | 56 ClassElement Object_ = env.getElement("Object"); |
56 ClassElement A = env.getElement("A"); | 57 ClassElement A = env.getElement("A"); |
57 ClassElement B = env.getElement("B"); | 58 ClassElement B = env.getElement("B"); |
58 ClassElement C = env.getElement("C"); | 59 ClassElement C = env.getElement("C"); |
59 ClassElement D = env.getElement("D"); | 60 ClassElement D = env.getElement("D"); |
60 ClassElement E = env.getElement("E"); | 61 ClassElement E = env.getElement("E"); |
61 ClassElement F = env.getElement("F"); | 62 ClassElement F = env.getElement("F"); |
62 ClassElement G = env.getElement("G"); | 63 ClassElement G = env.getElement("G"); |
63 ClassElement X = env.getElement("X"); | 64 ClassElement X = env.getElement("X"); |
64 | 65 |
65 void checkClasses(String property, ClassElement cls, | 66 void checkClasses(String property, ClassEntity cls, |
66 Iterable<ClassElement> foundClasses, List<ClassElement> expectedClasses, | 67 Iterable<ClassEntity> foundClasses, List<ClassEntity> expectedClasses, |
67 {bool exact: true}) { | 68 {bool exact: true}) { |
68 for (ClassElement expectedClass in expectedClasses) { | 69 for (ClassEntity expectedClass in expectedClasses) { |
69 Expect.isTrue( | 70 Expect.isTrue( |
70 foundClasses.contains(expectedClass), | 71 foundClasses.contains(expectedClass), |
71 "Expect $expectedClass in '$property' on $cls. " | 72 "Expect $expectedClass in '$property' on $cls. " |
72 "Found:\n ${foundClasses.join('\n ')}\n" | 73 "Found:\n ${foundClasses.join('\n ')}\n" |
73 "${closedWorld.dump(cls)}"); | 74 "${closedWorld.dump(cls)}"); |
74 } | 75 } |
75 if (exact) { | 76 if (exact) { |
76 Expect.equals( | 77 Expect.equals( |
77 expectedClasses.length, | 78 expectedClasses.length, |
78 foundClasses.length, | 79 foundClasses.length, |
79 "Unexpected classes " | 80 "Unexpected classes " |
80 "${foundClasses.where((c) => !expectedClasses.contains(c))} " | 81 "${foundClasses.where((c) => !expectedClasses.contains(c))} " |
81 "in '$property' on $cls.\n" | 82 "in '$property' on $cls.\n" |
82 "${closedWorld.dump(cls)}"); | 83 "${closedWorld.dump(cls)}"); |
83 } | 84 } |
84 } | 85 } |
85 | 86 |
86 void check(String property, ClassElement cls, | 87 void check(String property, ClassEntity cls, |
87 Iterable<ClassElement> foundClasses, List<ClassElement> expectedClasses, | 88 Iterable<ClassEntity> foundClasses, List<ClassEntity> expectedClasses, |
88 {bool exact: true, | 89 {bool exact: true, |
89 void forEach(ClassElement cls, ForEachFunction f), | 90 void forEach(ClassEntity cls, ForEachFunction f), |
90 int getCount(ClassElement cls)}) { | 91 int getCount(ClassEntity cls)}) { |
91 checkClasses(property, cls, foundClasses, expectedClasses, exact: exact); | 92 checkClasses(property, cls, foundClasses, expectedClasses, exact: exact); |
92 | 93 |
93 if (forEach != null) { | 94 if (forEach != null) { |
94 List<ClassElement> visited = <ClassElement>[]; | 95 List<ClassEntity> visited = <ClassEntity>[]; |
95 forEach(cls, (ClassElement c) { | 96 forEach(cls, (ClassEntity c) { |
96 visited.add(c); | 97 visited.add(c); |
97 }); | 98 }); |
98 checkClasses('forEach($property)', cls, visited, expectedClasses, | 99 checkClasses('forEach($property)', cls, visited, expectedClasses, |
99 exact: exact); | 100 exact: exact); |
100 } | 101 } |
101 | 102 |
102 if (getCount != null && exact) { | 103 if (getCount != null && exact) { |
103 int count = getCount(cls); | 104 int count = getCount(cls); |
104 Expect.equals( | 105 Expect.equals( |
105 expectedClasses.length, | 106 expectedClasses.length, |
106 count, | 107 count, |
107 "Unexpected class count in '$property' on $cls.\n" | 108 "Unexpected class count in '$property' on $cls.\n" |
108 "${closedWorld.dump(cls)}"); | 109 "${closedWorld.dump(cls)}"); |
109 } | 110 } |
110 } | 111 } |
111 | 112 |
112 void testSubclasses(ClassElement cls, List<ClassElement> expectedClasses, | 113 void testSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses, |
113 {bool exact: true}) { | 114 {bool exact: true}) { |
114 check('subclassesOf', cls, closedWorld.subclassesOf(cls), expectedClasses, | 115 check('subclassesOf', cls, closedWorld.subclassesOf(cls), expectedClasses, |
115 exact: exact); | 116 exact: exact); |
116 } | 117 } |
117 | 118 |
118 void testStrictSubclasses( | 119 void testStrictSubclasses(ClassEntity cls, List<ClassEntity> expectedClasses, |
119 ClassElement cls, List<ClassElement> expectedClasses, | |
120 {bool exact: true}) { | 120 {bool exact: true}) { |
121 check('strictSubclassesOf', cls, closedWorld.strictSubclassesOf(cls), | 121 check('strictSubclassesOf', cls, closedWorld.strictSubclassesOf(cls), |
122 expectedClasses, | 122 expectedClasses, |
123 exact: exact, | 123 exact: exact, |
124 forEach: closedWorld.forEachStrictSubclassOf, | 124 forEach: closedWorld.forEachStrictSubclassOf, |
125 getCount: closedWorld.strictSubclassCount); | 125 getCount: closedWorld.strictSubclassCount); |
126 } | 126 } |
127 | 127 |
128 void testStrictSubtypes(ClassElement cls, List<ClassElement> expectedClasses, | 128 void testStrictSubtypes(ClassEntity cls, List<ClassEntity> expectedClasses, |
129 {bool exact: true}) { | 129 {bool exact: true}) { |
130 check('strictSubtypesOf', cls, closedWorld.strictSubtypesOf(cls), | 130 check('strictSubtypesOf', cls, closedWorld.strictSubtypesOf(cls), |
131 expectedClasses, | 131 expectedClasses, |
132 exact: exact, | 132 exact: exact, |
133 forEach: closedWorld.forEachStrictSubtypeOf, | 133 forEach: closedWorld.forEachStrictSubtypeOf, |
134 getCount: closedWorld.strictSubtypeCount); | 134 getCount: closedWorld.strictSubtypeCount); |
135 } | 135 } |
136 | 136 |
137 void testMixinUses(ClassElement cls, List<ClassElement> expectedClasses, | 137 void testMixinUses(ClassEntity cls, List<ClassEntity> expectedClasses, |
138 {bool exact: true}) { | 138 {bool exact: true}) { |
139 check('mixinUsesOf', cls, closedWorld.mixinUsesOf(cls), expectedClasses, | 139 check('mixinUsesOf', cls, closedWorld.mixinUsesOf(cls), expectedClasses, |
140 exact: exact); | 140 exact: exact); |
141 } | 141 } |
142 | 142 |
143 testSubclasses(Object_, [A, B, C, D, E, F, G], exact: false); | 143 testSubclasses(Object_, [A, B, C, D, E, F, G], exact: false); |
144 testSubclasses(A, [A, C]); | 144 testSubclasses(A, [A, C]); |
145 testSubclasses(B, [B, E]); | 145 testSubclasses(B, [B, E]); |
146 testSubclasses(C, [C]); | 146 testSubclasses(C, [C]); |
147 testSubclasses(D, [D]); | 147 testSubclasses(D, [D]); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 new F2(); | 236 new F2(); |
237 new G2(); | 237 new G2(); |
238 new G3(); | 238 new G3(); |
239 new H4(); | 239 new H4(); |
240 } | 240 } |
241 """, | 241 """, |
242 useMockCompiler: false); | 242 useMockCompiler: false); |
243 ClosedWorld closedWorld = env.closedWorld; | 243 ClosedWorld closedWorld = env.closedWorld; |
244 | 244 |
245 check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) { | 245 check(String name, {bool hasStrictSubtype, bool hasOnlySubclasses}) { |
246 ClassElement cls = env.getElement(name); | 246 ClassEntity cls = env.getElement(name); |
247 Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls), | 247 Expect.equals(hasStrictSubtype, closedWorld.hasAnyStrictSubtype(cls), |
248 "Unexpected hasAnyStrictSubtype property on $cls."); | 248 "Unexpected hasAnyStrictSubtype property on $cls."); |
249 Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls), | 249 Expect.equals(hasOnlySubclasses, closedWorld.hasOnlySubclasses(cls), |
250 "Unexpected hasOnlySubclasses property on $cls."); | 250 "Unexpected hasOnlySubclasses property on $cls."); |
251 } | 251 } |
252 | 252 |
253 check("Object", hasStrictSubtype: true, hasOnlySubclasses: true); | 253 check("Object", hasStrictSubtype: true, hasOnlySubclasses: true); |
254 | 254 |
255 // No instantiated Ax classes. | 255 // No instantiated Ax classes. |
256 check("A", hasStrictSubtype: false, hasOnlySubclasses: true); | 256 check("A", hasStrictSubtype: false, hasOnlySubclasses: true); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 ClassElement clsEventTarget = dart_html.findExported('EventTarget'); | 324 ClassElement clsEventTarget = dart_html.findExported('EventTarget'); |
325 ClassElement clsWindow = dart_html.findExported('Window'); | 325 ClassElement clsWindow = dart_html.findExported('Window'); |
326 ClassElement clsAbstractWorker = dart_html.findExported('AbstractWorker'); | 326 ClassElement clsAbstractWorker = dart_html.findExported('AbstractWorker'); |
327 ClassElement clsWorker = dart_html.findExported('Worker'); | 327 ClassElement clsWorker = dart_html.findExported('Worker'); |
328 ClassElement clsCanvasElement = dart_html.findExported('CanvasElement'); | 328 ClassElement clsCanvasElement = dart_html.findExported('CanvasElement'); |
329 ClassElement clsCanvasRenderingContext = | 329 ClassElement clsCanvasRenderingContext = |
330 dart_html.findExported('CanvasRenderingContext'); | 330 dart_html.findExported('CanvasRenderingContext'); |
331 ClassElement clsCanvasRenderingContext2D = | 331 ClassElement clsCanvasRenderingContext2D = |
332 dart_html.findExported('CanvasRenderingContext2D'); | 332 dart_html.findExported('CanvasRenderingContext2D'); |
333 | 333 |
334 List<ClassElement> allClasses = [ | 334 List<ClassEntity> allClasses = [ |
335 clsEventTarget, | 335 clsEventTarget, |
336 clsWindow, | 336 clsWindow, |
337 clsAbstractWorker, | 337 clsAbstractWorker, |
338 clsWorker, | 338 clsWorker, |
339 clsCanvasElement, | 339 clsCanvasElement, |
340 clsCanvasRenderingContext, | 340 clsCanvasRenderingContext, |
341 clsCanvasRenderingContext2D | 341 clsCanvasRenderingContext2D |
342 ]; | 342 ]; |
343 | 343 |
344 check(ClassElement cls, | 344 check(ClassEntity cls, |
345 {bool isDirectlyInstantiated, | 345 {bool isDirectlyInstantiated, |
346 bool isAbstractlyInstantiated, | 346 bool isAbstractlyInstantiated, |
347 bool isIndirectlyInstantiated, | 347 bool isIndirectlyInstantiated, |
348 bool hasStrictSubtype, | 348 bool hasStrictSubtype, |
349 bool hasOnlySubclasses, | 349 bool hasOnlySubclasses, |
350 ClassElement lubOfInstantiatedSubclasses, | 350 ClassEntity lubOfInstantiatedSubclasses, |
351 ClassElement lubOfInstantiatedSubtypes, | 351 ClassEntity lubOfInstantiatedSubtypes, |
352 int instantiatedSubclassCount, | 352 int instantiatedSubclassCount, |
353 int instantiatedSubtypeCount, | 353 int instantiatedSubtypeCount, |
354 List<ClassElement> subclasses: const <ClassElement>[], | 354 List<ClassEntity> subclasses: const <ClassEntity>[], |
355 List<ClassElement> subtypes: const <ClassElement>[]}) { | 355 List<ClassEntity> subtypes: const <ClassEntity>[]}) { |
356 ClassSet classSet = closedWorld.getClassSet(cls); | 356 ClassSet classSet = closedWorld.getClassSet(cls); |
357 ClassHierarchyNode node = classSet.node; | 357 ClassHierarchyNode node = classSet.node; |
358 | 358 |
359 String dumpText = '\n${closedWorld.dump(cls)}'; | 359 String dumpText = '\n${closedWorld.dump(cls)}'; |
360 | 360 |
361 Expect.equals( | 361 Expect.equals( |
362 isDirectlyInstantiated, | 362 isDirectlyInstantiated, |
363 closedWorld.isDirectlyInstantiated(cls), | 363 closedWorld.isDirectlyInstantiated(cls), |
364 "Unexpected isDirectlyInstantiated property on $cls.$dumpText"); | 364 "Unexpected isDirectlyInstantiated property on $cls.$dumpText"); |
365 Expect.equals( | 365 Expect.equals( |
(...skipping 17 matching lines...) Expand all Loading... |
383 classSet.getLubOfInstantiatedSubtypes(), | 383 classSet.getLubOfInstantiatedSubtypes(), |
384 "Unexpected getLubOfInstantiatedSubtypes() result on $cls.$dumpText"); | 384 "Unexpected getLubOfInstantiatedSubtypes() result on $cls.$dumpText"); |
385 if (instantiatedSubclassCount != null) { | 385 if (instantiatedSubclassCount != null) { |
386 Expect.equals(instantiatedSubclassCount, node.instantiatedSubclassCount, | 386 Expect.equals(instantiatedSubclassCount, node.instantiatedSubclassCount, |
387 "Unexpected instantiatedSubclassCount property on $cls.$dumpText"); | 387 "Unexpected instantiatedSubclassCount property on $cls.$dumpText"); |
388 } | 388 } |
389 if (instantiatedSubtypeCount != null) { | 389 if (instantiatedSubtypeCount != null) { |
390 Expect.equals(instantiatedSubtypeCount, classSet.instantiatedSubtypeCount, | 390 Expect.equals(instantiatedSubtypeCount, classSet.instantiatedSubtypeCount, |
391 "Unexpected instantiatedSubtypeCount property on $cls.$dumpText"); | 391 "Unexpected instantiatedSubtypeCount property on $cls.$dumpText"); |
392 } | 392 } |
393 for (ClassElement other in allClasses) { | 393 for (ClassEntity other in allClasses) { |
394 if (other == cls) continue; | 394 if (other == cls) continue; |
395 if (!closedWorld.isExplicitlyInstantiated(other)) continue; | 395 if (!closedWorld.isExplicitlyInstantiated(other)) continue; |
396 Expect.equals( | 396 Expect.equals( |
397 subclasses.contains(other), | 397 subclasses.contains(other), |
398 closedWorld.isSubclassOf(other, cls), | 398 closedWorld.isSubclassOf(other, cls), |
399 "Unexpected subclass relation between $other and $cls."); | 399 "Unexpected subclass relation between $other and $cls."); |
400 Expect.equals( | 400 Expect.equals( |
401 subtypes.contains(other), | 401 subtypes.contains(other), |
402 closedWorld.isSubtypeOf(other, cls), | 402 closedWorld.isSubtypeOf(other, cls), |
403 "Unexpected subtype relation between $other and $cls."); | 403 "Unexpected subtype relation between $other and $cls."); |
404 } | 404 } |
405 | 405 |
406 Set<ClassElement> strictSubclasses = new Set<ClassElement>(); | 406 Set<ClassEntity> strictSubclasses = new Set<ClassEntity>(); |
407 closedWorld.forEachStrictSubclassOf(cls, (ClassElement other) { | 407 closedWorld.forEachStrictSubclassOf(cls, (ClassEntity other) { |
408 if (allClasses.contains(other)) { | 408 if (allClasses.contains(other)) { |
409 strictSubclasses.add(other); | 409 strictSubclasses.add(other); |
410 } | 410 } |
411 }); | 411 }); |
412 Expect.setEquals(subclasses, strictSubclasses, | 412 Expect.setEquals(subclasses, strictSubclasses, |
413 "Unexpected strict subclasses of $cls: ${strictSubclasses}."); | 413 "Unexpected strict subclasses of $cls: ${strictSubclasses}."); |
414 | 414 |
415 Set<ClassElement> strictSubtypes = new Set<ClassElement>(); | 415 Set<ClassEntity> strictSubtypes = new Set<ClassEntity>(); |
416 closedWorld.forEachStrictSubtypeOf(cls, (ClassElement other) { | 416 closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity other) { |
417 if (allClasses.contains(other)) { | 417 if (allClasses.contains(other)) { |
418 strictSubtypes.add(other); | 418 strictSubtypes.add(other); |
419 } | 419 } |
420 }); | 420 }); |
421 Expect.setEquals(subtypes, strictSubtypes, | 421 Expect.setEquals(subtypes, strictSubtypes, |
422 "Unexpected strict subtypes of $cls: $strictSubtypes."); | 422 "Unexpected strict subtypes of $cls: $strictSubtypes."); |
423 } | 423 } |
424 | 424 |
425 // Extended by Window. | 425 // Extended by Window. |
426 check(clsEventTarget, | 426 check(clsEventTarget, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 ClassElement A = env.getElement("A"); | 545 ClassElement A = env.getElement("A"); |
546 ClassElement B = env.getElement("B"); | 546 ClassElement B = env.getElement("B"); |
547 ClassElement C = env.getElement("C"); | 547 ClassElement C = env.getElement("C"); |
548 ClassElement D = env.getElement("D"); | 548 ClassElement D = env.getElement("D"); |
549 ClassElement F = env.getElement("F"); | 549 ClassElement F = env.getElement("F"); |
550 ClassElement G = env.getElement("G"); | 550 ClassElement G = env.getElement("G"); |
551 ClassElement H = env.getElement("H"); | 551 ClassElement H = env.getElement("H"); |
552 ClassElement I = env.getElement("I"); | 552 ClassElement I = env.getElement("I"); |
553 ClassElement J = env.getElement("J"); | 553 ClassElement J = env.getElement("J"); |
554 | 554 |
555 void check(ClassElement cls1, ClassQuery query1, ClassElement cls2, | 555 void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2, |
556 ClassQuery query2, List<ClassElement> expectedResult) { | 556 ClassQuery query2, List<ClassEntity> expectedResult) { |
557 Iterable<ClassElement> result1 = | 557 Iterable<ClassEntity> result1 = |
558 closedWorld.commonSubclasses(cls1, query1, cls2, query2); | 558 closedWorld.commonSubclasses(cls1, query1, cls2, query2); |
559 Iterable<ClassElement> result2 = | 559 Iterable<ClassEntity> result2 = |
560 closedWorld.commonSubclasses(cls2, query2, cls1, query1); | 560 closedWorld.commonSubclasses(cls2, query2, cls1, query1); |
561 Expect.setEquals( | 561 Expect.setEquals( |
562 result1, | 562 result1, |
563 result2, | 563 result2, |
564 "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):" | 564 "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):" |
565 "\n a vs b: $result1\n b vs a: $result2"); | 565 "\n a vs b: $result1\n b vs a: $result2"); |
566 Expect.setEquals( | 566 Expect.setEquals( |
567 expectedResult, | 567 expectedResult, |
568 result1, | 568 result1, |
569 "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):" | 569 "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):" |
(...skipping 30 matching lines...) Expand all Loading... |
600 check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []); | 600 check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []); |
601 check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []); | 601 check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []); |
602 check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []); | 602 check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []); |
603 check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []); | 603 check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []); |
604 check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []); | 604 check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []); |
605 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []); | 605 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []); |
606 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []); | 606 check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []); |
607 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]); | 607 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]); |
608 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]); | 608 check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]); |
609 } | 609 } |
OLD | NEW |