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

Side by Side Diff: tests/compiler/dart2js/least_upper_bound_test.dart

Issue 52263003: Implement least upper bound. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased and tests expanded. Created 7 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013, 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 library subtype_test;
6
7 import 'package:expect/expect.dart';
8 import 'package:async_helper/async_helper.dart';
9 import 'type_test_helper.dart';
10 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
11 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar t"
12 show Element, ClassElement;
13 import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart'
14 show Link;
15
16 void main() {
17 testInterface1();
18 testInterface2();
19 testGeneric();
20 testMixin();
21 testFunction();
22 testTypeVariable();
23 }
24
25 void testInterface1() {
26 asyncTest(() => TypeEnvironment.create(r"""
27 class A {} // A and B have equal depth.
28 class B {}
29 class I implements A, B {}
30 class J implements A, B {}
31 """).then((var env) {
32
33 DartType Object_ = env['Object'];
34 DartType A = env['A'];
35 DartType B = env['B'];
36 DartType I = env['I'];
37 DartType J = env['J'];
38
39 checkLub(DartType a, DartType b, DartType expect) {
40 DartType lub = env.computeLeastUpperBound(a, b);
41 Expect.equals(expect, lub,
42 'Unexpected lub($a,$b) = $lub, expected $expect.');
43 }
44
45 checkLub(Object_, Object_, Object_);
46 checkLub(Object_, A, Object_);
47 checkLub(Object_, B, Object_);
48 checkLub(Object_, I, Object_);
49 checkLub(Object_, J, Object_);
50
51 checkLub(A, Object_, Object_);
52 checkLub(A, A, A);
53 checkLub(A, B, Object_);
54 checkLub(A, I, A);
55 checkLub(A, J, A);
56
57 checkLub(B, Object_, Object_);
58 checkLub(B, A, Object_);
59 checkLub(B, B, B);
60 checkLub(B, I, B);
61 checkLub(B, J, B);
62
63 checkLub(I, Object_, Object_);
64 checkLub(I, A, A);
65 checkLub(I, B, B);
66 checkLub(I, I, I);
67 checkLub(I, J, Object_);
68
69 checkLub(J, Object_, Object_);
70 checkLub(J, A, A);
71 checkLub(J, B, B);
72 checkLub(J, I, Object_);
73 checkLub(J, J, J);
74 }));
75 }
76
77 void testInterface2() {
78 asyncTest(() => TypeEnvironment.create(r"""
79 class A {}
80 class B {}
81 class C extends B {} // This makes C have higher depth than A.
82 class I implements A, C {}
83 class J implements A, C {}
84 """).then((var env) {
85
86 DartType Object_ = env['Object'];
87 DartType A = env['A'];
88 DartType B = env['B'];
89 DartType C = env['C'];
90 DartType I = env['I'];
91 DartType J = env['J'];
92
93 checkLub(DartType a, DartType b, DartType expectedLub) {
94 DartType lub = env.computeLeastUpperBound(a, b);
95 Expect.equals(expectedLub, lub,
96 'Unexpected lub($a,$b) = $lub, expected $expectedLub');
97 }
98
99 checkLub(Object_, Object_, Object_);
100 checkLub(Object_, A, Object_);
101 checkLub(Object_, B, Object_);
102 checkLub(Object_, C, Object_);
103 checkLub(Object_, I, Object_);
104 checkLub(Object_, J, Object_);
105
106 checkLub(A, Object_, Object_);
107 checkLub(A, A, A);
108 checkLub(A, B, Object_);
109 checkLub(A, C, Object_);
110 checkLub(A, I, A);
111 checkLub(A, J, A);
112
113 checkLub(B, Object_, Object_);
114 checkLub(B, A, Object_);
115 checkLub(B, B, B);
116 checkLub(B, C, B);
117 checkLub(B, I, B);
118 checkLub(B, J, B);
119
120 checkLub(C, Object_, Object_);
121 checkLub(C, A, Object_);
122 checkLub(C, B, B);
123 checkLub(C, C, C);
124 checkLub(C, I, C);
125 checkLub(C, J, C);
126
127 checkLub(I, Object_, Object_);
128 checkLub(I, A, A);
129 checkLub(I, B, B);
130 checkLub(I, C, C);
131 checkLub(I, I, I);
132 checkLub(I, J, C);
133
134 checkLub(J, Object_, Object_);
135 checkLub(J, A, A);
136 checkLub(J, B, B);
137 checkLub(J, C, C);
138 checkLub(J, I, C);
139 checkLub(J, J, J);
140 }));
141 }
142
143 void testGeneric() {
144 asyncTest(() => TypeEnvironment.create(r"""
145 class A {}
146 class B {}
147 class C extends B {}
148 class I<T> {}
149 """).then((var env) {
karlklose 2013/11/21 13:29:10 Remove 'var' (also in the other tests).
Johnni Winther 2013/11/25 13:58:27 Done.
150
151 DartType Object_ = env['Object'];
152 DartType A = env['A'];
153 DartType B = env['B'];
154 DartType C = env['C'];
155 ClassElement I = env.getElement('I');
156 DartType I_A = instantiate(I, [A]);
157 DartType I_B = instantiate(I, [B]);
158 DartType I_C = instantiate(I, [C]);
159
160 checkLub(DartType a, DartType b, DartType expectedLub) {
161 DartType lub = env.computeLeastUpperBound(a, b);
162 Expect.equals(expectedLub, lub,
163 'Unexpected lub($a,$b) = $lub, expected $expectedLub');
164 }
165
166 checkLub(Object_, Object_, Object_);
167 checkLub(Object_, A, Object_);
168 checkLub(Object_, B, Object_);
169 checkLub(Object_, C, Object_);
170 checkLub(Object_, I_A, Object_);
171 checkLub(Object_, I_B, Object_);
172 checkLub(Object_, I_C, Object_);
173
174 checkLub(A, Object_, Object_);
175 checkLub(A, A, A);
176 checkLub(A, B, Object_);
177 checkLub(A, C, Object_);
178 checkLub(A, I_A, Object_);
179 checkLub(A, I_B, Object_);
180 checkLub(A, I_C, Object_);
181
182 checkLub(B, Object_, Object_);
183 checkLub(B, A, Object_);
184 checkLub(B, B, B);
185 checkLub(B, C, B);
186 checkLub(B, I_A, Object_);
187 checkLub(B, I_B, Object_);
188 checkLub(B, I_C, Object_);
189
190 checkLub(C, Object_, Object_);
191 checkLub(C, A, Object_);
192 checkLub(C, B, B);
193 checkLub(C, C, C);
194 checkLub(C, I_A, Object_);
195 checkLub(C, I_B, Object_);
196 checkLub(C, I_C, Object_);
197
198 checkLub(I_A, Object_, Object_);
199 checkLub(I_A, A, Object_);
200 checkLub(I_A, B, Object_);
201 checkLub(I_A, C, Object_);
202 checkLub(I_A, I_A, I_A);
203 checkLub(I_A, I_B, Object_);
204 checkLub(I_A, I_C, Object_);
205
206 checkLub(I_B, Object_, Object_);
207 checkLub(I_B, A, Object_);
208 checkLub(I_B, B, Object_);
209 checkLub(I_B, C, Object_);
210 checkLub(I_B, I_A, Object_);
211 checkLub(I_B, I_B, I_B);
212 checkLub(I_B, I_C, Object_);
213
214 checkLub(I_C, Object_, Object_);
215 checkLub(I_C, A, Object_);
216 checkLub(I_C, B, Object_);
217 checkLub(I_C, C, Object_);
218 checkLub(I_C, I_A, Object_);
219 checkLub(I_C, I_B, Object_);
220 checkLub(I_C, I_C, I_C);
221 }));
222 }
223
224 void testMixin() {
225 asyncTest(() => TypeEnvironment.create(r"""
226 class A {}
227 class B {}
228 class C extends B {}
229 class D extends C {} // This makes D have higher depth than Object+A.
230 class I extends Object with A, B implements A, D {}
231 class I2 extends Object with A, B implements A, D {}
232 class J extends Object with B, A implements A, D {}
233 """).then((var env) {
234
235 DartType Object_ = env['Object'];
236 DartType A = env['A'];
237 DartType B = env['B'];
238 DartType C = env['C'];
239 DartType D = env['D'];
240 DartType I = env['I'];
241 DartType I2 = env['I2'];
242 DartType J = env['J'];
243
244 checkLub(DartType a, DartType b, DartType expectedLub) {
245 DartType lub = env.computeLeastUpperBound(a, b);
246 Expect.equals(expectedLub, lub,
247 'Unexpected lub($a,$b) = $lub, expected $expectedLub');
248 }
249
250 checkLub(Object_, Object_, Object_);
251 checkLub(Object_, A, Object_);
252 checkLub(Object_, B, Object_);
253 checkLub(Object_, C, Object_);
254 checkLub(Object_, D, Object_);
255 checkLub(Object_, I, Object_);
256 checkLub(Object_, I2, Object_);
257 checkLub(Object_, J, Object_);
258
259 checkLub(A, Object_, Object_);
260 checkLub(A, A, A);
261 checkLub(A, B, Object_);
262 checkLub(A, C, Object_);
263 checkLub(A, D, Object_);
264 checkLub(A, I, A);
265 checkLub(A, I2, A);
266 checkLub(A, J, A);
267
268 checkLub(B, Object_, Object_);
269 checkLub(B, A, Object_);
270 checkLub(B, B, B);
271 checkLub(B, C, B);
272 checkLub(B, D, B);
273 checkLub(B, I, B);
274 checkLub(B, I2, B);
275 checkLub(B, J, B);
276
277 checkLub(C, Object_, Object_);
278 checkLub(C, A, Object_);
279 checkLub(C, B, B);
280 checkLub(C, C, C);
281 checkLub(C, D, C);
282 checkLub(C, I, C);
283 checkLub(C, I2, C);
284 checkLub(C, J, C);
285
286 checkLub(D, Object_, Object_);
287 checkLub(D, A, Object_);
288 checkLub(D, B, B);
289 checkLub(D, C, C);
290 checkLub(D, D, D);
291 checkLub(D, I, D);
292 checkLub(D, I2, D);
293 checkLub(D, J, D);
294
295 checkLub(I, Object_, Object_);
296 checkLub(I, A, A);
297 checkLub(I, B, B);
298 checkLub(I, C, C);
299 checkLub(I, D, D);
300 checkLub(I, I, I);
301 checkLub(I, I2, D);
302 checkLub(I, J, D);
303
304 checkLub(I2, Object_, Object_);
305 checkLub(I2, A, A);
306 checkLub(I2, B, B);
307 checkLub(I2, C, C);
308 checkLub(I2, D, D);
309 checkLub(I2, I, D);
310 checkLub(I2, I2, I2);
311 checkLub(I2, J, D);
312
313 checkLub(J, Object_, Object_);
314 checkLub(J, A, A);
315 checkLub(J, B, B);
316 checkLub(J, C, C);
317 checkLub(J, D, D);
318 checkLub(J, I, D);
319 checkLub(J, I2, D);
320 checkLub(J, J, J);
321 }));
322 }
323
324 void testFunction() {
325 asyncTest(() => TypeEnvironment.create(r"""
326 class A {}
327 class B {}
328 class C extends B {}
329
330 typedef dynamic__();
331 typedef void void__();
332 typedef A A__();
333 typedef B B__();
334 typedef C C__();
335
336 typedef void void__A_B(A a, B b);
337 typedef void void__A_C(A a, C b);
338 typedef void void__B_A(B a, A b);
339 typedef void void__B_C(B a, C b);
340
341 typedef void void___B([B a]);
342 typedef void void___B_C([B a, C b]);
343 typedef void void___C_C([C a, C b]);
344
345 typedef void void____B({B a});
346 typedef void void____B_C({B a, C b});
347 typedef void void____C_C({C a, C b});
348 """).then((var env) {
349
350 DartType Object_ = env['Object'];
351 DartType Function_ = env['Function'];
352 DartType dynamic__ = env['dynamic__'];
353 DartType void__ = env['void__'];
354 DartType A__ = env['A__'];
355 DartType B__ = env['B__'];
356 DartType C__ = env['C__'];
357 DartType void__A_B = env['void__A_B'];
358 DartType void__A_C = env['void__A_C'];
359 DartType void__B_A = env['void__B_A'];
360 DartType void__B_C = env['void__B_C'];
361 DartType void___B = env['void___B'];
362 DartType void___B_C = env['void___B_C'];
363 DartType void___C_C = env['void___C_C'];
364 DartType void____B = env['void____B'];
365 DartType void____B_C = env['void____B_C'];
366 DartType void____C_C = env['void____C_C'];
367
368 // Types used only for checking results.
369 DartType void_ = env['void'];
370 DartType B = env['B'];
371 DartType C = env['C'];
372 FunctionType Object__ = env.functionType(Object_, []);
373 FunctionType void__Object_Object =
374 env.functionType(void_, [Object_, Object_]);
375 FunctionType void__Object_B =
376 env.functionType(void_, [Object_, B]);
377 FunctionType void__Object_C =
378 env.functionType(void_, [Object_, C]);
379 FunctionType void__B_Object =
380 env.functionType(void_, [B, Object_]);
381
382 checkLub(DartType a, DartType b, DartType expectedLub) {
383 DartType lub = env.computeLeastUpperBound(a, b);
384 if (a != b) {
385 expectedLub = expectedLub.unalias(env.compiler);
386 lub = lub.unalias(env.compiler);
387 }
388 Expect.equals(expectedLub, lub,
389 'Unexpected lub(${a.unalias(env.compiler)},'
390 '${b.unalias(env.compiler)}) = '
391 '${lub}, expected ${expectedLub}');
392 }
393
394 checkLub(Object_, Object_, Object_);
395 checkLub(Object_, Function_, Object_);
396 checkLub(Object_, dynamic__, Object_);
397 checkLub(Object_, void__, Object_);
398 checkLub(Object_, A__, Object_);
399 checkLub(Object_, B__, Object_);
400 checkLub(Object_, C__, Object_);
401 checkLub(Object_, void__A_B, Object_);
402 checkLub(Object_, void__A_C, Object_);
403 checkLub(Object_, void__B_A, Object_);
404 checkLub(Object_, void__B_C, Object_);
405 checkLub(Object_, void___B, Object_);
406 checkLub(Object_, void___B_C, Object_);
407 checkLub(Object_, void___C_C, Object_);
408 checkLub(Object_, void____B, Object_);
409 checkLub(Object_, void____B_C, Object_);
410 checkLub(Object_, void____C_C, Object_);
411
412 checkLub(Function_, Object_, Object_);
413 checkLub(Function_, Function_, Function_);
414 checkLub(Function_, dynamic__, Function_);
415 checkLub(Function_, void__, Function_);
416 checkLub(Function_, A__, Function_);
417 checkLub(Function_, B__, Function_);
418 checkLub(Function_, C__, Function_);
419 checkLub(Function_, void__A_B, Function_);
420 checkLub(Function_, void__A_C, Function_);
421 checkLub(Function_, void__B_A, Function_);
422 checkLub(Function_, void__B_C, Function_);
423 checkLub(Function_, void___B, Function_);
424 checkLub(Function_, void___B_C, Function_);
425 checkLub(Function_, void___C_C, Function_);
426 checkLub(Function_, void____B, Function_);
427 checkLub(Function_, void____B_C, Function_);
428 checkLub(Function_, void____C_C, Function_);
429
430 checkLub(dynamic__, Object_, Object_);
431 checkLub(dynamic__, Function_, Function_);
432 checkLub(dynamic__, dynamic__, dynamic__);
433 checkLub(dynamic__, void__, dynamic__);
434 checkLub(dynamic__, A__, dynamic__);
435 checkLub(dynamic__, B__, dynamic__);
436 checkLub(dynamic__, C__, dynamic__);
437 checkLub(dynamic__, void__A_B, Function_);
438 checkLub(dynamic__, void__A_C, Function_);
439 checkLub(dynamic__, void__B_A, Function_);
440 checkLub(dynamic__, void__B_C, Function_);
441 checkLub(dynamic__, void___B, dynamic__);
442 checkLub(dynamic__, void___B_C, dynamic__);
443 checkLub(dynamic__, void___C_C, dynamic__);
444 checkLub(dynamic__, void____B, dynamic__);
445 checkLub(dynamic__, void____B_C, dynamic__);
446 checkLub(dynamic__, void____C_C, dynamic__);
447
448 checkLub(void__, Object_, Object_);
449 checkLub(void__, Function_, Function_);
450 checkLub(void__, dynamic__, dynamic__);
451 checkLub(void__, void__, void__);
452 checkLub(void__, A__, void__);
453 checkLub(void__, B__, void__);
454 checkLub(void__, C__, void__);
455 checkLub(void__, void__A_B, Function_);
456 checkLub(void__, void__A_C, Function_);
457 checkLub(void__, void__B_A, Function_);
458 checkLub(void__, void__B_C, Function_);
459 checkLub(void__, void___B, void__);
460 checkLub(void__, void___B_C, void__);
461 checkLub(void__, void___C_C, void__);
462 checkLub(void__, void____B, void__);
463 checkLub(void__, void____B_C, void__);
464 checkLub(void__, void____C_C, void__);
465
466 checkLub(A__, Object_, Object_);
467 checkLub(A__, Function_, Function_);
468 checkLub(A__, dynamic__, dynamic__);
469 checkLub(A__, void__, void__);
470 checkLub(A__, A__, A__);
471 checkLub(A__, B__, Object__);
472 checkLub(A__, C__, Object__);
473 checkLub(A__, void__A_B, Function_);
474 checkLub(A__, void__A_C, Function_);
475 checkLub(A__, void__B_A, Function_);
476 checkLub(A__, void__B_C, Function_);
477 checkLub(A__, void___B, void__);
478 checkLub(A__, void___B_C, void__);
479 checkLub(A__, void___C_C, void__);
480 checkLub(A__, void____B, void__);
481 checkLub(A__, void____B_C, void__);
482 checkLub(A__, void____C_C, void__);
483
484 checkLub(B__, Object_, Object_);
485 checkLub(B__, Function_, Function_);
486 checkLub(B__, dynamic__, dynamic__);
487 checkLub(B__, void__, void__);
488 checkLub(B__, A__, Object__);
489 checkLub(B__, B__, B__);
490 checkLub(B__, C__, B__);
491 checkLub(B__, void__A_B, Function_);
492 checkLub(B__, void__A_C, Function_);
493 checkLub(B__, void__B_A, Function_);
494 checkLub(B__, void__B_C, Function_);
495 checkLub(B__, void___B, void__);
496 checkLub(B__, void___B_C, void__);
497 checkLub(B__, void___C_C, void__);
498 checkLub(B__, void____B, void__);
499 checkLub(B__, void____B_C, void__);
500 checkLub(B__, void____C_C, void__);
501
502 checkLub(C__, Object_, Object_);
503 checkLub(C__, Function_, Function_);
504 checkLub(C__, dynamic__, dynamic__);
505 checkLub(C__, void__, void__);
506 checkLub(C__, A__, Object__);
507 checkLub(C__, B__, B__);
508 checkLub(C__, C__, C__);
509 checkLub(C__, void__A_B, Function_);
510 checkLub(C__, void__A_C, Function_);
511 checkLub(C__, void__B_A, Function_);
512 checkLub(C__, void__B_C, Function_);
513 checkLub(C__, void___B, void__);
514 checkLub(C__, void___B_C, void__);
515 checkLub(C__, void___C_C, void__);
516 checkLub(C__, void____B, void__);
517 checkLub(C__, void____B_C, void__);
518 checkLub(C__, void____C_C, void__);
519
520 checkLub(void__A_B, Object_, Object_);
521 checkLub(void__A_B, Function_, Function_);
522 checkLub(void__A_B, dynamic__, Function_);
523 checkLub(void__A_B, void__, Function_);
524 checkLub(void__A_B, A__, Function_);
525 checkLub(void__A_B, B__, Function_);
526 checkLub(void__A_B, C__, Function_);
527 checkLub(void__A_B, void__A_B, void__A_B);
528 checkLub(void__A_B, void__A_C, void__A_B);
529 checkLub(void__A_B, void__B_A, void__Object_Object);
530 checkLub(void__A_B, void__B_C, void__Object_B);
531 checkLub(void__A_B, void___B, Function_);
532 checkLub(void__A_B, void___B_C, Function_);
533 checkLub(void__A_B, void___C_C, Function_);
534 checkLub(void__A_B, void____B, Function_);
535 checkLub(void__A_B, void____B_C, Function_);
536 checkLub(void__A_B, void____C_C, Function_);
537
538 checkLub(void__A_C, Object_, Object_);
539 checkLub(void__A_C, Function_, Function_);
540 checkLub(void__A_C, dynamic__, Function_);
541 checkLub(void__A_C, void__, Function_);
542 checkLub(void__A_C, A__, Function_);
543 checkLub(void__A_C, B__, Function_);
544 checkLub(void__A_C, C__, Function_);
545 checkLub(void__A_C, void__A_B, void__A_B);
546 checkLub(void__A_C, void__A_C, void__A_C);
547 checkLub(void__A_C, void__B_A, void__Object_Object);
548 checkLub(void__A_C, void__B_C, void__Object_C);
549 checkLub(void__A_C, void___B, Function_);
550 checkLub(void__A_C, void___B_C, Function_);
551 checkLub(void__A_C, void___C_C, Function_);
552 checkLub(void__A_C, void____B, Function_);
553 checkLub(void__A_C, void____B_C, Function_);
554 checkLub(void__A_C, void____C_C, Function_);
555
556 checkLub(void__B_A, Object_, Object_);
557 checkLub(void__B_A, Function_, Function_);
558 checkLub(void__B_A, dynamic__, Function_);
559 checkLub(void__B_A, void__, Function_);
560 checkLub(void__B_A, A__, Function_);
561 checkLub(void__B_A, B__, Function_);
562 checkLub(void__B_A, C__, Function_);
563 checkLub(void__B_A, void__A_B, void__Object_Object);
564 checkLub(void__B_A, void__A_C, void__Object_Object);
565 checkLub(void__B_A, void__B_A, void__B_A);
566 checkLub(void__B_A, void__B_C, void__B_Object);
567 checkLub(void__B_A, void___B, Function_);
568 checkLub(void__B_A, void___B_C, Function_);
569 checkLub(void__B_A, void___C_C, Function_);
570 checkLub(void__B_A, void____B, Function_);
571 checkLub(void__B_A, void____B_C, Function_);
572 checkLub(void__B_A, void____C_C, Function_);
573
574 checkLub(void__B_C, Object_, Object_);
575 checkLub(void__B_C, Function_, Function_);
576 checkLub(void__B_C, dynamic__, Function_);
577 checkLub(void__B_C, void__, Function_);
578 checkLub(void__B_C, A__, Function_);
579 checkLub(void__B_C, B__, Function_);
580 checkLub(void__B_C, C__, Function_);
581 checkLub(void__B_C, void__A_B, void__Object_B);
582 checkLub(void__B_C, void__A_C, void__Object_C);
583 checkLub(void__B_C, void__B_A, void__B_Object);
584 checkLub(void__B_C, void__B_C, void__B_C);
585 checkLub(void__B_C, void___B, Function_);
586 checkLub(void__B_C, void___B_C, Function_);
587 checkLub(void__B_C, void___C_C, Function_);
588 checkLub(void__B_C, void____B, Function_);
589 checkLub(void__B_C, void____B_C, Function_);
590 checkLub(void__B_C, void____C_C, Function_);
591
592 checkLub(void___B, Object_, Object_);
593 checkLub(void___B, Function_, Function_);
594 checkLub(void___B, dynamic__, dynamic__);
595 checkLub(void___B, void__, void__);
596 checkLub(void___B, A__, void__);
597 checkLub(void___B, B__, void__);
598 checkLub(void___B, C__, void__);
599 checkLub(void___B, void__A_B, Function_);
600 checkLub(void___B, void__A_C, Function_);
601 checkLub(void___B, void__B_A, Function_);
602 checkLub(void___B, void__B_C, Function_);
603 checkLub(void___B, void___B, void___B);
604 checkLub(void___B, void___B_C, void___B);
605 checkLub(void___B, void___C_C, void___B);
606 checkLub(void___B, void____B, void__);
607 checkLub(void___B, void____B_C, void__);
608 checkLub(void___B, void____C_C, void__);
609
610 checkLub(void___B_C, Object_, Object_);
611 checkLub(void___B_C, Function_, Function_);
612 checkLub(void___B_C, dynamic__, dynamic__);
613 checkLub(void___B_C, void__, void__);
614 checkLub(void___B_C, A__, void__);
615 checkLub(void___B_C, B__, void__);
616 checkLub(void___B_C, C__, void__);
617 checkLub(void___B_C, void__A_B, Function_);
618 checkLub(void___B_C, void__A_C, Function_);
619 checkLub(void___B_C, void__B_A, Function_);
620 checkLub(void___B_C, void__B_C, Function_);
621 checkLub(void___B_C, void___B, void___B);
622 checkLub(void___B_C, void___B_C, void___B_C);
623 checkLub(void___B_C, void___C_C, void___B_C);
624 checkLub(void___B_C, void____B, void__);
625 checkLub(void___B_C, void____B_C, void__);
626 checkLub(void___B_C, void____C_C, void__);
627
628 checkLub(void___C_C, Object_, Object_);
629 checkLub(void___C_C, Function_, Function_);
630 checkLub(void___C_C, dynamic__, dynamic__);
631 checkLub(void___C_C, void__, void__);
632 checkLub(void___C_C, A__, void__);
633 checkLub(void___C_C, B__, void__);
634 checkLub(void___C_C, C__, void__);
635 checkLub(void___C_C, void__A_B, Function_);
636 checkLub(void___C_C, void__A_C, Function_);
637 checkLub(void___C_C, void__B_A, Function_);
638 checkLub(void___C_C, void__B_C, Function_);
639 checkLub(void___C_C, void___B, void___B);
640 checkLub(void___C_C, void___B_C, void___B_C);
641 checkLub(void___C_C, void___C_C, void___C_C);
642 checkLub(void___C_C, void____B, void__);
643 checkLub(void___C_C, void____B_C, void__);
644 checkLub(void___C_C, void____C_C, void__);
645
646 checkLub(void____B, Object_, Object_);
647 checkLub(void____B, Function_, Function_);
648 checkLub(void____B, dynamic__, dynamic__);
649 checkLub(void____B, void__, void__);
650 checkLub(void____B, A__, void__);
651 checkLub(void____B, B__, void__);
652 checkLub(void____B, C__, void__);
653 checkLub(void____B, void__A_B, Function_);
654 checkLub(void____B, void__A_C, Function_);
655 checkLub(void____B, void__B_A, Function_);
656 checkLub(void____B, void__B_C, Function_);
657 checkLub(void____B, void___B, void__);
658 checkLub(void____B, void___B_C, void__);
659 checkLub(void____B, void___C_C, void__);
660 checkLub(void____B, void____B, void____B);
661 checkLub(void____B, void____B_C, void____B);
662 checkLub(void____B, void____C_C, void____B);
663
664 checkLub(void____B_C, Object_, Object_);
665 checkLub(void____B_C, Function_, Function_);
666 checkLub(void____B_C, dynamic__, dynamic__);
667 checkLub(void____B_C, void__, void__);
668 checkLub(void____B_C, A__, void__);
669 checkLub(void____B_C, B__, void__);
670 checkLub(void____B_C, C__, void__);
671 checkLub(void____B_C, void__A_B, Function_);
672 checkLub(void____B_C, void__A_C, Function_);
673 checkLub(void____B_C, void__B_A, Function_);
674 checkLub(void____B_C, void__B_C, Function_);
675 checkLub(void____B_C, void___B, void__);
676 checkLub(void____B_C, void___B_C, void__);
677 checkLub(void____B_C, void___C_C, void__);
678 checkLub(void____B_C, void____B, void____B);
679 checkLub(void____B_C, void____B_C, void____B_C);
680 checkLub(void____B_C, void____C_C, void____B_C);
681
682 checkLub(void____C_C, Object_, Object_);
683 checkLub(void____C_C, Function_, Function_);
684 checkLub(void____C_C, dynamic__, dynamic__);
685 checkLub(void____C_C, void__, void__);
686 checkLub(void____C_C, A__, void__);
687 checkLub(void____C_C, B__, void__);
688 checkLub(void____C_C, C__, void__);
689 checkLub(void____C_C, void__A_B, Function_);
690 checkLub(void____C_C, void__A_C, Function_);
691 checkLub(void____C_C, void__B_A, Function_);
692 checkLub(void____C_C, void__B_C, Function_);
693 checkLub(void____C_C, void___B, void__);
694 checkLub(void____C_C, void___B_C, void__);
695 checkLub(void____C_C, void___C_C, void__);
696 checkLub(void____C_C, void____B, void____B);
697 checkLub(void____C_C, void____B_C, void____B_C);
698 checkLub(void____C_C, void____C_C, void____C_C);
699 }));
700 }
701
702 void testTypeVariable() {
703 asyncTest(() => TypeEnvironment.create(r"""
704 class A {}
705 class B {}
706 class C extends B {}
707 class I<S extends A,
708 T extends B,
709 U extends C,
710 V extends T,
711 W extends V,
712 X extends T> {}
713 """).then((var env) {
714
715 // A B
716 // | / \
717 // S T C
718 // / \ \
719 // V X U
720 // /
721 // W
722
723 DartType Object_ = env['Object'];
724 DartType A = env['A'];
725 DartType B = env['B'];
726 DartType C = env['C'];
727 ClassElement I = env.getElement('I');
728 DartType S = I.typeVariables.head;
729 DartType T = I.typeVariables.tail.head;
730 DartType U = I.typeVariables.tail.tail.head;
731 DartType V = I.typeVariables.tail.tail.tail.head;
732 DartType W = I.typeVariables.tail.tail.tail.tail.head;
733 DartType X = I.typeVariables.tail.tail.tail.tail.tail.head;
734
735 checkLub(DartType a, DartType b, DartType expectedLub) {
736 DartType lub = env.computeLeastUpperBound(a, b);
737 Expect.equals(expectedLub, lub,
738 'Unexpected lub($a,$b) = $lub, expected $expectedLub');
739 }
740
741 checkLub(Object_, Object_, Object_);
742 checkLub(Object_, A, Object_);
743 checkLub(Object_, B, Object_);
744 checkLub(Object_, C, Object_);
745 checkLub(Object_, S, Object_);
746 checkLub(Object_, T, Object_);
747 checkLub(Object_, U, Object_);
748 checkLub(Object_, V, Object_);
749 checkLub(Object_, W, Object_);
750 checkLub(Object_, X, Object_);
751
752 checkLub(A, Object_, Object_);
753 checkLub(A, A, A);
754 checkLub(A, B, Object_);
755 checkLub(A, C, Object_);
756 checkLub(A, S, A);
757 checkLub(A, T, Object_);
758 checkLub(A, U, Object_);
759 checkLub(A, V, Object_);
760 checkLub(A, W, Object_);
761 checkLub(A, X, Object_);
762
763 checkLub(B, Object_, Object_);
764 checkLub(B, A, Object_);
765 checkLub(B, B, B);
766 checkLub(B, C, B);
767 checkLub(B, S, Object_);
768 checkLub(B, T, B);
769 checkLub(B, U, B);
770 checkLub(B, V, B);
771 checkLub(B, W, B);
772 checkLub(B, X, B);
773
774 checkLub(C, Object_, Object_);
775 checkLub(C, A, Object_);
776 checkLub(C, B, B);
777 checkLub(C, C, C);
778 checkLub(C, S, Object_);
779 checkLub(C, T, B);
780 checkLub(C, U, C);
781 checkLub(C, V, B);
782 checkLub(C, W, B);
783 checkLub(C, X, B);
784
785 checkLub(S, Object_, Object_);
786 checkLub(S, A, A);
787 checkLub(S, B, Object_);
788 checkLub(S, C, Object_);
789 checkLub(S, S, S);
790 checkLub(S, T, Object_);
791 checkLub(S, U, Object_);
792 checkLub(S, V, Object_);
793 checkLub(S, W, Object_);
794 checkLub(S, X, Object_);
795
796 checkLub(T, Object_, Object_);
797 checkLub(T, A, Object_);
798 checkLub(T, B, B);
799 checkLub(T, C, B);
800 checkLub(T, S, Object_);
801 checkLub(T, T, T);
802 checkLub(T, U, B);
803 checkLub(T, V, T);
804 checkLub(T, W, T);
805 checkLub(T, X, T);
806
807 checkLub(U, Object_, Object_);
808 checkLub(U, A, Object_);
809 checkLub(U, B, B);
810 checkLub(U, C, C);
811 checkLub(U, S, Object_);
812 checkLub(U, T, B);
813 checkLub(U, U, U);
814 checkLub(U, V, B);
815 checkLub(U, W, B);
816 checkLub(U, X, B);
817
818 checkLub(V, Object_, Object_);
819 checkLub(V, A, Object_);
820 checkLub(V, B, B);
821 checkLub(V, C, B);
822 checkLub(V, S, Object_);
823 checkLub(V, T, T);
824 checkLub(V, U, B);
825 checkLub(V, V, V);
826 checkLub(V, W, V);
827 checkLub(V, X, T);
828
829 checkLub(W, Object_, Object_);
830 checkLub(W, A, Object_);
831 checkLub(W, B, B);
832 checkLub(W, C, B);
833 checkLub(W, S, Object_);
834 checkLub(W, T, T);
835 checkLub(W, U, B);
836 checkLub(W, V, V);
837 checkLub(W, W, W);
838 checkLub(W, X, T);
839
840 checkLub(X, Object_, Object_);
841 checkLub(X, A, Object_);
842 checkLub(X, B, B);
843 checkLub(X, C, B);
844 checkLub(X, S, Object_);
845 checkLub(X, T, T);
846 checkLub(X, U, B);
847 checkLub(X, V, T);
848 checkLub(X, W, T);
849 checkLub(X, X, X);
850 }));
851 }
852
853
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698