OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 import 'dart:async'; | |
6 import 'package:async_helper/async_helper.dart'; | |
7 import 'package:expect/expect.dart'; | |
8 import 'package:compiler/src/common.dart'; | |
9 import 'package:compiler/src/elements/elements.dart' | |
10 show Element, ClassElement, PublicName; | |
11 import 'package:compiler/src/universe/call_structure.dart'; | |
12 import 'package:compiler/src/universe/selector.dart'; | |
13 import 'package:compiler/src/world.dart' show ClosedWorld, ClassMask; | |
14 import 'type_test_helper.dart'; | |
15 | |
16 void main() { | |
17 asyncTest(() async { | |
18 await testClassSets(); | |
19 }); | |
20 } | |
21 | |
22 const String CLASSES = r""" | |
23 class Superclass { | |
24 foo() {} | |
25 } | |
26 class Subclass extends Superclass { | |
27 bar() {} | |
28 } | |
29 class Subtype implements Superclass { | |
30 bar() {} | |
31 } | |
32 """; | |
33 | |
34 testClassSets() async { | |
35 Selector foo, bar, baz; | |
36 ClosedWorld closedWorld; | |
37 ClassElement Superclass, Subclass, Subtype; | |
Siggi Cherem (dart-lang)
2016/10/14 16:49:57
nit: I'm torn on this, I think I'm leaning towards
Johnni Winther
2016/10/17 07:57:40
Done.
| |
38 | |
39 Future run(List<String> instantiated) async { | |
40 StringBuffer main = new StringBuffer(); | |
41 main.write('main() {'); | |
42 for (String cls in instantiated) { | |
43 main.write('new $cls();'); | |
44 } | |
45 main.write('}'); | |
46 | |
47 var env = await TypeEnvironment.create(CLASSES, | |
48 mainSource: main.toString(), useMockCompiler: false); | |
49 foo = new Selector.call(const PublicName('foo'), CallStructure.NO_ARGS); | |
50 bar = new Selector.call(const PublicName('bar'), CallStructure.NO_ARGS); | |
51 baz = new Selector.call(const PublicName('baz'), CallStructure.NO_ARGS); | |
52 | |
53 closedWorld = env.compiler.closedWorld; | |
54 Superclass = env.getElement('Superclass'); | |
55 Subclass = env.getElement('Subclass'); | |
56 Subtype = env.getElement('Subtype'); | |
57 } | |
58 | |
59 void check(ClassElement cls, ClassMask mask, Selector selector, | |
60 bool expectedResult) { | |
61 bool result = closedWorld.needsNoSuchMethod(cls, selector, mask); | |
62 Expect.equals(expectedResult, result, | |
63 'Unexpected result for $selector in $cls ($mask)'); | |
64 } | |
65 | |
66 await run([]); | |
67 | |
68 Expect.isFalse(closedWorld.isDirectlyInstantiated(Superclass)); | |
69 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Superclass)); | |
70 Expect.isFalse(closedWorld.isImplemented(Superclass)); | |
71 | |
72 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subclass)); | |
73 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subclass)); | |
74 Expect.isFalse(closedWorld.isImplemented(Subclass)); | |
75 | |
76 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subtype)); | |
77 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subtype)); | |
78 Expect.isFalse(closedWorld.isImplemented(Subtype)); | |
79 | |
80 check(Superclass, ClassMask.EXACT, foo, false); | |
81 check(Superclass, ClassMask.EXACT, bar, false); | |
82 check(Superclass, ClassMask.EXACT, baz, false); | |
83 check(Superclass, ClassMask.SUBCLASS, foo, false); | |
84 check(Superclass, ClassMask.SUBCLASS, bar, false); | |
85 check(Superclass, ClassMask.SUBCLASS, baz, false); | |
86 check(Superclass, ClassMask.SUBTYPE, foo, false); | |
87 check(Superclass, ClassMask.SUBTYPE, bar, false); | |
88 check(Superclass, ClassMask.SUBTYPE, baz, false); | |
89 | |
90 check(Subclass, ClassMask.EXACT, foo, false); | |
91 check(Subclass, ClassMask.EXACT, bar, false); | |
92 check(Subclass, ClassMask.EXACT, baz, false); | |
93 check(Subclass, ClassMask.SUBCLASS, foo, false); | |
94 check(Subclass, ClassMask.SUBCLASS, bar, false); | |
95 check(Subclass, ClassMask.SUBCLASS, baz, false); | |
96 check(Subclass, ClassMask.SUBTYPE, foo, false); | |
97 check(Subclass, ClassMask.SUBTYPE, bar, false); | |
98 check(Subclass, ClassMask.SUBTYPE, baz, false); | |
99 | |
100 check(Subtype, ClassMask.EXACT, foo, false); | |
101 check(Subtype, ClassMask.EXACT, bar, false); | |
102 check(Subtype, ClassMask.EXACT, baz, false); | |
103 check(Subtype, ClassMask.SUBCLASS, foo, false); | |
104 check(Subtype, ClassMask.SUBCLASS, bar, false); | |
105 check(Subtype, ClassMask.SUBCLASS, baz, false); | |
106 check(Subtype, ClassMask.SUBTYPE, foo, false); | |
107 check(Subtype, ClassMask.SUBTYPE, bar, false); | |
108 check(Subtype, ClassMask.SUBTYPE, baz, false); | |
109 | |
110 await run(['Superclass']); | |
111 | |
112 Expect.isTrue(closedWorld.isDirectlyInstantiated(Superclass)); | |
113 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Superclass)); | |
114 Expect.isTrue(closedWorld.isImplemented(Superclass)); | |
115 | |
116 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subclass)); | |
117 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subclass)); | |
118 Expect.isFalse(closedWorld.isImplemented(Subclass)); | |
119 | |
120 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subtype)); | |
121 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subtype)); | |
122 Expect.isFalse(closedWorld.isImplemented(Subtype)); | |
123 | |
124 check(Superclass, ClassMask.EXACT, foo, false); | |
125 check(Superclass, ClassMask.EXACT, bar, true); | |
126 check(Superclass, ClassMask.EXACT, baz, true); | |
127 check(Superclass, ClassMask.SUBCLASS, foo, false); | |
128 check(Superclass, ClassMask.SUBCLASS, bar, true); | |
129 check(Superclass, ClassMask.SUBCLASS, baz, true); | |
130 check(Superclass, ClassMask.SUBTYPE, foo, false); | |
131 check(Superclass, ClassMask.SUBTYPE, bar, true); | |
132 check(Superclass, ClassMask.SUBTYPE, baz, true); | |
133 | |
134 check(Subclass, ClassMask.EXACT, foo, false); | |
135 check(Subclass, ClassMask.EXACT, bar, false); | |
136 check(Subclass, ClassMask.EXACT, baz, false); | |
137 check(Subclass, ClassMask.SUBCLASS, foo, false); | |
138 check(Subclass, ClassMask.SUBCLASS, bar, false); | |
139 check(Subclass, ClassMask.SUBCLASS, baz, false); | |
140 check(Subclass, ClassMask.SUBTYPE, foo, false); | |
141 check(Subclass, ClassMask.SUBTYPE, bar, false); | |
142 check(Subclass, ClassMask.SUBTYPE, baz, false); | |
143 | |
144 check(Subtype, ClassMask.EXACT, foo, false); | |
145 check(Subtype, ClassMask.EXACT, bar, false); | |
146 check(Subtype, ClassMask.EXACT, baz, false); | |
147 check(Subtype, ClassMask.SUBCLASS, foo, false); | |
148 check(Subtype, ClassMask.SUBCLASS, bar, false); | |
149 check(Subtype, ClassMask.SUBCLASS, baz, false); | |
150 check(Subtype, ClassMask.SUBTYPE, foo, false); | |
151 check(Subtype, ClassMask.SUBTYPE, bar, false); | |
152 check(Subtype, ClassMask.SUBTYPE, baz, false); | |
153 | |
154 await run(['Subclass']); | |
155 | |
156 Expect.isFalse(closedWorld.isDirectlyInstantiated(Superclass)); | |
157 Expect.isTrue(closedWorld.isIndirectlyInstantiated(Superclass)); | |
158 Expect.isTrue(closedWorld.isImplemented(Superclass)); | |
159 | |
160 Expect.isTrue(closedWorld.isDirectlyInstantiated(Subclass)); | |
161 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subclass)); | |
162 Expect.isTrue(closedWorld.isImplemented(Subclass)); | |
163 | |
164 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subtype)); | |
165 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subtype)); | |
166 Expect.isFalse(closedWorld.isImplemented(Subtype)); | |
167 | |
168 check(Superclass, ClassMask.EXACT, foo, false); | |
169 // Should be false since the class is not directly instantiated: | |
170 check(Superclass, ClassMask.EXACT, bar, true); | |
171 // Should be false since the class is not directly instantiated: | |
172 check(Superclass, ClassMask.EXACT, baz, true); | |
173 check(Superclass, ClassMask.SUBCLASS, foo, false); | |
174 // Should be false since all live subclasses have a concrete implementation: | |
175 check(Superclass, ClassMask.SUBCLASS, bar, true); | |
176 check(Superclass, ClassMask.SUBCLASS, baz, true); | |
177 check(Superclass, ClassMask.SUBTYPE, foo, false); | |
178 // Should be false since all live subtypes have a concrete implementation: | |
179 check(Superclass, ClassMask.SUBTYPE, bar, true); | |
180 check(Superclass, ClassMask.SUBTYPE, baz, true); | |
181 | |
182 check(Subclass, ClassMask.EXACT, foo, false); | |
183 check(Subclass, ClassMask.EXACT, bar, false); | |
184 check(Subclass, ClassMask.EXACT, baz, true); | |
185 check(Subclass, ClassMask.SUBCLASS, foo, false); | |
186 check(Subclass, ClassMask.SUBCLASS, bar, false); | |
187 check(Subclass, ClassMask.SUBCLASS, baz, true); | |
188 check(Subclass, ClassMask.SUBTYPE, foo, false); | |
189 check(Subclass, ClassMask.SUBTYPE, bar, false); | |
190 check(Subclass, ClassMask.SUBTYPE, baz, true); | |
191 | |
192 check(Subtype, ClassMask.EXACT, foo, false); | |
193 check(Subtype, ClassMask.EXACT, bar, false); | |
194 check(Subtype, ClassMask.EXACT, baz, false); | |
195 check(Subtype, ClassMask.SUBCLASS, foo, false); | |
196 check(Subtype, ClassMask.SUBCLASS, bar, false); | |
197 check(Subtype, ClassMask.SUBCLASS, baz, false); | |
198 check(Subtype, ClassMask.SUBTYPE, foo, false); | |
199 check(Subtype, ClassMask.SUBTYPE, bar, false); | |
200 check(Subtype, ClassMask.SUBTYPE, baz, false); | |
201 | |
202 await run(['Subtype']); | |
203 | |
204 Expect.isFalse(closedWorld.isDirectlyInstantiated(Superclass)); | |
205 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Superclass)); | |
206 Expect.isTrue(closedWorld.isImplemented(Superclass)); | |
207 | |
208 Expect.isFalse(closedWorld.isDirectlyInstantiated(Subclass)); | |
209 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subclass)); | |
210 Expect.isFalse(closedWorld.isImplemented(Subclass)); | |
211 | |
212 Expect.isTrue(closedWorld.isDirectlyInstantiated(Subtype)); | |
213 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subtype)); | |
214 Expect.isTrue(closedWorld.isImplemented(Subtype)); | |
215 | |
216 check(Superclass, ClassMask.EXACT, foo, false); | |
217 check(Superclass, ClassMask.EXACT, bar, false); | |
218 check(Superclass, ClassMask.EXACT, baz, false); | |
219 check(Superclass, ClassMask.SUBCLASS, foo, false); | |
220 check(Superclass, ClassMask.SUBCLASS, bar, false); | |
221 check(Superclass, ClassMask.SUBCLASS, baz, false); | |
222 check(Superclass, ClassMask.SUBTYPE, foo, true); | |
223 check(Superclass, ClassMask.SUBTYPE, bar, false); | |
224 check(Superclass, ClassMask.SUBTYPE, baz, true); | |
225 | |
226 check(Subclass, ClassMask.EXACT, foo, false); | |
227 check(Subclass, ClassMask.EXACT, bar, false); | |
228 check(Subclass, ClassMask.EXACT, baz, false); | |
229 check(Subclass, ClassMask.SUBCLASS, foo, false); | |
230 check(Subclass, ClassMask.SUBCLASS, bar, false); | |
231 check(Subclass, ClassMask.SUBCLASS, baz, false); | |
232 check(Subclass, ClassMask.SUBTYPE, foo, false); | |
233 check(Subclass, ClassMask.SUBTYPE, bar, false); | |
234 check(Subclass, ClassMask.SUBTYPE, baz, false); | |
235 | |
236 check(Subtype, ClassMask.EXACT, foo, true); | |
237 check(Subtype, ClassMask.EXACT, bar, false); | |
238 check(Subtype, ClassMask.EXACT, baz, true); | |
239 check(Subtype, ClassMask.SUBCLASS, foo, true); | |
240 check(Subtype, ClassMask.SUBCLASS, bar, false); | |
241 check(Subtype, ClassMask.SUBCLASS, baz, true); | |
242 check(Subtype, ClassMask.SUBTYPE, foo, true); | |
243 check(Subtype, ClassMask.SUBTYPE, bar, false); | |
244 check(Subtype, ClassMask.SUBTYPE, baz, true); | |
245 | |
246 await run(['Subclass', 'Subtype']); | |
247 | |
248 Expect.isFalse(closedWorld.isDirectlyInstantiated(Superclass)); | |
249 Expect.isTrue(closedWorld.isIndirectlyInstantiated(Superclass)); | |
250 Expect.isTrue(closedWorld.isImplemented(Superclass)); | |
251 | |
252 Expect.isTrue(closedWorld.isDirectlyInstantiated(Subclass)); | |
253 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subclass)); | |
254 Expect.isTrue(closedWorld.isImplemented(Subclass)); | |
255 | |
256 Expect.isTrue(closedWorld.isDirectlyInstantiated(Subtype)); | |
257 Expect.isFalse(closedWorld.isIndirectlyInstantiated(Subtype)); | |
258 Expect.isTrue(closedWorld.isImplemented(Subtype)); | |
259 | |
260 check(Superclass, ClassMask.EXACT, foo, false); | |
261 // Should be false since the class is not directly instantiated: | |
262 check(Superclass, ClassMask.EXACT, bar, true); | |
263 // Should be false since the class is not directly instantiated: | |
264 check(Superclass, ClassMask.EXACT, baz, true); | |
265 check(Superclass, ClassMask.SUBCLASS, foo, false); | |
266 // Should be false since all live subclasses have a concrete implementation: | |
267 check(Superclass, ClassMask.SUBCLASS, bar, true); | |
268 check(Superclass, ClassMask.SUBCLASS, baz, true); | |
269 check(Superclass, ClassMask.SUBTYPE, foo, true); | |
270 // Should be false since all live subtypes have a concrete implementation: | |
271 check(Superclass, ClassMask.SUBTYPE, bar, true); | |
272 check(Superclass, ClassMask.SUBTYPE, baz, true); | |
273 | |
274 check(Subclass, ClassMask.EXACT, foo, false); | |
275 check(Subclass, ClassMask.EXACT, bar, false); | |
276 check(Subclass, ClassMask.EXACT, baz, true); | |
277 check(Subclass, ClassMask.SUBCLASS, foo, false); | |
278 check(Subclass, ClassMask.SUBCLASS, bar, false); | |
279 check(Subclass, ClassMask.SUBCLASS, baz, true); | |
280 check(Subclass, ClassMask.SUBTYPE, foo, false); | |
281 check(Subclass, ClassMask.SUBTYPE, bar, false); | |
282 check(Subclass, ClassMask.SUBTYPE, baz, true); | |
283 | |
284 check(Subtype, ClassMask.EXACT, foo, true); | |
285 check(Subtype, ClassMask.EXACT, bar, false); | |
286 check(Subtype, ClassMask.EXACT, baz, true); | |
287 check(Subtype, ClassMask.SUBCLASS, foo, true); | |
288 check(Subtype, ClassMask.SUBCLASS, bar, false); | |
289 check(Subtype, ClassMask.SUBCLASS, baz, true); | |
290 check(Subtype, ClassMask.SUBTYPE, foo, true); | |
291 check(Subtype, ClassMask.SUBTYPE, bar, false); | |
292 check(Subtype, ClassMask.SUBTYPE, baz, true); | |
293 } | |
OLD | NEW |