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

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

Issue 140803002: Perform override and inheritance checks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months 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 import "package:expect/expect.dart";
6
7 import "compiler_helper.dart";
8
9 main() {
10 testMoreRequiredParameters();
11 testFewerPositionalParameters();
12 testNotAllNamedParameters();
13 testNotSubtype();
14 testGetterNotSubtype();
15 testSetterNotSubtype();
16 testGenericNotSubtype();
17 testFieldNotSubtype();
18 testMixedOverride();
19 testAbstractMethods();
20 testNoSuchMethod();
21 }
22
23 check(String source, {errors, warnings, hints, infos}) {
24 MockCompiler compiler = new MockCompiler();
25 compiler.diagnosticHandler = createHandler(compiler, source);
26 compiler.parseScript(source);
27 var cls = compiler.mainApp.find('Class');
28 cls.ensureResolved(compiler);
29
30 if (errors == null) errors = [];
karlklose 2014/01/28 12:27:45 Consider adding a helper like toList(o) => o ==
Johnni Winther 2014/01/31 12:29:30 Done.
31 if (errors is! List) errors = [errors];
32 compareMessageKinds(source, errors, compiler.errors, 'error');
33
34 if (warnings == null) warnings = [];
35 if (warnings is! List) warnings = [warnings];
36 compareMessageKinds(source, warnings, compiler.warnings, 'warning');
37
38 if (infos != null) {
39 if (infos is! List) infos = [infos];
40 compareMessageKinds(source, infos, compiler.infos, 'info');
41 }
42
43 if (hints != null) {
44 if (hints is! List) hints = [hints];
45 compareMessageKinds(source, hints, compiler.hints, 'hint');
46 }
47 }
48
49 testMoreRequiredParameters() {
karlklose 2014/01/28 12:27:45 This method is also testing equal numbers of requi
Johnni Winther 2014/01/31 12:29:30 Done.
50 check("""
51 class A {
52 method() => null; // testMoreRequiredParameters:0
53 }
54 class Class extends A {
55 method() => null; // testMoreRequiredParameters:1
56 }
57 """);
58
59 check("""
60 class A {
61 method(a) => null; // testMoreRequiredParameters:2
62 }
63 class Class extends A {
64 method(b) => null; // testMoreRequiredParameters:3
65 }
66 """);
67
68 check("""
69 class A {
70 method(a, b, c, d) => null; // testMoreRequiredParameters:3
71 }
72 class Class extends A {
73 method(b, a, d, c) => null; // testMoreRequiredParameters:4
74 }
75 """);
76
77 check("""
78 class A {
79 method() => null; // testMoreRequiredParameters:5
80 }
81 class Class extends A {
82 method(a) => null; // testMoreRequiredParameters:6
83 }
84 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
85 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
86
87 check("""
88 class A {
89 method() => null; // testMoreRequiredParameters:7
90 }
91 class Class implements A {
92 method(a) => null; // testMoreRequiredParameters:8
93 }
94 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
95 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
96
97 check("""
98 class A {
99 method(a, b, c) => null; // testMoreRequiredParameters:9
100 }
101 class Class extends A {
102 method(a, b, c, d) => null; // testMoreRequiredParameters:10
103 }
104 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
105 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
106 }
107
108 testFewerPositionalParameters() {
109 check("""
110 class A {
111 method([a]) => null; // testFewerPositionalParameters:1
112 }
113 class Class extends A {
114 method([a]) => null; // testFewerPositionalParameters:2
115 }
116 """);
117
118 check("""
119 class A {
120 method([a, b]) => null; // testFewerPositionalParameters:3
121 }
122 class Class extends A {
123 method([b, a]) => null; // testFewerPositionalParameters:4
124 }
125 """);
126
127 check("""
128 class A {
129 method([a, b, c]) => null; // testFewerPositionalParameters:5
130 }
131 class Class extends A {
132 method([b, d, a, c]) => null; // testFewerPositionalParameters:6
133 }
134 """);
135
136 check("""
137 class A {
138 method([a]) => null; // testFewerPositionalParameters:7
139 }
140 class Class extends A {
141 method([a]) => null; // testFewerPositionalParameters:8
142 }
143 """);
144
145 check("""
146 class A {
147 method(a) => null; // testFewerPositionalParameters:9
148 }
149 class Class extends A {
150 method() => null; // testFewerPositionalParameters:10
151 }
152 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
153 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
154
155 check("""
156 class A {
157 method(a, [b]) => null; // testFewerPositionalParameters:11
158 }
159 class Class extends A {
160 method(a) => null; // testFewerPositionalParameters:12
161 }
162 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
163 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
164
165 check("""
166 class A {
167 method(a, [b]) => null; // testFewerPositionalParameters:13
168 }
169 class Class extends A {
170 method([a]) => null; // testFewerPositionalParameters:14
171 }
172 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
173 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
174
175 check("""
176 class A {
177 method(a, b, [c, d, e]) => null; // testFewerPositionalParameters:15
178 }
179 class Class extends A {
180 method([a, b, c, d]) => null; // testFewerPositionalParameters:16
181 }
182 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
183 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
184 }
185
186 testNotAllNamedParameters() {
187 check("""
188 class A {
189 method({a}) => null; // testNotAllNamedParameters:1
190 }
191 class Class extends A {
192 method({a}) => null; // testNotAllNamedParameters:2
193 }
194 """);
195
196 check("""
197 class A {
198 method({a, b}) => null; // testNotAllNamedParameters:3
199 }
200 class Class extends A {
201 method({b, a}) => null; // testNotAllNamedParameters:4
202 }
203 """);
204
205 check("""
206 class A {
207 method({a, b, c}) => null; // testNotAllNamedParameters:5
208 }
209 class Class extends A {
210 method({b, c, a, d}) => null; // testNotAllNamedParameters:6
211 }
212 """);
213
214 check("""
215 class A {
216 method(d, {a, b, c}) => null; // testNotAllNamedParameters:7
217 }
218 class Class extends A {
219 method(e, {b, c, a, d}) => null; // testNotAllNamedParameters:8
220 }
221 """);
222
223 check("""
224 class A {
225 method({a}) => null; // testNotAllNamedParameters:9
226 }
227 class Class extends A {
228 method() => null; // testNotAllNamedParameters:10
229 }
230 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
231 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
232
233 check("""
234 class A {
235 method({a, b}) => null; // testNotAllNamedParameters:11
236 }
237 class Class extends A {
238 method({b}) => null; // testNotAllNamedParameters:12
239 }
240 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
241 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
242
243 check("""
244 class A {
245 method({a, b, c, d}) => null; // testNotAllNamedParameters:13
246 }
247 class Class extends A {
248 method({a, e, d, c}) => null; // testNotAllNamedParameters:14
249 }
250 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
251 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
252 }
253
254 testNotSubtype() {
karlklose 2014/01/28 12:27:45 This method also tests the positive test. Consider
Johnni Winther 2014/01/31 12:29:30 Done.
255 check("""
256 class A {
257 method(int a) => null; // testNotSubtype:1
258 }
259 class Class extends A {
260 method(int a) => null; // testNotSubtype:2
261 }
262 """);
263
264 check("""
265 class A {
266 method(int a) => null; // testNotSubtype:3
267 }
268 class Class extends A {
269 method(num a) => null; // testNotSubtype:4
270 }
271 """);
272
273 check("""
274 class A {
275 void method() {} // testNotSubtype:5
276 }
277 class Class extends A {
278 method() => null; // testNotSubtype:6
279 }
280 """);
281
282 check("""
283 class A {
284 method() => null; // testNotSubtype:7
285 }
286 class Class extends A {
287 void method() {} // testNotSubtype:8
288 }
289 """);
290
291 check("""
292 class A {
293 void method() {} // testNotSubtype:9
294 }
295 class Class extends A {
296 int method() => null; // testNotSubtype:10
297 }
298 """);
299
300 check("""
301 class A {
302 int method() => null; // testNotSubtype:11
303 }
304 class Class extends A {
305 void method() {} // testNotSubtype:12
306 }
307 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
308 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
309
310 check("""
311 class A {
312 method(int a) => null; // testNotSubtype:13
313 }
314 class B extends A {
315 method(num a) => null; // testNotSubtype:14
316 }
317 class Class extends B {
318 method(double a) => null; // testNotSubtype:15
319 }
320 """);
321
322 check("""
323 class A {
324 method(int a) => null; // testNotSubtype:16
325 }
326 class B extends A {
327 method(a) => null; // testNotSubtype:17
328 }
329 class Class extends B {
330 method(String a) => null; // testNotSubtype:18
331 }
332 """);
333
334 check("""
335 class A {
336 method(int a) => null; // testNotSubtype:19
337 }
338 class Class extends A {
339 method(String a) => null; // testNotSubtype:20
340 }
341 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
342 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
343
344 check("""
karlklose 2014/01/28 12:27:45 I would argue that 'inherited(C, _)' contains 'met
Johnni Winther 2014/01/31 12:29:30 Done.
345 class A {
346 method(int a) => null; // testNotSubtype:23
347 }
348 class B {
349 method(num a) => null; // testNotSubtype:24
350 }
351 abstract class C implements A, B {
352 }
353 class Class implements C {
354 method(double a) => null; // testNotSubtype:25
355 }
356 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
357 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
358
359 check("""
karlklose 2014/01/28 12:27:45 Ditto.
Johnni Winther 2014/01/31 12:29:30 Done.
360 class A {
361 method(int a) => null; // testNotSubtype:26
362 }
363 class B {
364 method(num a) => null; // testNotSubtype:27
365 }
366 abstract class C implements A, B {
367 }
368 class Class implements C {
369 method(String a) => null; // testNotSubtype:28
370 }
371 """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
372 MessageKind.INVALID_OVERRIDE_METHOD],
373 infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
374 MessageKind.INVALID_OVERRIDDEN_METHOD]);
375
376 check("""
karlklose 2014/01/28 12:27:45 Move this up after l. 357 (it is just testing a sy
Johnni Winther 2014/01/31 12:29:30 Done.
377 class A {
378 method(num a) => null; // testNotSubtype:29
379 }
380 class B {
381 method(int a) => null; // testNotSubtype:30
382 }
383 abstract class C implements A, B {
384 }
385 class Class implements C {
386 method(double a) => null; // testNotSubtype:31
387 }
388 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
389 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
390 }
391
392 testGetterNotSubtype() {
393 check("""
394 class A {
395 get getter => null; // testGetterNotSubtype:1
396 }
397 class Class extends A {
398 get getter => null; // testGetterNotSubtype:2
399 }
400 """);
401
402 check("""
403 class A {
404 num get getter => null; // testGetterNotSubtype:3
405 }
406 class Class extends A {
407 num get getter => null; // testGetterNotSubtype:4
408 }
409 """);
410
411 check("""
412 class A {
413 num get getter => null; // testGetterNotSubtype:5
414 }
415 class Class extends A {
416 int get getter => null; // testGetterNotSubtype:6
417 }
418 """);
419
420 check("""
421 class A {
422 int get getter => null; // testGetterNotSubtype:7
423 }
424 class Class extends A {
425 num get getter => null; // testGetterNotSubtype:8
426 }
427 """);
428
429 check("""
430 class A {
431 int get getter => null; // testGetterNotSubtype:9
432 }
433 class Class extends A {
434 double get getter => null; // testGetterNotSubtype:10
435 }
436 """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
437 infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
438
439 check("""
440 class A {
441 int get getter => null; // testGetterNotSubtype:11
442 }
443 class B extends A {
444 num get getter => null; // testGetterNotSubtype:12
445 }
446 class Class extends B {
447 double get getter => null; // testGetterNotSubtype:13
448 }
449 """);
450
451 check("""
452 class A {
453 int get getter => null; // testGetterNotSubtype:14
454 }
455 class B {
456 num get getter => null; // testGetterNotSubtype:15
457 }
458 class Class extends A implements B {
459 double get getter => null; // testGetterNotSubtype:16
460 }
461 """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
462 infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
463
464 check("""
465 class A {
466 int get getter => null; // testGetterNotSubtype:17
467 }
468 class B {
469 String get getter => null; // testGetterNotSubtype:18
470 }
471 class Class extends A implements B {
472 double get getter => null; // testGetterNotSubtype:19
473 }
474 """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
475 MessageKind.INVALID_OVERRIDE_GETTER],
476 infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
477 MessageKind.INVALID_OVERRIDDEN_GETTER]);
478
479 check("""
480 class A {
481 int get getter => null; // testGetterNotSubtype:20
482 }
483 class B {
484 String get getter => null; // testGetterNotSubtype:21
485 }
486 class Class implements A, B {
487 double get getter => null; // testGetterNotSubtype:22
488 }
489 """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
490 MessageKind.INVALID_OVERRIDE_GETTER],
491 infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
492 MessageKind.INVALID_OVERRIDDEN_GETTER]);
493
494 check("""
495 class A {
496 int get getter => null; // testGetterNotSubtype:23
497 }
498 class B {
499 num get getter => null; // testGetterNotSubtype:24
500 }
501 abstract class C implements A, B {
502 }
503 class Class implements C {
504 double get getter => null; // testGetterNotSubtype:25
505 }
506 """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
507 infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
508
509 check("""
karlklose 2014/01/28 12:27:45 Also add a TODO to wait for clarification from Gil
Johnni Winther 2014/01/31 12:29:30 Done.
510 class A {
511 int get getter => null; // testGetterNotSubtype:26
512 }
513 class B {
514 num get getter => null; // testGetterNotSubtype:27
515 }
516 abstract class C implements A, B {
517 }
518 class Class implements C {
519 String get getter => null; // testGetterNotSubtype:28
520 }
521 """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
522 MessageKind.INVALID_OVERRIDE_GETTER],
523 infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
524 MessageKind.INVALID_OVERRIDDEN_GETTER]);
525 }
526
527 testGenericNotSubtype() {
528 check("""
529 class A<T> {
530 method(T t) => null; // testGenericNotSubtype:1
531 }
532 class Class<S> extends A<S> {
533 method(S s) => null; // testGenericNotSubtype:2
534 }
535 """);
536
537 check("""
538 class A<T> {
539 method(T t) => null; // testGenericNotSubtype:3
540 }
541 class Class extends A<num> {
542 method(int i) => null; // testGenericNotSubtype:4
543 }
544 """);
545
546 check("""
547 class A<T> {
548 method(T t) => null; // testGenericNotSubtype:5
549 }
550 class B<S> {
551 method(S s) => null; // testGenericNotSubtype:6
552 }
553 class Class extends A<double> implements B<int> {
554 method(num i) => null; // testGenericNotSubtype:7
555 }
556 """);
557
558 check("""
559 class A<T> {
560 method(T t) => null; // testGenericNotSubtype:8
561 }
562 class Class<S> extends A<S> {
563 method(int i) => null; // testGenericNotSubtype:9
564 }
565 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
566 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
567
568 check("""
569 class A<T> {
570 method(T t) => null; // testGenericNotSubtype:10
571 }
572 class B<S> extends A<S> {
573
574 }
575 class Class<U> extends B<U> {
576 method(U u) => null; // testGenericNotSubtype:11
577 }
578 """);
579
580 check("""
581 class A<T> {
582 method(T t) => null; // testGenericNotSubtype:12
583 }
584 class B<S> {
585 method(S s) => null; // testGenericNotSubtype:13
586 }
587 class Class<U> extends A<U> implements B<num> {
588 method(int i) => null; // testGenericNotSubtype:14
589 }
590 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
591 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
592
593 check("""
594 class A<T> {
595 method(T t) => null; // testGenericNotSubtype:15
596 }
597 class B<S> {
598 method(S s) => null; // testGenericNotSubtype:16
599 }
600 class Class extends A<int> implements B<String> {
601 method(double d) => null; // testGenericNotSubtype:17
602 }
603 """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
604 MessageKind.INVALID_OVERRIDE_METHOD],
605 infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
606 MessageKind.INVALID_OVERRIDDEN_METHOD]);
607
608 check("""
609 class A<T> {
610 method(T t) => null; // testGenericNotSubtype:18
611 }
612 class B<S> {
613 method(S s) => null; // testGenericNotSubtype:19
614 }
615 class Class implements A<int>, B<String> {
616 method(double d) => null; // testGenericNotSubtype:20
617 }
618 """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
619 MessageKind.INVALID_OVERRIDE_METHOD],
620 infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
621 MessageKind.INVALID_OVERRIDDEN_METHOD]);
622
623 check("""
624 class A<T> {
625 method(T t) => null; // testGenericNotSubtype:21
626 }
627 class B<S> {
628 method(S s) => null; // testGenericNotSubtype:22
629 }
630 abstract class C implements A<int>, B<num> {
631 }
632 class Class implements C {
633 method(double d) => null; // testGenericNotSubtype:23
634 }
635 """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
636 infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
637
638 check("""
639 class A<T> {
640 method(T t) => null; // testGenericNotSubtype:24
641 }
642 class B<S> {
643 method(S s) => null; // testGenericNotSubtype:25
644 }
645 abstract class C implements A<int>, B<num> {
646 }
647 class Class implements C {
648 method(String s) => null; // testGenericNotSubtype:26
649 }
650 """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
651 MessageKind.INVALID_OVERRIDE_METHOD],
652 infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
653 MessageKind.INVALID_OVERRIDDEN_METHOD]);
654 }
655
656 testSetterNotSubtype() {
657 check("""
658 class A {
659 set setter(_) => null; // testSetterNotSubtype:1
660 }
661 class Class extends A {
662 set setter(_) => null; // testSetterNotSubtype:2
663 }
664 """);
665
666 check("""
667 class A {
668 void set setter(_) {} // testSetterNotSubtype:3
669 }
670 class Class extends A {
671 set setter(_) => null; // testSetterNotSubtype:4
672 }
673 """);
674
675 check("""
676 class A {
677 set setter(_) => null; // testSetterNotSubtype:5
678 }
679 class Class extends A {
680 void set setter(_) {} // testSetterNotSubtype:6
681 }
682 """);
683
684 check("""
685 class A {
686 set setter(_) => null; // testSetterNotSubtype:7
687 }
688 class Class extends A {
689 void set setter(_) {} // testSetterNotSubtype:8
690 }
691 """);
692
693 check("""
694 class A {
695 set setter(num _) => null; // testSetterNotSubtype:9
696 }
697 class Class extends A {
698 set setter(num _) => null; // testSetterNotSubtype:10
699 }
700 """);
701
702 check("""
703 class A {
704 set setter(num _) => null; // testSetterNotSubtype:11
705 }
706 class Class extends A {
707 set setter(int _) => null; // testSetterNotSubtype:12
708 }
709 """);
710
711 check("""
712 class A {
713 set setter(int _) => null; // testSetterNotSubtype:13
714 }
715 class Class extends A {
716 set setter(num _) => null; // testSetterNotSubtype:14
717 }
718 """);
719
720 check("""
721 class A {
722 set setter(int _) => null; // testSetterNotSubtype:15
723 }
724 class Class extends A {
725 set setter(double _) => null; // testSetterNotSubtype:16
726 }
727 """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
728 infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
729
730 check("""
731 class A {
732 set setter(int _) => null; // testSetterNotSubtype:17
733 }
734 class B extends A {
735 set setter(num _) => null; // testSetterNotSubtype:18
736 }
737 class Class extends B {
738 set setter(double _) => null; // testSetterNotSubtype:19
739 }
740 """);
741
742 check("""
743 class A {
744 set setter(int _) => null; // testSetterNotSubtype:20
745 }
746 class B {
747 set setter(num _) => null; // testSetterNotSubtype:21
748 }
749 class Class extends A implements B {
750 set setter(double _) => null; // testSetterNotSubtype:22
751 }
752 """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
753 infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
754
755 check("""
756 class A {
757 set setter(int _) => null; // testSetterNotSubtype:23
758 }
759 class B {
760 set setter(String _) => null; // testSetterNotSubtype:24
761 }
762 class Class extends A implements B {
763 set setter(double _) => null; // testSetterNotSubtype:25
764 }
765 """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
766 MessageKind.INVALID_OVERRIDE_SETTER],
767 infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
768 MessageKind.INVALID_OVERRIDDEN_SETTER]);
769
770 check("""
771 class A {
772 set setter(int _) => null; // testSetterNotSubtype:26
773 }
774 class B {
775 set setter(String _) => null; // testSetterNotSubtype:27
776 }
777 class Class implements A, B {
778 set setter(double _) => null; // testSetterNotSubtype:28
779 }
780 """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
781 MessageKind.INVALID_OVERRIDE_SETTER],
782 infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
783 MessageKind.INVALID_OVERRIDDEN_SETTER]);
784
785 check("""
786 class A {
787 set setter(int _) => null; // testSetterNotSubtype:29
788 }
789 class B {
790 set setter(num _) => null; // testSetterNotSubtype:30
791 }
792 abstract class C implements A, B {
793 }
794 class Class implements C {
795 set setter(double _) => null; // testSetterNotSubtype:31
796 }
797 """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
798 infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
799
800 check("""
801 class A {
802 set setter(int _) => null; // testSetterNotSubtype:32
803 }
804 class B {
805 set setter(num _) => null; // testSetterNotSubtype:33
806 }
807 abstract class C implements A, B {
808 }
809 class Class implements C {
810 set setter(String _) => null; // testSetterNotSubtype:34
811 }
812 """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
813 MessageKind.INVALID_OVERRIDE_SETTER],
814 infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
815 MessageKind.INVALID_OVERRIDDEN_SETTER]);
816 }
817
818 testFieldNotSubtype() {
819 check("""
820 class A {
821 int field; // testFieldNotSubtype:1
822 }
823 class Class extends A {
824 int field; // testFieldNotSubtype:2
825 }
826 """);
827
828 check("""
829 class A {
830 num field; // testFieldNotSubtype:3
831 }
832 class Class extends A {
833 int field; // testFieldNotSubtype:4
834 }
835 """);
836
837 check("""
838 class A {
839 int field; // testFieldNotSubtype:5
840 }
841 class Class extends A {
842 num field; // testFieldNotSubtype:6
843 }
844 """);
845
846 check("""
847 class A {
848 int field; // testFieldNotSubtype:7
849 }
850 class Class extends A {
851 double field; // testFieldNotSubtype:8
852 }
853 """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
854 infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
855
856 check("""
857 class A {
858 int field; // testFieldNotSubtype:9
859 }
860 class B extends A {
861 num field; // testFieldNotSubtype:10
862 }
863 class Class extends B {
864 double field; // testFieldNotSubtype:11
865 }
866 """);
867
868 check("""
869 class A {
870 num field; // testFieldNotSubtype:12
871 }
872 class Class extends A {
873 int get field => null; // testFieldNotSubtype:13
874 }
875 """);
876
877 check("""
878 class A {
879 num field; // testFieldNotSubtype:14
880 }
881 class Class extends A {
882 String get field => null; // testFieldNotSubtype:15
883 }
884 """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
885 infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
886
887 check("""
888 class A {
889 num get field => null; // testFieldNotSubtype:16
890 }
891 class Class extends A {
892 String field; // testFieldNotSubtype:17
893 }
894 """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
895 infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
896
897 check("""
898 class A {
899 num field; // testFieldNotSubtype:18
900 }
901 class Class extends A {
902 set field(int _) {} // testFieldNotSubtype:19
903 }
904 """);
905
906 check("""
907 class A {
908 num field; // testFieldNotSubtype:19
909 }
910 class Class extends A {
911 void set field(int _) {} // testFieldNotSubtype:20
912 }
913 """);
914
915 check("""
916 class A {
917 set field(int _) {} // testFieldNotSubtype:21
918 }
919 class Class extends A {
920 num field; // testFieldNotSubtype:22
921 }
922 """);
923
924 check("""
925 class A {
926 void set field(int _) {} // testFieldNotSubtype:23
927 }
928 class Class extends A {
929 num field; // testFieldNotSubtype:24
930 }
931 """);
932
933 check("""
934 class A {
935 num field; // testFieldNotSubtype:25
936 }
937 class Class extends A {
938 set field(String _) {} // testFieldNotSubtype:26
939 }
940 """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
941 infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
942
943 check("""
944 class A {
945 set field(num _) {} // testFieldNotSubtype:27
946 }
947 class Class extends A {
948 String field; // testFieldNotSubtype:28
949 }
950 """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
951 infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
952
953 check("""
954 class A {
955 int field; // testFieldNotSubtype:29
956 }
957 class Class implements A {
958 String get field => null; // testFieldNotSubtype:30
959 void set field(String s) {} // testFieldNotSubtype:31
960 }
961 """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
962 MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
963 infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
964 MessageKind.INVALID_OVERRIDDEN_FIELD]);
965
966
967 check("""
968 class A {
969 String get field => null; // testFieldNotSubtype:32
970 void set field(String s) {} // testFieldNotSubtype:33
971 }
972 class Class implements A {
973 int field; // testFieldNotSubtype:34
974 }
975 """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
976 MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
977 infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
978 MessageKind.INVALID_OVERRIDDEN_SETTER]);
979 }
980
981 testMixedOverride() {
982 check("""
983 class A {
984 var member; // testMixedOverride:1
985 }
986 class Class extends A {
987 member() {} // testMixedOverride:2
988 }
989 """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
990 infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);
991
992 check("""
993 class A {
994 member() {} // testMixedOverride:3
995 }
996 class Class extends A {
997 var member; // testMixedOverride:4
998 }
999 """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
1000 infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);
1001
1002 check("""
1003 class A {
1004 get member => null; // testMixedOverride:5
1005 }
1006 class Class extends A {
1007 member() {} // testMixedOverride:6
1008 }
1009 """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
1010 infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);
1011
1012 check("""
1013 class A {
1014 member() {} // testMixedOverride:7
1015 }
1016 class Class extends A {
1017 get member => null; // testMixedOverride:8
1018 }
1019 """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
1020 infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT);
1021
1022 check("""
1023 abstract class A {
1024 var member; // testMixedOverride:9
1025 }
1026 abstract class B {
1027 get member; // testMixedOverride:10
1028 }
1029 abstract class Class implements A, B {
1030 }
1031 """);
1032
1033 check("""
1034 abstract class A {
1035 var member; // testMixedOverride:11
1036 }
1037 abstract class B {
1038 member() {} // testMixedOverride:12
1039 }
1040 abstract class Class implements A, B {
1041 }
1042 """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
1043 infos: [MessageKind.INHERITED_METHOD,
1044 MessageKind.INHERITED_IMPLICIT_GETTER]);
1045
1046 check("""
1047 abstract class A {
1048 get member; // testMixedOverride:13
1049 }
1050 abstract class B {
1051 member() {} // testMixedOverride:14
1052 }
1053 abstract class Class implements A, B {
1054 }
1055 """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
1056 infos: [MessageKind.INHERITED_METHOD,
1057 MessageKind.INHERITED_EXPLICIT_GETTER]);
1058
1059 check("""
1060 abstract class A {
1061 get member; // testMixedOverride:15
1062 }
1063 abstract class B {
1064 member() {} // testMixedOverride:16
1065 }
1066 abstract class C {
1067 var member; // testMixedOverride:17
1068 }
1069 abstract class D {
1070 member() {} // testMixedOverride:18
1071 }
1072 abstract class E {
1073 get member; // testMixedOverride:19
1074 }
1075 abstract class Class implements A, B, C, D, E {
1076 }
1077 """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
1078 infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
1079 MessageKind.INHERITED_METHOD,
1080 MessageKind.INHERITED_IMPLICIT_GETTER,
1081 MessageKind.INHERITED_METHOD,
1082 MessageKind.INHERITED_EXPLICIT_GETTER]);
1083
1084 check("""
1085 abstract class A {
1086 get member; // testMixedOverride:20
1087 }
1088 abstract class B {
1089 member() {} // testMixedOverride:21
1090 }
1091 abstract class C implements A, B {
1092 }
1093 class Class extends C {
1094 member() {} // testMixedOverride:22
1095 }
1096 """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
1097 warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
1098 infos: [MessageKind.INHERITED_METHOD,
1099 MessageKind.INHERITED_EXPLICIT_GETTER,
1100 MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]);
1101
1102 check("""
1103 abstract class A {
1104 get member; // testMixedOverride:23
1105 }
1106 abstract class B {
1107 member() {} // testMixedOverride:24
1108 }
1109 abstract class C implements A, B {
1110 }
1111 class Class extends C {
1112 get member => null; // testMixedOverride:25
1113 }
1114 """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
1115 warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
1116 infos: [MessageKind.INHERITED_METHOD,
1117 MessageKind.INHERITED_EXPLICIT_GETTER,
1118 MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]);
1119 }
1120
1121 testAbstractMethods() {
1122 check("""
1123 abstract class Class {
1124 method(); // testAbstractMethod:1
1125 }
1126 """);
1127
1128 check("""
1129 class Class {
1130 method(); // testAbstractMethod:2
1131 }
1132 """, warnings: MessageKind.ABSTRACT_METHOD,
1133 infos: []);
1134
1135 check("""
1136 class Class {
1137 get getter; // testAbstractMethod:3
1138 }
1139 """, warnings: MessageKind.ABSTRACT_GETTER,
1140 infos: []);
1141
1142 check("""
1143 class Class {
1144 set setter(_); // testAbstractMethod:4
1145 }
1146 """, warnings: MessageKind.ABSTRACT_SETTER,
1147 infos: []);
1148
1149 check("""
1150 abstract class A {
1151 method(); // testAbstractMethod:5
1152 }
1153 class Class extends A {
1154 method() {} // testAbstractMethod:6
1155 }
1156 """);
1157
1158 check("""
1159 abstract class A {
1160 method(); // testAbstractMethod:7
1161 }
1162 class Class extends A {
1163 method([a]) {} // testAbstractMethod:8
1164 }
1165 """);
1166
1167 check("""
1168 abstract class A {
1169 method(); // testAbstractMethod:9
1170 }
1171 class Class extends A {
1172 }
1173 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1174 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1175
1176 check("""
1177 abstract class A {
1178 get getter; // testAbstractMethod:10
1179 }
1180 class Class extends A {
1181 }
1182 """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
1183 infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);
1184
1185 check("""
1186 abstract class A {
1187 set setter(_); // testAbstractMethod:11
1188 }
1189 class Class extends A {
1190 }
1191 """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
1192 infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);
1193
1194 check("""
1195 abstract class A {
1196 method(); // testAbstractMethod:12
1197 }
1198 class B {
1199 method() {} // testAbstractMethod:13
1200 }
1201 class Class extends A implements B {
1202 }
1203 """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
1204 infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
1205 MessageKind.UNIMPLEMENTED_METHOD_CONT]);
1206
1207 check("""
1208 abstract class A {
1209 get getter; // testAbstractMethod:14
1210 }
1211 class B {
1212 get getter => 0; // testAbstractMethod:15
1213 }
1214 class Class extends A implements B {
1215 }
1216 """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
1217 infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
1218 MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]);
1219
1220 check("""
1221 abstract class A {
1222 set setter(_); // testAbstractMethod:16
1223 }
1224 class B {
1225 set setter(_) {} // testAbstractMethod:17
1226 }
1227 class Class extends A implements B {
1228 }
1229 """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
1230 infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
1231 MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]);
1232
1233 check("""
1234 abstract class A {
1235 get field; // testAbstractMethod:18
1236 }
1237 class B {
1238 var field; // testAbstractMethod:19
1239 }
1240 class Class extends A implements B {
1241 set field(_) {} // testAbstractMethod:20
1242 }
1243 """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
1244 infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
1245 MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]);
1246
1247 check("""
1248 abstract class A {
1249 set field(_); // testAbstractMethod:21
1250 }
1251 class B {
1252 var field; // testAbstractMethod:22
1253 }
1254 class Class extends A implements B {
1255 get field => 0; // testAbstractMethod:23
1256 }
1257 """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
1258 infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
1259 MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
1260
1261 check("""
1262 class A {
1263 method() {} // testAbstractMethod:24
1264 }
1265 class Class implements A {
1266 method() {} // testAbstractMethod:25
1267 }
1268 """);
1269
1270 check("""
1271 class A {
1272 method() {} // testAbstractMethod:26
1273 }
1274 class Class implements A {
1275 method([a]) {} // testAbstractMethod:27
1276 }
1277 """);
1278
1279 check("""
1280 class A {
1281 method() {} // testAbstractMethod:28
1282 }
1283 class Class implements A {
1284 }
1285 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1286 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1287
1288 check("""
1289 class A {
1290 method() {} // testAbstractMethod:29
1291 }
1292 class B {
1293 method() {} // testAbstractMethod:30
1294 }
1295 class Class extends A implements B {
1296 }
1297 """);
1298
1299 check("""
1300 class A {
1301 var member; // testAbstractMethod:31
1302 }
1303 class Class implements A {
1304 }
1305 """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
1306 MessageKind.UNIMPLEMENTED_SETTER_ONE],
1307 infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
1308 MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
1309
1310 check("""
1311 class A {
1312 var member; // testAbstractMethod:32
1313 }
1314 class B {
1315 get member => null; // testAbstractMethod:33
1316 set member(_) {} // testAbstractMethod:34
1317 }
1318 class Class implements A, B {
1319 }
1320 """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
1321 MessageKind.UNIMPLEMENTED_SETTER],
1322 infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
1323 MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
1324 MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
1325 MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
1326
1327 check("""
1328 class A {
1329 var member; // testAbstractMethod:35
1330 }
1331 class B {
1332 var member; // testAbstractMethod:36
1333 }
1334 class Class implements A, B {
1335 }
1336 """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
1337 MessageKind.UNIMPLEMENTED_SETTER],
1338 infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
1339 MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
1340 MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
1341 MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
1342
1343 check("""
1344 class A {
1345 get member => 0; // testAbstractMethod:37
1346 }
1347 class Class implements A {
1348 }
1349 """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
1350 infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);
1351
1352 check("""
1353 class A {
1354 set member(_) {} // testAbstractMethod:38
1355 }
1356 class Class implements A {
1357 }
1358 """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
1359 infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);
1360
1361 check("""
1362 class A {
1363 var member; // testAbstractMethod:39
1364 }
1365 class Class implements A {
1366 get member => 0;
1367 }
1368 """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
1369 infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
1370
1371 check("""
1372 class A {
1373 var field; // testAbstractMethod:40
1374 }
1375 class Class implements A {
1376 final field = 0; // testAbstractMethod:41
1377 }
1378 """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
1379 infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
1380
1381 check("""
1382 class A {
1383 var member; // testAbstractMethod:42
1384 }
1385 class Class implements A {
1386 set member(_) {}
1387 }
1388 """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
1389 infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
1390
1391 check("""
1392 abstract class A {
1393 method() {} // testAbstractMethod:43
1394 }
1395 class Class extends A {
1396 method();
1397 }
1398 """);
1399 }
1400
1401 testNoSuchMethod() {
1402 check("""
1403 class Class {
1404 method(); // testNoSuchMethod:1
1405 }
1406 """, warnings: MessageKind.ABSTRACT_METHOD,
1407 infos: []);
1408
1409 check("""
1410 @proxy
1411 class Class {
1412 method(); // testNoSuchMethod:2
1413 }
1414 """);
1415
1416 check("""
1417 class Class {
1418 noSuchMethod(_) => null;
1419 method(); // testNoSuchMethod:3
1420 }
1421 """);
1422
1423 check("""
1424 class Class {
1425 noSuchMethod(_, [__]) => null;
1426 method(); // testNoSuchMethod:4
1427 }
1428 """);
1429
1430 check("""
1431 class Class {
1432 noSuchMethod(_);
1433 method(); // testNoSuchMethod:5
1434 }
1435 """);
1436
1437 check("""
1438 abstract class A {
1439 method(); // testNoSuchMethod:6
1440 }
1441 class Class extends A {
1442 }
1443 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1444 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1445
1446 check("""
1447 abstract class A {
1448 method(); // testNoSuchMethod:7
1449 }
1450 @proxy
1451 class Class extends A {
1452 }
1453 """);
1454
1455 check("""
1456 abstract class A {
1457 method(); // testNoSuchMethod:8
1458 }
1459 class Class extends A {
1460 noSuchMethod(_) => null;
1461 }
1462 """);
1463
1464 check("""
1465 class A {
1466 method() {} // testNoSuchMethod:9
1467 }
1468 class Class implements A {
1469 }
1470 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1471 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1472
1473 check("""
1474 class A {
1475 method() {} // testNoSuchMethod:10
1476 }
1477 class Class implements A {
1478 }
1479 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1480 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1481
1482 check("""
karlklose 2014/01/28 12:27:45 I am not sure about this test. Please double check
Johnni Winther 2014/01/31 12:29:30 The spec has changed. Filed a bug with co19.
1483 class A {
1484 method() {} // testNoSuchMethod:11
1485 }
1486 @proxy
1487 class Class implements A {
1488 }
1489 """);
1490
1491 check("""
1492 class A {
1493 method() {} // testNoSuchMethod:12
1494 }
1495 class Class implements A {
1496 noSuchMethod(_) => null;
1497 }
1498 """);
1499
1500 check("""
1501 @proxy
1502 class A {
1503 method(); // testNoSuchMethod:13
1504 }
1505 class Class extends A {
1506 }
1507 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1508 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1509
1510 check("""
1511 class A {
1512 noSuchMethod(_) => null;
1513 method(); // testNoSuchMethod:14
1514 }
1515 class Class extends A {
1516 }
1517 """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
1518 infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
1519 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698