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

Side by Side Diff: packages/analyzer/test/generated/hint_code_test.dart

Issue 2990843002: Removed fixed dependencies (Closed)
Patch Set: Created 3 years, 4 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
OLDNEW
(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 library analyzer.test.generated.hint_code_test;
6
7 import 'package:analyzer/error/error.dart';
8 import 'package:analyzer/src/error/codes.dart';
9 import 'package:analyzer/src/generated/engine.dart';
10 import 'package:analyzer/src/generated/parser.dart';
11 import 'package:analyzer/src/generated/source_io.dart';
12 import 'package:test_reflective_loader/test_reflective_loader.dart';
13 import 'package:unittest/unittest.dart';
14
15 import '../utils.dart';
16 import 'analysis_context_factory.dart';
17 import 'resolver_test_case.dart';
18
19 main() {
20 initializeTestEnvironment();
21 defineReflectiveTests(HintCodeTest);
22 }
23
24 @reflectiveTest
25 class HintCodeTest extends ResolverTestCase {
26 @override
27 void reset() {
28 analysisContext2 = AnalysisContextFactory.contextWithCoreAndPackages({
29 'package:meta/meta.dart': r'''
30 library meta;
31
32 const _Factory factory = const _Factory();
33 const _Literal literal = const _Literal();
34 const _MustCallSuper mustCallSuper = const _MustCallSuper();
35 const _Protected protected = const _Protected();
36 const Required required = const Required();
37 class Required {
38 final String reason;
39 const Required([this.reason]);
40 }
41
42 class _Factory {
43 const _Factory();
44 }
45 class _Literal {
46 const _Literal();
47 }
48 class _MustCallSuper {
49 const _MustCallSuper();
50 }
51 class _Protected {
52 const _Protected();
53 }
54 class _Required {
55 final String reason;
56 const _Required([this.reason]));
57 }
58 ''',
59 'package:js/js.dart': r'''
60 library js;
61 class JS {
62 const JS([String js]) { }
63 }
64 '''
65 }, resourceProvider: resourceProvider);
66 }
67
68 void test_abstractSuperMemberReference_getter() {
69 Source source = addSource(r'''
70 abstract class A {
71 int get test;
72 }
73 class B extends A {
74 int get test {
75 super.test;
76 return 0;
77 }
78 }
79 ''');
80 computeLibrarySourceErrors(source);
81 assertErrors(source, [HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
82 verify([source]);
83 }
84
85 void test_abstractSuperMemberReference_method_invocation() {
86 Source source = addSource(r'''
87 abstract class A {
88 void test();
89 }
90 class B extends A {
91 void test() {
92 super.test();
93 }
94 }
95 ''');
96 computeLibrarySourceErrors(source);
97 assertErrors(source, [HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
98 verify([source]);
99 }
100
101 void test_abstractSuperMemberReference_method_reference() {
102 Source source = addSource(r'''
103 abstract class A {
104 void test();
105 }
106 class B extends A {
107 void test() {
108 super.test;
109 }
110 }
111 ''');
112 computeLibrarySourceErrors(source);
113 assertErrors(source, [HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
114 verify([source]);
115 }
116
117 void test_abstractSuperMemberReference_setter() {
118 Source source = addSource(r'''
119 abstract class A {
120 void set test(int v);
121 }
122 class B extends A {
123 void set test(int v){
124 super.test = 0;
125 }
126 }
127 ''');
128 computeLibrarySourceErrors(source);
129 assertErrors(source, [HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
130 verify([source]);
131 }
132
133 void test_argumentTypeNotAssignable_functionType() {
134 Source source = addSource(r'''
135 m() {
136 var a = new A();
137 a.n(() => 0);
138 }
139 class A {
140 n(void f(int i)) {}
141 }''');
142 computeLibrarySourceErrors(source);
143 assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
144 verify([source]);
145 }
146
147 void test_argumentTypeNotAssignable_message() {
148 // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
149 // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
150 expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message,
151 HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
152 }
153
154 void test_argumentTypeNotAssignable_type() {
155 Source source = addSource(r'''
156 m() {
157 var i = '';
158 n(i);
159 }
160 n(int i) {}''');
161 computeLibrarySourceErrors(source);
162 assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
163 verify([source]);
164 }
165
166 void test_canBeNullAfterNullAware_false_methodInvocation() {
167 Source source = addSource(r'''
168 m(x) {
169 x?.a()?.b();
170 }
171 ''');
172 computeLibrarySourceErrors(source);
173 assertNoErrors(source);
174 verify([source]);
175 }
176
177 void test_canBeNullAfterNullAware_false_null() {
178 Source source = addSource(r'''
179 m(x) {
180 x?.a.hashCode;
181 x?.a.runtimeType;
182 x?.a.toString();
183 x?.b().hashCode;
184 x?.b().runtimeType;
185 x?.b().toString();
186 }
187 ''');
188 computeLibrarySourceErrors(source);
189 assertNoErrors(source);
190 verify([source]);
191 }
192
193 void test_canBeNullAfterNullAware_false_propertyAccess() {
194 Source source = addSource(r'''
195 m(x) {
196 x?.a?.b;
197 }
198 ''');
199 computeLibrarySourceErrors(source);
200 assertNoErrors(source);
201 verify([source]);
202 }
203
204 void test_canBeNullAfterNullAware_methodInvocation() {
205 Source source = addSource(r'''
206 m(x) {
207 x?.a.b();
208 }
209 ''');
210 computeLibrarySourceErrors(source);
211 assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
212 verify([source]);
213 }
214
215 void test_canBeNullAfterNullAware_parenthesized() {
216 Source source = addSource(r'''
217 m(x) {
218 (x?.a).b;
219 }
220 ''');
221 computeLibrarySourceErrors(source);
222 assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
223 verify([source]);
224 }
225
226 void test_canBeNullAfterNullAware_propertyAccess() {
227 Source source = addSource(r'''
228 m(x) {
229 x?.a.b;
230 }
231 ''');
232 computeLibrarySourceErrors(source);
233 assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
234 verify([source]);
235 }
236
237 void test_deadCode_deadBlock_conditionalElse() {
238 Source source = addSource(r'''
239 f() {
240 true ? 1 : 2;
241 }''');
242 computeLibrarySourceErrors(source);
243 assertErrors(source, [HintCode.DEAD_CODE]);
244 verify([source]);
245 }
246
247 void test_deadCode_deadBlock_conditionalElse_nested() {
248 // test that a dead else-statement can't generate additional violations
249 Source source = addSource(r'''
250 f() {
251 true ? true : false && false;
252 }''');
253 computeLibrarySourceErrors(source);
254 assertErrors(source, [HintCode.DEAD_CODE]);
255 verify([source]);
256 }
257
258 void test_deadCode_deadBlock_conditionalIf() {
259 Source source = addSource(r'''
260 f() {
261 false ? 1 : 2;
262 }''');
263 computeLibrarySourceErrors(source);
264 assertErrors(source, [HintCode.DEAD_CODE]);
265 verify([source]);
266 }
267
268 void test_deadCode_deadBlock_conditionalIf_nested() {
269 // test that a dead then-statement can't generate additional violations
270 Source source = addSource(r'''
271 f() {
272 false ? false && false : true;
273 }''');
274 computeLibrarySourceErrors(source);
275 assertErrors(source, [HintCode.DEAD_CODE]);
276 verify([source]);
277 }
278
279 void test_deadCode_deadBlock_else() {
280 Source source = addSource(r'''
281 f() {
282 if(true) {} else {}
283 }''');
284 computeLibrarySourceErrors(source);
285 assertErrors(source, [HintCode.DEAD_CODE]);
286 verify([source]);
287 }
288
289 void test_deadCode_deadBlock_else_nested() {
290 // test that a dead else-statement can't generate additional violations
291 Source source = addSource(r'''
292 f() {
293 if(true) {} else {if (false) {}}
294 }''');
295 computeLibrarySourceErrors(source);
296 assertErrors(source, [HintCode.DEAD_CODE]);
297 verify([source]);
298 }
299
300 void test_deadCode_deadBlock_if() {
301 Source source = addSource(r'''
302 f() {
303 if(false) {}
304 }''');
305 computeLibrarySourceErrors(source);
306 assertErrors(source, [HintCode.DEAD_CODE]);
307 verify([source]);
308 }
309
310 void test_deadCode_deadBlock_if_nested() {
311 // test that a dead then-statement can't generate additional violations
312 Source source = addSource(r'''
313 f() {
314 if(false) {if(false) {}}
315 }''');
316 computeLibrarySourceErrors(source);
317 assertErrors(source, [HintCode.DEAD_CODE]);
318 verify([source]);
319 }
320
321 void test_deadCode_deadBlock_while() {
322 Source source = addSource(r'''
323 f() {
324 while(false) {}
325 }''');
326 computeLibrarySourceErrors(source);
327 assertErrors(source, [HintCode.DEAD_CODE]);
328 verify([source]);
329 }
330
331 void test_deadCode_deadBlock_while_nested() {
332 // test that a dead while body can't generate additional violations
333 Source source = addSource(r'''
334 f() {
335 while(false) {if(false) {}}
336 }''');
337 computeLibrarySourceErrors(source);
338 assertErrors(source, [HintCode.DEAD_CODE]);
339 verify([source]);
340 }
341
342 void test_deadCode_deadCatch_catchFollowingCatch() {
343 Source source = addSource(r'''
344 class A {}
345 f() {
346 try {} catch (e) {} catch (e) {}
347 }''');
348 computeLibrarySourceErrors(source);
349 assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
350 verify([source]);
351 }
352
353 void test_deadCode_deadCatch_catchFollowingCatch_nested() {
354 // test that a dead catch clause can't generate additional violations
355 Source source = addSource(r'''
356 class A {}
357 f() {
358 try {} catch (e) {} catch (e) {if(false) {}}
359 }''');
360 computeLibrarySourceErrors(source);
361 assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
362 verify([source]);
363 }
364
365 void test_deadCode_deadCatch_catchFollowingCatch_object() {
366 Source source = addSource(r'''
367 f() {
368 try {} on Object catch (e) {} catch (e) {}
369 }''');
370 computeLibrarySourceErrors(source);
371 assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
372 verify([source]);
373 }
374
375 void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
376 // test that a dead catch clause can't generate additional violations
377 Source source = addSource(r'''
378 f() {
379 try {} on Object catch (e) {} catch (e) {if(false) {}}
380 }''');
381 computeLibrarySourceErrors(source);
382 assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
383 verify([source]);
384 }
385
386 void test_deadCode_deadCatch_onCatchSubtype() {
387 Source source = addSource(r'''
388 class A {}
389 class B extends A {}
390 f() {
391 try {} on A catch (e) {} on B catch (e) {}
392 }''');
393 computeLibrarySourceErrors(source);
394 assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
395 verify([source]);
396 }
397
398 void test_deadCode_deadCatch_onCatchSubtype_nested() {
399 // test that a dead catch clause can't generate additional violations
400 Source source = addSource(r'''
401 class A {}
402 class B extends A {}
403 f() {
404 try {} on A catch (e) {} on B catch (e) {if(false) {}}
405 }''');
406 computeLibrarySourceErrors(source);
407 assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
408 verify([source]);
409 }
410
411 void test_deadCode_deadFinalReturnInCase() {
412 Source source = addSource(r'''
413 f() {
414 switch (true) {
415 case true:
416 try {
417 int a = 1;
418 } finally {
419 return;
420 }
421 return;
422 default:
423 break;
424 }
425 }''');
426 computeLibrarySourceErrors(source);
427 assertErrors(source, [HintCode.DEAD_CODE]);
428 verify([source]);
429 }
430
431 void test_deadCode_deadFinalStatementInCase() {
432 Source source = addSource(r'''
433 f() {
434 switch (true) {
435 case true:
436 try {
437 int a = 1;
438 } finally {
439 return;
440 }
441 int b = 1;
442 default:
443 break;
444 }
445 }''');
446 computeLibrarySourceErrors(source);
447 // A single dead statement at the end of a switch case that is not a
448 // terminating statement will yield two errors.
449 assertErrors(source,
450 [HintCode.DEAD_CODE, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
451 verify([source]);
452 }
453
454 void test_deadCode_deadOperandLHS_and() {
455 Source source = addSource(r'''
456 f() {
457 bool b = false && false;
458 }''');
459 computeLibrarySourceErrors(source);
460 assertErrors(source, [HintCode.DEAD_CODE]);
461 verify([source]);
462 }
463
464 void test_deadCode_deadOperandLHS_and_nested() {
465 Source source = addSource(r'''
466 f() {
467 bool b = false && (false && false);
468 }''');
469 computeLibrarySourceErrors(source);
470 assertErrors(source, [HintCode.DEAD_CODE]);
471 verify([source]);
472 }
473
474 void test_deadCode_deadOperandLHS_or() {
475 Source source = addSource(r'''
476 f() {
477 bool b = true || true;
478 }''');
479 computeLibrarySourceErrors(source);
480 assertErrors(source, [HintCode.DEAD_CODE]);
481 verify([source]);
482 }
483
484 void test_deadCode_deadOperandLHS_or_nested() {
485 Source source = addSource(r'''
486 f() {
487 bool b = true || (false && false);
488 }''');
489 computeLibrarySourceErrors(source);
490 assertErrors(source, [HintCode.DEAD_CODE]);
491 verify([source]);
492 }
493
494 void test_deadCode_statementAfterBreak_inDefaultCase() {
495 Source source = addSource(r'''
496 f(v) {
497 switch(v) {
498 case 1:
499 default:
500 break;
501 var a;
502 }
503 }''');
504 computeLibrarySourceErrors(source);
505 assertErrors(source, [HintCode.DEAD_CODE]);
506 verify([source]);
507 }
508
509 void test_deadCode_statementAfterBreak_inForEachStatement() {
510 Source source = addSource(r'''
511 f() {
512 var list;
513 for(var l in list) {
514 break;
515 var a;
516 }
517 }''');
518 computeLibrarySourceErrors(source);
519 assertErrors(source, [HintCode.DEAD_CODE]);
520 verify([source]);
521 }
522
523 void test_deadCode_statementAfterBreak_inForStatement() {
524 Source source = addSource(r'''
525 f() {
526 for(;;) {
527 break;
528 var a;
529 }
530 }''');
531 computeLibrarySourceErrors(source);
532 assertErrors(source, [HintCode.DEAD_CODE]);
533 verify([source]);
534 }
535
536 void test_deadCode_statementAfterBreak_inSwitchCase() {
537 Source source = addSource(r'''
538 f(v) {
539 switch(v) {
540 case 1:
541 break;
542 var a;
543 }
544 }''');
545 computeLibrarySourceErrors(source);
546 assertErrors(source, [HintCode.DEAD_CODE]);
547 verify([source]);
548 }
549
550 void test_deadCode_statementAfterBreak_inWhileStatement() {
551 Source source = addSource(r'''
552 f(v) {
553 while(v) {
554 break;
555 var a;
556 }
557 }''');
558 computeLibrarySourceErrors(source);
559 assertErrors(source, [HintCode.DEAD_CODE]);
560 verify([source]);
561 }
562
563 void test_deadCode_statementAfterContinue_inForEachStatement() {
564 Source source = addSource(r'''
565 f() {
566 var list;
567 for(var l in list) {
568 continue;
569 var a;
570 }
571 }''');
572 computeLibrarySourceErrors(source);
573 assertErrors(source, [HintCode.DEAD_CODE]);
574 verify([source]);
575 }
576
577 void test_deadCode_statementAfterContinue_inForStatement() {
578 Source source = addSource(r'''
579 f() {
580 for(;;) {
581 continue;
582 var a;
583 }
584 }''');
585 computeLibrarySourceErrors(source);
586 assertErrors(source, [HintCode.DEAD_CODE]);
587 verify([source]);
588 }
589
590 void test_deadCode_statementAfterContinue_inWhileStatement() {
591 Source source = addSource(r'''
592 f(v) {
593 while(v) {
594 continue;
595 var a;
596 }
597 }''');
598 computeLibrarySourceErrors(source);
599 assertErrors(source, [HintCode.DEAD_CODE]);
600 verify([source]);
601 }
602
603 void test_deadCode_statementAfterExitingIf_returns() {
604 Source source = addSource(r'''
605 f() {
606 if (1 > 2) {
607 return;
608 } else {
609 return;
610 }
611 var one = 1;
612 }''');
613 computeLibrarySourceErrors(source);
614 assertErrors(source, [HintCode.DEAD_CODE]);
615 verify([source]);
616 }
617
618 void test_deadCode_statementAfterRethrow() {
619 Source source = addSource(r'''
620 f() {
621 try {
622 var one = 1;
623 } catch (e) {
624 rethrow;
625 var two = 2;
626 }
627 }''');
628 computeLibrarySourceErrors(source);
629 assertErrors(source, [HintCode.DEAD_CODE]);
630 verify([source]);
631 }
632
633 void test_deadCode_statementAfterReturn_function() {
634 Source source = addSource(r'''
635 f() {
636 var one = 1;
637 return;
638 var two = 2;
639 }''');
640 computeLibrarySourceErrors(source);
641 assertErrors(source, [HintCode.DEAD_CODE]);
642 verify([source]);
643 }
644
645 void test_deadCode_statementAfterReturn_ifStatement() {
646 Source source = addSource(r'''
647 f(bool b) {
648 if(b) {
649 var one = 1;
650 return;
651 var two = 2;
652 }
653 }''');
654 computeLibrarySourceErrors(source);
655 assertErrors(source, [HintCode.DEAD_CODE]);
656 verify([source]);
657 }
658
659 void test_deadCode_statementAfterReturn_method() {
660 Source source = addSource(r'''
661 class A {
662 m() {
663 var one = 1;
664 return;
665 var two = 2;
666 }
667 }''');
668 computeLibrarySourceErrors(source);
669 assertErrors(source, [HintCode.DEAD_CODE]);
670 verify([source]);
671 }
672
673 void test_deadCode_statementAfterReturn_nested() {
674 Source source = addSource(r'''
675 f() {
676 var one = 1;
677 return;
678 if(false) {}
679 }''');
680 computeLibrarySourceErrors(source);
681 assertErrors(source, [HintCode.DEAD_CODE]);
682 verify([source]);
683 }
684
685 void test_deadCode_statementAfterReturn_twoReturns() {
686 Source source = addSource(r'''
687 f() {
688 var one = 1;
689 return;
690 var two = 2;
691 return;
692 var three = 3;
693 }''');
694 computeLibrarySourceErrors(source);
695 assertErrors(source, [HintCode.DEAD_CODE]);
696 verify([source]);
697 }
698
699 void test_deadCode_statementAfterThrow() {
700 Source source = addSource(r'''
701 f() {
702 var one = 1;
703 throw 'Stop here';
704 var two = 2;
705 }''');
706 computeLibrarySourceErrors(source);
707 assertErrors(source, [HintCode.DEAD_CODE]);
708 verify([source]);
709 }
710
711 void test_deprecatedAnnotationUse_assignment() {
712 Source source = addSource(r'''
713 class A {
714 @deprecated
715 A operator+(A a) { return a; }
716 }
717 f(A a) {
718 A b;
719 a += b;
720 }''');
721 computeLibrarySourceErrors(source);
722 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
723 verify([source]);
724 }
725
726 void test_deprecatedAnnotationUse_call() {
727 Source source = addSource(r'''
728 class A {
729 @deprecated
730 call() {}
731 m() {
732 A a = new A();
733 a();
734 }
735 }''');
736 computeLibrarySourceErrors(source);
737 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
738 verify([source]);
739 }
740
741 void test_deprecatedAnnotationUse_deprecated() {
742 Source source = addSource(r'''
743 class A {
744 @deprecated
745 m() {}
746 n() {m();}
747 }''');
748 computeLibrarySourceErrors(source);
749 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
750 verify([source]);
751 }
752
753 void test_deprecatedAnnotationUse_Deprecated() {
754 Source source = addSource(r'''
755 class A {
756 @Deprecated('0.9')
757 m() {}
758 n() {m();}
759 }''');
760 computeLibrarySourceErrors(source);
761 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
762 verify([source]);
763 }
764
765 void test_deprecatedAnnotationUse_export() {
766 Source source = addSource("export 'deprecated_library.dart';");
767 addNamedSource(
768 "/deprecated_library.dart",
769 r'''
770 @deprecated
771 library deprecated_library;
772 class A {}''');
773 computeLibrarySourceErrors(source);
774 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
775 verify([source]);
776 }
777
778 void test_deprecatedAnnotationUse_field() {
779 Source source = addSource(r'''
780 class A {
781 @deprecated
782 int x = 1;
783 }
784 f(A a) {
785 return a.x;
786 }''');
787 computeLibrarySourceErrors(source);
788 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
789 verify([source]);
790 }
791
792 void test_deprecatedAnnotationUse_getter() {
793 Source source = addSource(r'''
794 class A {
795 @deprecated
796 get m => 1;
797 }
798 f(A a) {
799 return a.m;
800 }''');
801 computeLibrarySourceErrors(source);
802 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
803 verify([source]);
804 }
805
806 void test_deprecatedAnnotationUse_import() {
807 Source source = addSource(r'''
808 import 'deprecated_library.dart';
809 f(A a) {}''');
810 addNamedSource(
811 "/deprecated_library.dart",
812 r'''
813 @deprecated
814 library deprecated_library;
815 class A {}''');
816 computeLibrarySourceErrors(source);
817 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
818 verify([source]);
819 }
820
821 void test_deprecatedAnnotationUse_indexExpression() {
822 Source source = addSource(r'''
823 class A {
824 @deprecated
825 operator[](int i) {}
826 }
827 f(A a) {
828 return a[1];
829 }''');
830 computeLibrarySourceErrors(source);
831 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
832 verify([source]);
833 }
834
835 void test_deprecatedAnnotationUse_instanceCreation() {
836 Source source = addSource(r'''
837 class A {
838 @deprecated
839 A(int i) {}
840 }
841 f() {
842 A a = new A(1);
843 }''');
844 computeLibrarySourceErrors(source);
845 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
846 verify([source]);
847 }
848
849 void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
850 Source source = addSource(r'''
851 class A {
852 @deprecated
853 A.named(int i) {}
854 }
855 f() {
856 A a = new A.named(1);
857 }''');
858 computeLibrarySourceErrors(source);
859 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
860 verify([source]);
861 }
862
863 void test_deprecatedAnnotationUse_named() {
864 Source source = addSource(r'''
865 class A {
866 m({@deprecated int x}) {}
867 n() {m(x: 1);}
868 }''');
869 computeLibrarySourceErrors(source);
870 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
871 verify([source]);
872 }
873
874 void test_deprecatedAnnotationUse_operator() {
875 Source source = addSource(r'''
876 class A {
877 @deprecated
878 operator+(A a) {}
879 }
880 f(A a) {
881 A b;
882 return a + b;
883 }''');
884 computeLibrarySourceErrors(source);
885 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
886 verify([source]);
887 }
888
889 void test_deprecatedAnnotationUse_positional() {
890 Source source = addSource(r'''
891 class A {
892 m([@deprecated int x]) {}
893 n() {m(1);}
894 }''');
895 computeLibrarySourceErrors(source);
896 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
897 verify([source]);
898 }
899
900 void test_deprecatedAnnotationUse_setter() {
901 Source source = addSource(r'''
902 class A {
903 @deprecated
904 set s(v) {}
905 }
906 f(A a) {
907 return a.s = 1;
908 }''');
909 computeLibrarySourceErrors(source);
910 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
911 verify([source]);
912 }
913
914 void test_deprecatedAnnotationUse_superConstructor() {
915 Source source = addSource(r'''
916 class A {
917 @deprecated
918 A() {}
919 }
920 class B extends A {
921 B() : super() {}
922 }''');
923 computeLibrarySourceErrors(source);
924 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
925 verify([source]);
926 }
927
928 void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
929 Source source = addSource(r'''
930 class A {
931 @deprecated
932 A.named() {}
933 }
934 class B extends A {
935 B() : super.named() {}
936 }''');
937 computeLibrarySourceErrors(source);
938 assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
939 verify([source]);
940 }
941
942 void test_divisionOptimization_double() {
943 Source source = addSource(r'''
944 f(double x, double y) {
945 var v = (x / y).toInt();
946 }''');
947 computeLibrarySourceErrors(source);
948 assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
949 verify([source]);
950 }
951
952 void test_divisionOptimization_int() {
953 Source source = addSource(r'''
954 f(int x, int y) {
955 var v = (x / y).toInt();
956 }''');
957 computeLibrarySourceErrors(source);
958 assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
959 verify([source]);
960 }
961
962 void test_divisionOptimization_propagatedType() {
963 // Tests the propagated type information of the '/' method
964 Source source = addSource(r'''
965 f(x, y) {
966 x = 1;
967 y = 1;
968 var v = (x / y).toInt();
969 }''');
970 computeLibrarySourceErrors(source);
971 assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
972 verify([source]);
973 }
974
975 void test_divisionOptimization_wrappedBinaryExpression() {
976 Source source = addSource(r'''
977 f(int x, int y) {
978 var v = (((x / y))).toInt();
979 }''');
980 computeLibrarySourceErrors(source);
981 assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
982 verify([source]);
983 }
984
985 void test_duplicateImport() {
986 Source source = addSource(r'''
987 library L;
988 import 'lib1.dart';
989 import 'lib1.dart';
990 A a;''');
991 addNamedSource(
992 "/lib1.dart",
993 r'''
994 library lib1;
995 class A {}''');
996 computeLibrarySourceErrors(source);
997 assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
998 verify([source]);
999 }
1000
1001 void test_duplicateImport2() {
1002 Source source = addSource(r'''
1003 library L;
1004 import 'lib1.dart';
1005 import 'lib1.dart';
1006 import 'lib1.dart';
1007 A a;''');
1008 addNamedSource(
1009 "/lib1.dart",
1010 r'''
1011 library lib1;
1012 class A {}''');
1013 computeLibrarySourceErrors(source);
1014 assertErrors(
1015 source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
1016 verify([source]);
1017 }
1018
1019 void test_duplicateImport3() {
1020 Source source = addSource(r'''
1021 library L;
1022 import 'lib1.dart' as M show A hide B;
1023 import 'lib1.dart' as M show A hide B;
1024 M.A a;''');
1025 addNamedSource(
1026 "/lib1.dart",
1027 r'''
1028 library lib1;
1029 class A {}
1030 class B {}''');
1031 computeLibrarySourceErrors(source);
1032 assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
1033 verify([source]);
1034 }
1035
1036 void test_factory__expr_return_null_OK() {
1037 Source source = addSource(r'''
1038 import 'package:meta/meta.dart';
1039
1040 class Stateful {
1041 @factory
1042 State createState() => null;
1043 }
1044
1045 class State { }
1046 ''');
1047 computeLibrarySourceErrors(source);
1048 assertNoErrors(source);
1049 verify([source]);
1050 }
1051
1052 void test_factory_abstract_OK() {
1053 Source source = addSource(r'''
1054 import 'package:meta/meta.dart';
1055
1056 abstract class Stateful {
1057 @factory
1058 State createState();
1059 }
1060
1061 class State { }
1062 ''');
1063 computeLibrarySourceErrors(source);
1064 assertNoErrors(source);
1065 verify([source]);
1066 }
1067
1068 void test_factory_bad_return() {
1069 Source source = addSource(r'''
1070 import 'package:meta/meta.dart';
1071
1072 class Stateful {
1073 State _s = new State();
1074
1075 @factory
1076 State createState() => _s;
1077 }
1078
1079 class State { }
1080 ''');
1081 computeLibrarySourceErrors(source);
1082 assertErrors(source, [HintCode.INVALID_FACTORY_METHOD_IMPL]);
1083 verify([source]);
1084 }
1085
1086 void test_factory_block_OK() {
1087 Source source = addSource(r'''
1088 import 'package:meta/meta.dart';
1089
1090 class Stateful {
1091 @factory
1092 State createState() {
1093 return new State();
1094 }
1095 }
1096
1097 class State { }
1098 ''');
1099 computeLibrarySourceErrors(source);
1100 assertNoErrors(source);
1101 verify([source]);
1102 }
1103
1104 void test_factory_block_return_null_OK() {
1105 Source source = addSource(r'''
1106 import 'package:meta/meta.dart';
1107
1108 class Stateful {
1109 @factory
1110 State createState() {
1111 return null;
1112 }
1113 }
1114
1115 class State { }
1116 ''');
1117 computeLibrarySourceErrors(source);
1118 assertNoErrors(source);
1119 verify([source]);
1120 }
1121
1122 void test_factory_expr_OK() {
1123 Source source = addSource(r'''
1124 import 'package:meta/meta.dart';
1125
1126 class Stateful {
1127 @factory
1128 State createState() => new State();
1129 }
1130
1131 class State { }
1132 ''');
1133 computeLibrarySourceErrors(source);
1134 assertNoErrors(source);
1135 verify([source]);
1136 }
1137
1138 void test_factory_misplaced_annotation() {
1139 Source source = addSource(r'''
1140 import 'package:meta/meta.dart';
1141
1142 @factory
1143 class X {
1144 @factory
1145 int x;
1146 }
1147
1148 @factory
1149 main() { }
1150 ''');
1151 computeLibrarySourceErrors(source);
1152 assertErrors(source, [
1153 HintCode.INVALID_FACTORY_ANNOTATION,
1154 HintCode.INVALID_FACTORY_ANNOTATION,
1155 HintCode.INVALID_FACTORY_ANNOTATION
1156 ]);
1157 verify([source]);
1158 }
1159
1160 void test_factory_no_return_type_OK() {
1161 Source source = addSource(r'''
1162 import 'package:meta/meta.dart';
1163
1164 class Stateful {
1165 @factory
1166 createState() {
1167 return new Stateful();
1168 }
1169 }
1170 ''');
1171 computeLibrarySourceErrors(source);
1172 // Null return types will get flagged elsewhere, no need to pile-on here.
1173 assertNoErrors(source);
1174 verify([source]);
1175 }
1176
1177 void test_factory_subclass_OK() {
1178 Source source = addSource(r'''
1179 import 'package:meta/meta.dart';
1180
1181 abstract class Stateful {
1182 @factory
1183 State createState();
1184 }
1185
1186 class MyThing extends Stateful {
1187 @override
1188 State createState() {
1189 print('my state');
1190 return new MyState();
1191 }
1192 }
1193
1194 class State { }
1195 class MyState extends State { }
1196 ''');
1197 computeLibrarySourceErrors(source);
1198 assertNoErrors(source);
1199 verify([source]);
1200 }
1201
1202 void test_factory_void_return() {
1203 Source source = addSource(r'''
1204 import 'package:meta/meta.dart';
1205
1206 class Stateful {
1207 @factory
1208 void createState() {}
1209 }
1210 ''');
1211 computeLibrarySourceErrors(source);
1212 assertErrors(source, [HintCode.INVALID_FACTORY_METHOD_DECL]);
1213 verify([source]);
1214 }
1215
1216 void test_importDeferredLibraryWithLoadFunction() {
1217 resolveWithErrors(<String>[
1218 r'''
1219 library lib1;
1220 loadLibrary() {}
1221 f() {}''',
1222 r'''
1223 library root;
1224 import 'lib1.dart' deferred as lib1;
1225 main() { lib1.f(); }'''
1226 ], <ErrorCode>[
1227 HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
1228 ]);
1229 }
1230
1231 void test_invalidAssignment_instanceVariable() {
1232 Source source = addSource(r'''
1233 class A {
1234 int x;
1235 }
1236 f(var y) {
1237 A a;
1238 if(y is String) {
1239 a.x = y;
1240 }
1241 }''');
1242 computeLibrarySourceErrors(source);
1243 assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
1244 verify([source]);
1245 }
1246
1247 void test_invalidAssignment_localVariable() {
1248 Source source = addSource(r'''
1249 f(var y) {
1250 if(y is String) {
1251 int x = y;
1252 }
1253 }''');
1254 computeLibrarySourceErrors(source);
1255 assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
1256 verify([source]);
1257 }
1258
1259 void test_invalidAssignment_message() {
1260 // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
1261 // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
1262 expect(StaticTypeWarningCode.INVALID_ASSIGNMENT.message,
1263 HintCode.INVALID_ASSIGNMENT.message);
1264 }
1265
1266 void test_invalidAssignment_staticVariable() {
1267 Source source = addSource(r'''
1268 class A {
1269 static int x;
1270 }
1271 f(var y) {
1272 if(y is String) {
1273 A.x = y;
1274 }
1275 }''');
1276 computeLibrarySourceErrors(source);
1277 assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
1278 verify([source]);
1279 }
1280
1281 void test_invalidAssignment_variableDeclaration() {
1282 // 17971
1283 Source source = addSource(r'''
1284 class Point {
1285 final num x, y;
1286 Point(this.x, this.y);
1287 Point operator +(Point other) {
1288 return new Point(x+other.x, y+other.y);
1289 }
1290 }
1291 main() {
1292 var p1 = new Point(0, 0);
1293 var p2 = new Point(10, 10);
1294 int n = p1 + p2;
1295 }''');
1296 computeLibrarySourceErrors(source);
1297 assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
1298 verify([source]);
1299 }
1300
1301 void test_invalidUseOfProtectedMember_closure() {
1302 Source source = addNamedSource(
1303 '/lib1.dart',
1304 r'''
1305 import 'package:meta/meta.dart';
1306
1307 class A {
1308 @protected
1309 int a() => 42;
1310 }
1311 ''');
1312 Source source2 = addNamedSource(
1313 '/lib2.dart',
1314 r'''
1315 import 'lib1.dart';
1316
1317 void main() {
1318 var leak = new A().a;
1319 print(leak);
1320 }
1321 ''');
1322 computeLibrarySourceErrors(source2);
1323 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1324 assertNoErrors(source);
1325 verify([source, source2]);
1326 }
1327
1328 void test_invalidUseOfProtectedMember_field() {
1329 Source source = addNamedSource(
1330 '/lib1.dart',
1331 r'''
1332 import 'package:meta/meta.dart';
1333 class A {
1334 @protected
1335 int a;
1336 }
1337 ''');
1338 Source source2 = addNamedSource(
1339 '/lib2.dart',
1340 r'''
1341 import 'lib1.dart';
1342
1343 abstract class B {
1344 int b() => new A().a;
1345 }
1346 ''');
1347 computeLibrarySourceErrors(source2);
1348 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1349 assertNoErrors(source);
1350 verify([source, source2]);
1351 }
1352
1353 void test_invalidUseOfProtectedMember_field_OK() {
1354 Source source = addSource(r'''
1355 import 'package:meta/meta.dart';
1356 class A {
1357 @protected
1358 int a;
1359 }
1360 abstract class B implements A {
1361 int b() => a;
1362 }''');
1363 computeLibrarySourceErrors(source);
1364 assertNoErrors(source);
1365 verify([source]);
1366 }
1367
1368 void test_invalidUseOfProtectedMember_function() {
1369 Source source = addNamedSource(
1370 '/lib1.dart',
1371 r'''
1372 import 'package:meta/meta.dart';
1373 class A {
1374 @protected
1375 void a(){ }
1376 }
1377 ''');
1378 Source source2 = addNamedSource(
1379 '/lib2.dart',
1380 r'''
1381 import 'lib1.dart';
1382
1383 main() {
1384 new A().a();
1385 }
1386 ''');
1387 computeLibrarySourceErrors(source2);
1388 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1389 assertNoErrors(source);
1390 verify([source, source2]);
1391 }
1392
1393 void test_invalidUseOfProtectedMember_function_OK() {
1394 Source source = addSource(r'''
1395 import 'package:meta/meta.dart';
1396 class A {
1397 @protected
1398 int a() => 0;
1399 }
1400
1401 abstract class B implements A {
1402 int b() => a();
1403 }''');
1404 computeLibrarySourceErrors(source);
1405 assertNoErrors(source);
1406 verify([source]);
1407 }
1408
1409 void test_invalidUseOfProtectedMember_function_OK2() {
1410 Source source = addSource(r'''
1411 import 'package:meta/meta.dart';
1412 class A {
1413 @protected
1414 void a(){ }
1415 }
1416 main() {
1417 new A().a();
1418 }''');
1419 computeLibrarySourceErrors(source);
1420 assertNoErrors(source);
1421 verify([source]);
1422 }
1423
1424 void test_invalidUseOfProtectedMember_getter() {
1425 Source source = addNamedSource(
1426 '/lib1.dart',
1427 r'''
1428 import 'package:meta/meta.dart';
1429 class A {
1430 @protected
1431 int get a => 42;
1432 }
1433 ''');
1434 Source source2 = addNamedSource(
1435 '/lib2.dart',
1436 r'''
1437 import 'lib1.dart';
1438
1439 class B {
1440 A a;
1441 int b() => a.a;
1442 }
1443 ''');
1444 computeLibrarySourceErrors(source2);
1445 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1446 assertNoErrors(source);
1447 verify([source, source2]);
1448 }
1449
1450 void test_invalidUseOfProtectedMember_getter_OK() {
1451 Source source = addSource(r'''
1452 import 'package:meta/meta.dart';
1453 class A {
1454 @protected
1455 int get a => 42;
1456 }
1457 abstract class B implements A {
1458 int b() => a;
1459 }''');
1460 computeLibrarySourceErrors(source);
1461 assertNoErrors(source);
1462 verify([source]);
1463 }
1464
1465 void test_invalidUseOfProtectedMember_in_docs_OK() {
1466 Source source = addSource(r'''
1467 import 'package:meta/meta.dart';
1468
1469 class A {
1470 @protected
1471 int a() => c;
1472 @protected
1473 int get b => a();
1474 @protected
1475 int c = 42;
1476 }
1477
1478 /// OK: [A.a], [A.b], [A.c].
1479 f() {}
1480 ''');
1481 computeLibrarySourceErrors(source);
1482 assertNoErrors(source);
1483 verify([source]);
1484 }
1485
1486 void test_invalidUseOfProtectedMember_message() {
1487 Source source = addNamedSource(
1488 '/lib1.dart',
1489 r'''
1490 import 'package:meta/meta.dart';
1491 class A {
1492 @protected
1493 void a(){ }
1494 }
1495 ''');
1496 Source source2 = addNamedSource(
1497 '/lib2.dart',
1498 r'''
1499 import 'lib1.dart';
1500
1501 class B {
1502 void b() => new A().a();
1503 }
1504 ''');
1505 List<AnalysisError> errors = analysisContext2.computeErrors(source2);
1506 expect(errors, hasLength(1));
1507 expect(errors[0].message,
1508 "The member 'a' can only be used within instance members of subclasses o f 'A'");
1509 verify([source, source2]);
1510 }
1511
1512 void test_invalidUseOfProtectedMember_method_1() {
1513 Source source = addNamedSource(
1514 '/lib1.dart',
1515 r'''
1516 import 'package:meta/meta.dart';
1517 class A {
1518 @protected
1519 void a(){ }
1520 }
1521 ''');
1522 Source source2 = addNamedSource(
1523 '/lib2.dart',
1524 r'''
1525 import 'lib1.dart';
1526
1527 class B {
1528 void b() => new A().a();
1529 }
1530 ''');
1531
1532 computeLibrarySourceErrors(source2);
1533 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1534 assertNoErrors(source);
1535 verify([source, source2]);
1536 }
1537
1538 void test_invalidUseOfProtectedMember_method_OK() {
1539 // https://github.com/dart-lang/linter/issues/257
1540 Source source = addSource(r'''
1541 import 'package:meta/meta.dart';
1542
1543 typedef void VoidCallback();
1544
1545 class State<E> {
1546 @protected
1547 void setState(VoidCallback fn) {}
1548 }
1549
1550 class Button extends State<Object> {
1551 void handleSomething() {
1552 setState(() {});
1553 }
1554 }
1555 ''');
1556 computeLibrarySourceErrors(source);
1557 assertNoErrors(source);
1558 verify([source]);
1559 }
1560
1561 void test_invalidUseOfProtectedMember_OK_1() {
1562 Source source = addSource(r'''
1563 import 'package:meta/meta.dart';
1564 class A {
1565 @protected
1566 void a(){ }
1567 }
1568 class B extends A {
1569 void b() => a();
1570 }''');
1571 computeLibrarySourceErrors(source);
1572 assertNoErrors(source);
1573 verify([source]);
1574 }
1575
1576 void test_invalidUseOfProtectedMember_OK_2() {
1577 Source source = addSource(r'''
1578 import 'package:meta/meta.dart';
1579 class A {
1580 @protected
1581 void a(){ }
1582 }
1583 class B extends Object with A {
1584 void b() => a();
1585 }''');
1586 computeLibrarySourceErrors(source);
1587 assertNoErrors(source);
1588 verify([source]);
1589 }
1590
1591 void test_invalidUseOfProtectedMember_OK_3() {
1592 Source source = addSource(r'''
1593 import 'package:meta/meta.dart';
1594 class A {
1595 @protected m1() {}
1596 }
1597 class B extends A {
1598 static m2(A a) => a.m1();
1599 }''');
1600 computeLibrarySourceErrors(source);
1601 assertNoErrors(source);
1602 verify([source]);
1603 }
1604
1605 void test_invalidUseOfProtectedMember_OK_4() {
1606 Source source = addSource(r'''
1607 import 'package:meta/meta.dart';
1608 class A {
1609 @protected
1610 void a(){ }
1611 }
1612 class B extends A {
1613 void a() => a();
1614 }
1615 main() {
1616 new B().a();
1617 }''');
1618 computeLibrarySourceErrors(source);
1619 assertNoErrors(source);
1620 verify([source]);
1621 }
1622
1623 void test_invalidUseOfProtectedMember_OK_field() {
1624 Source source = addSource(r'''
1625 import 'package:meta/meta.dart';
1626 class A {
1627 @protected
1628 int a = 42;
1629 }
1630 class B extends A {
1631 int b() => a;
1632 }
1633 ''');
1634 computeLibrarySourceErrors(source);
1635 assertNoErrors(source);
1636 verify([source]);
1637 }
1638
1639 void test_invalidUseOfProtectedMember_OK_getter() {
1640 Source source = addSource(r'''
1641 import 'package:meta/meta.dart';
1642 class A {
1643 @protected
1644 int get a => 42;
1645 }
1646 class B extends A {
1647 int b() => a;
1648 }
1649 ''');
1650 computeLibrarySourceErrors(source);
1651 assertNoErrors(source);
1652 verify([source]);
1653 }
1654
1655 void test_invalidUseOfProtectedMember_OK_setter() {
1656 Source source = addSource(r'''
1657 import 'package:meta/meta.dart';
1658 class A {
1659 @protected
1660 void set a(int i) { }
1661 }
1662 class B extends A {
1663 void b(int i) {
1664 a = i;
1665 }
1666 }
1667 ''');
1668 computeLibrarySourceErrors(source);
1669 assertNoErrors(source);
1670 verify([source]);
1671 }
1672
1673 void test_invalidUseOfProtectedMember_OK_setter_2() {
1674 Source source = addSource(r'''
1675 import 'package:meta/meta.dart';
1676 class A {
1677 int _a;
1678 @protected
1679 void set a(int a) { _a = a; }
1680 A(int a) {
1681 this.a = a;
1682 }
1683 }
1684 ''');
1685 computeLibrarySourceErrors(source);
1686 assertNoErrors(source);
1687 verify([source]);
1688 }
1689
1690 void test_invalidUseOfProtectedMember_setter() {
1691 Source source = addNamedSource(
1692 '/lib1.dart',
1693 r'''
1694 import 'package:meta/meta.dart';
1695 class A {
1696 @protected
1697 void set a(int i) { }
1698 }
1699 ''');
1700 Source source2 = addNamedSource(
1701 '/lib2.dart',
1702 r'''
1703 import 'lib1.dart';
1704
1705 class B{
1706 A a;
1707 b(int i) {
1708 a.a = i;
1709 }
1710 }
1711 ''');
1712 computeLibrarySourceErrors(source2);
1713 assertErrors(source2, [HintCode.INVALID_USE_OF_PROTECTED_MEMBER]);
1714 assertNoErrors(source);
1715 verify([source, source2]);
1716 }
1717
1718 void test_invalidUseOfProtectedMember_setter_OK() {
1719 Source source = addSource(r'''
1720 import 'package:meta/meta.dart';
1721 class A {
1722 @protected
1723 void set a(int i) { }
1724 }
1725 abstract class B implements A {
1726 b(int i) {
1727 a = i;
1728 }
1729 }''');
1730 computeLibrarySourceErrors(source);
1731 assertNoErrors(source);
1732 verify([source]);
1733 }
1734
1735 void test_invalidUseOfProtectedMember_topLevelVariable() {
1736 Source source = addSource(r'''
1737 import 'package:meta/meta.dart';
1738 @protected
1739 int x = 0;
1740 main() {
1741 print(x);
1742 }''');
1743 computeLibrarySourceErrors(source);
1744 // TODO(brianwilkerson) This should produce a hint because the annotation is
1745 // being applied to the wrong kind of declaration.
1746 assertNoErrors(source);
1747 verify([source]);
1748 }
1749
1750 void test_isDouble() {
1751 AnalysisOptionsImpl options = new AnalysisOptionsImpl();
1752 options.dart2jsHint = true;
1753 resetWithOptions(options);
1754 Source source = addSource("var v = 1 is double;");
1755 computeLibrarySourceErrors(source);
1756 assertErrors(source, [HintCode.IS_DOUBLE]);
1757 verify([source]);
1758 }
1759
1760 @failingTest
1761 void test_isInt() {
1762 Source source = addSource("var v = 1 is int;");
1763 computeLibrarySourceErrors(source);
1764 assertErrors(source, [HintCode.IS_INT]);
1765 verify([source]);
1766 }
1767
1768 void test_isNotDouble() {
1769 AnalysisOptionsImpl options = new AnalysisOptionsImpl();
1770 options.dart2jsHint = true;
1771 resetWithOptions(options);
1772 Source source = addSource("var v = 1 is! double;");
1773 computeLibrarySourceErrors(source);
1774 assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
1775 verify([source]);
1776 }
1777
1778 @failingTest
1779 void test_isNotInt() {
1780 Source source = addSource("var v = 1 is! int;");
1781 computeLibrarySourceErrors(source);
1782 assertErrors(source, [HintCode.IS_NOT_INT]);
1783 verify([source]);
1784 }
1785
1786 void test_js_lib_OK() {
1787 Source source = addSource(r'''
1788 @JS()
1789 library foo;
1790
1791 import 'package:js/js.dart';
1792
1793 @JS()
1794 class A { }
1795 ''');
1796 computeLibrarySourceErrors(source);
1797 assertNoErrors(source);
1798 verify([source]);
1799 }
1800
1801 void test_missingJsLibAnnotation_class() {
1802 Source source = addSource(r'''
1803 library foo;
1804
1805 import 'package:js/js.dart';
1806
1807 @JS()
1808 class A { }
1809 ''');
1810 computeLibrarySourceErrors(source);
1811 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
1812 verify([source]);
1813 }
1814
1815 void test_missingJsLibAnnotation_externalField() {
1816 // https://github.com/dart-lang/sdk/issues/26987
1817 Source source = addSource(r'''
1818 import 'package:js/js.dart';
1819
1820 @JS()
1821 external dynamic exports;
1822 ''');
1823 computeLibrarySourceErrors(source);
1824 assertErrors(source,
1825 [ParserErrorCode.EXTERNAL_FIELD, HintCode.MISSING_JS_LIB_ANNOTATION]);
1826 verify([source]);
1827 }
1828
1829 void test_missingJsLibAnnotation_function() {
1830 Source source = addSource(r'''
1831 library foo;
1832
1833 import 'package:js/js.dart';
1834
1835 @JS('acxZIndex')
1836 set _currentZIndex(int value) { }
1837 ''');
1838 computeLibrarySourceErrors(source);
1839 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
1840 verify([source]);
1841 }
1842
1843 void test_missingJsLibAnnotation_method() {
1844 Source source = addSource(r'''
1845 library foo;
1846
1847 import 'package:js/js.dart';
1848
1849 class A {
1850 @JS()
1851 void a() { }
1852 }
1853 ''');
1854 computeLibrarySourceErrors(source);
1855 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
1856 verify([source]);
1857 }
1858
1859 void test_missingJsLibAnnotation_variable() {
1860 Source source = addSource(r'''
1861 import 'package:js/js.dart';
1862
1863 @JS()
1864 dynamic variable;
1865 ''');
1866 computeLibrarySourceErrors(source);
1867 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
1868 verify([source]);
1869 }
1870
1871 void test_missingReturn_async() {
1872 Source source = addSource('''
1873 import 'dart:async';
1874 Future<int> f() async {}
1875 ''');
1876 computeLibrarySourceErrors(source);
1877 assertErrors(source, [HintCode.MISSING_RETURN]);
1878 verify([source]);
1879 }
1880
1881 void test_missingReturn_factory() {
1882 Source source = addSource(r'''
1883 class A {
1884 factory A() {}
1885 }
1886 ''');
1887 computeLibrarySourceErrors(source);
1888 assertErrors(source, [HintCode.MISSING_RETURN]);
1889 verify([source]);
1890 }
1891
1892 void test_missingReturn_function() {
1893 Source source = addSource("int f() {}");
1894 computeLibrarySourceErrors(source);
1895 assertErrors(source, [HintCode.MISSING_RETURN]);
1896 verify([source]);
1897 }
1898
1899 void test_missingReturn_method() {
1900 Source source = addSource(r'''
1901 class A {
1902 int m() {}
1903 }''');
1904 computeLibrarySourceErrors(source);
1905 assertErrors(source, [HintCode.MISSING_RETURN]);
1906 verify([source]);
1907 }
1908
1909 void test_mustCallSuper() {
1910 Source source = addSource(r'''
1911 import 'package:meta/meta.dart';
1912 class A {
1913 @mustCallSuper
1914 void a() {}
1915 }
1916 class B extends A {
1917 @override
1918 void a()
1919 {}
1920 }
1921 ''');
1922 computeLibrarySourceErrors(source);
1923 assertErrors(source, [HintCode.MUST_CALL_SUPER]);
1924 verify([source]);
1925 }
1926
1927 void test_mustCallSuper_fromInterface() {
1928 Source source = addSource(r'''
1929 import 'package:meta/meta.dart';
1930 class A {
1931 @mustCallSuper
1932 void a() {}
1933 }
1934 class C implements A {
1935 @override
1936 void a() {}
1937 }
1938 ''');
1939 computeLibrarySourceErrors(source);
1940 assertErrors(source, []);
1941 verify([source]);
1942 }
1943
1944 void test_mustCallSuper_indirect() {
1945 Source source = addSource(r'''
1946 import 'package:meta/meta.dart';
1947 class A {
1948 @mustCallSuper
1949 void a() {}
1950 }
1951 class C extends A {
1952 @override
1953 void a() {
1954 super.a();
1955 }
1956 }
1957 class D extends C {
1958 @override
1959 void a() {}
1960 }
1961 ''');
1962 computeLibrarySourceErrors(source);
1963 assertErrors(source, [HintCode.MUST_CALL_SUPER]);
1964 verify([source]);
1965 }
1966
1967 void test_mustCallSuper_overridden() {
1968 Source source = addSource(r'''
1969 import 'package:meta/meta.dart';
1970 class A {
1971 @mustCallSuper
1972 void a() {}
1973 }
1974 class C extends A {
1975 @override
1976 void a() {
1977 super.a(); //OK
1978 }
1979 }
1980 ''');
1981 computeLibrarySourceErrors(source);
1982 assertErrors(source, []);
1983 verify([source]);
1984 }
1985
1986 void test_nullAwareInCondition_assert() {
1987 Source source = addSource(r'''
1988 m(x) {
1989 assert (x?.a);
1990 }
1991 ''');
1992 computeLibrarySourceErrors(source);
1993 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
1994 verify([source]);
1995 }
1996
1997 void test_nullAwareInCondition_conditionalExpression() {
1998 Source source = addSource(r'''
1999 m(x) {
2000 return x?.a ? 0 : 1;
2001 }
2002 ''');
2003 computeLibrarySourceErrors(source);
2004 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2005 verify([source]);
2006 }
2007
2008 void test_nullAwareInCondition_do() {
2009 Source source = addSource(r'''
2010 m(x) {
2011 do {} while (x?.a);
2012 }
2013 ''');
2014 computeLibrarySourceErrors(source);
2015 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2016 verify([source]);
2017 }
2018
2019 void test_nullAwareInCondition_for() {
2020 Source source = addSource(r'''
2021 m(x) {
2022 for (var v = x; v?.a; v = v.next) {}
2023 }
2024 ''');
2025 computeLibrarySourceErrors(source);
2026 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2027 verify([source]);
2028 }
2029
2030 void test_nullAwareInCondition_if() {
2031 Source source = addSource(r'''
2032 m(x) {
2033 if (x?.a) {}
2034 }
2035 ''');
2036 computeLibrarySourceErrors(source);
2037 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2038 verify([source]);
2039 }
2040
2041 void test_nullAwareInCondition_if_conditionalAnd_first() {
2042 Source source = addSource(r'''
2043 m(x) {
2044 if (x?.a && x.b) {}
2045 }
2046 ''');
2047 computeLibrarySourceErrors(source);
2048 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2049 verify([source]);
2050 }
2051
2052 void test_nullAwareInCondition_if_conditionalAnd_second() {
2053 Source source = addSource(r'''
2054 m(x) {
2055 if (x.a && x?.b) {}
2056 }
2057 ''');
2058 computeLibrarySourceErrors(source);
2059 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2060 verify([source]);
2061 }
2062
2063 void test_nullAwareInCondition_if_conditionalAnd_third() {
2064 Source source = addSource(r'''
2065 m(x) {
2066 if (x.a && x.b && x?.c) {}
2067 }
2068 ''');
2069 computeLibrarySourceErrors(source);
2070 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2071 verify([source]);
2072 }
2073
2074 void test_nullAwareInCondition_if_conditionalOr_first() {
2075 Source source = addSource(r'''
2076 m(x) {
2077 if (x?.a || x.b) {}
2078 }
2079 ''');
2080 computeLibrarySourceErrors(source);
2081 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2082 verify([source]);
2083 }
2084
2085 void test_nullAwareInCondition_if_conditionalOr_second() {
2086 Source source = addSource(r'''
2087 m(x) {
2088 if (x.a || x?.b) {}
2089 }
2090 ''');
2091 computeLibrarySourceErrors(source);
2092 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2093 verify([source]);
2094 }
2095
2096 void test_nullAwareInCondition_if_conditionalOr_third() {
2097 Source source = addSource(r'''
2098 m(x) {
2099 if (x.a || x.b || x?.c) {}
2100 }
2101 ''');
2102 computeLibrarySourceErrors(source);
2103 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2104 verify([source]);
2105 }
2106
2107 void test_nullAwareInCondition_if_not() {
2108 Source source = addSource(r'''
2109 m(x) {
2110 if (!x?.a) {}
2111 }
2112 ''');
2113 computeLibrarySourceErrors(source);
2114 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2115 verify([source]);
2116 }
2117
2118 void test_nullAwareInCondition_if_parenthesized() {
2119 Source source = addSource(r'''
2120 m(x) {
2121 if ((x?.a)) {}
2122 }
2123 ''');
2124 computeLibrarySourceErrors(source);
2125 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2126 verify([source]);
2127 }
2128
2129 void test_nullAwareInCondition_while() {
2130 Source source = addSource(r'''
2131 m(x) {
2132 while (x?.a) {}
2133 }
2134 ''');
2135 computeLibrarySourceErrors(source);
2136 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]);
2137 verify([source]);
2138 }
2139
2140 @failingTest
2141 void test_overrideEqualsButNotHashCode() {
2142 Source source = addSource(r'''
2143 class A {
2144 bool operator ==(x) {}
2145 }''');
2146 computeLibrarySourceErrors(source);
2147 assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
2148 verify([source]);
2149 }
2150
2151 void test_overrideOnNonOverridingField_invalid() {
2152 Source source = addSource(r'''
2153 class A {
2154 }
2155 class B extends A {
2156 @override
2157 final int m = 1;
2158 }''');
2159 computeLibrarySourceErrors(source);
2160 assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_FIELD]);
2161 verify([source]);
2162 }
2163
2164 void test_overrideOnNonOverridingGetter_invalid() {
2165 Source source = addSource(r'''
2166 class A {
2167 }
2168 class B extends A {
2169 @override
2170 int get m => 1;
2171 }''');
2172 computeLibrarySourceErrors(source);
2173 assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER]);
2174 verify([source]);
2175 }
2176
2177 void test_overrideOnNonOverridingMethod_invalid() {
2178 Source source = addSource(r'''
2179 class A {
2180 }
2181 class B extends A {
2182 @override
2183 int m() => 1;
2184 }''');
2185 computeLibrarySourceErrors(source);
2186 assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
2187 verify([source]);
2188 }
2189
2190 void test_overrideOnNonOverridingSetter_invalid() {
2191 Source source = addSource(r'''
2192 class A {
2193 }
2194 class B extends A {
2195 @override
2196 set m(int x) {}
2197 }''');
2198 computeLibrarySourceErrors(source);
2199 assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER]);
2200 verify([source]);
2201 }
2202
2203 void test_required_constructor_param() {
2204 Source source = addSource(r'''
2205 import 'package:meta/meta.dart';
2206
2207 class C {
2208 C({@Required('must specify an `a`') int a}) {}
2209 }
2210
2211 main() {
2212 new C();
2213 }
2214 ''');
2215 computeLibrarySourceErrors(source);
2216 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
2217 verify([source]);
2218 }
2219
2220 void test_required_constructor_param_no_reason() {
2221 Source source = addSource(r'''
2222 import 'package:meta/meta.dart';
2223
2224 class C {
2225 C({@required int a}) {}
2226 }
2227
2228 main() {
2229 new C();
2230 }
2231 ''');
2232 computeLibrarySourceErrors(source);
2233 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM]);
2234 verify([source]);
2235 }
2236
2237 void test_required_constructor_param_null_reason() {
2238 Source source = addSource(r'''
2239 import 'package:meta/meta.dart';
2240
2241 class C {
2242 C({@Required(null) int a}) {}
2243 }
2244
2245 main() {
2246 new C();
2247 }
2248 ''');
2249 computeLibrarySourceErrors(source);
2250 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM]);
2251 verify([source]);
2252 }
2253
2254 void test_required_constructor_param_OK() {
2255 Source source = addSource(r'''
2256 import 'package:meta/meta.dart';
2257
2258 class C {
2259 C({@required int a}) {}
2260 }
2261
2262 main() {
2263 new C(a: 2);
2264 }
2265 ''');
2266 computeLibrarySourceErrors(source);
2267 assertNoErrors(source);
2268 verify([source]);
2269 }
2270
2271 void test_required_constructor_param_redirecting_cons_call() {
2272 Source source = addSource(r'''
2273 import 'package:meta/meta.dart';
2274
2275 class C {
2276 C({@required int x});
2277 C.named() : this();
2278 }
2279 ''');
2280 computeLibrarySourceErrors(source);
2281 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM]);
2282 verify([source]);
2283 }
2284
2285 void test_required_constructor_param_super_call() {
2286 Source source = addSource(r'''
2287 import 'package:meta/meta.dart';
2288
2289 class C {
2290 C({@Required('must specify an `a`') int a}) {}
2291 }
2292
2293 class D extends C {
2294 D() : super();
2295 }
2296 ''');
2297 computeLibrarySourceErrors(source);
2298 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
2299 verify([source]);
2300 }
2301
2302 void test_required_function_param() {
2303 Source source = addSource(r'''
2304 import 'package:meta/meta.dart';
2305
2306 void f({@Required('must specify an `a`') int a}) {}
2307
2308 main() {
2309 f();
2310 }
2311 ''');
2312 computeLibrarySourceErrors(source);
2313 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
2314 verify([source]);
2315 }
2316
2317 void test_required_method_param() {
2318 Source source = addSource(r'''
2319 import 'package:meta/meta.dart';
2320 class A {
2321 void m({@Required('must specify an `a`') int a}) {}
2322 }
2323 f() {
2324 new A().m();
2325 }
2326 ''');
2327 computeLibrarySourceErrors(source);
2328 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
2329 verify([source]);
2330 }
2331
2332 void test_required_method_param_in_other_lib() {
2333 addNamedSource(
2334 '/a_lib.dart',
2335 r'''
2336 library a_lib;
2337 import 'package:meta/meta.dart';
2338 class A {
2339 void m({@Required('must specify an `a`') int a}) {}
2340 }
2341 ''');
2342
2343 Source source = addSource(r'''
2344 import "a_lib.dart";
2345 f() {
2346 new A().m();
2347 }
2348 ''');
2349
2350 computeLibrarySourceErrors(source);
2351 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS]);
2352 verify([source]);
2353 }
2354
2355 void test_required_typedef_function_param() {
2356 Source source = addSource(r'''
2357 import 'package:meta/meta.dart';
2358
2359 String test(C c) => c.m()();
2360
2361 typedef String F({@required String x});
2362
2363 class C {
2364 F m() => ({@required String x}) => null;
2365 }
2366 ''');
2367 computeLibrarySourceErrors(source);
2368 assertErrors(source, [HintCode.MISSING_REQUIRED_PARAM]);
2369 verify([source]);
2370 }
2371
2372 void test_typeCheck_type_is_Null() {
2373 Source source = addSource(r'''
2374 m(i) {
2375 bool b = i is Null;
2376 }''');
2377 computeLibrarySourceErrors(source);
2378 assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
2379 verify([source]);
2380 }
2381
2382 void test_typeCheck_type_not_Null() {
2383 Source source = addSource(r'''
2384 m(i) {
2385 bool b = i is! Null;
2386 }''');
2387 computeLibrarySourceErrors(source);
2388 assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
2389 verify([source]);
2390 }
2391
2392 void test_undefinedGetter() {
2393 Source source = addSource(r'''
2394 class A {}
2395 f(var a) {
2396 if(a is A) {
2397 return a.m;
2398 }
2399 }''');
2400 computeLibrarySourceErrors(source);
2401 assertErrors(source, [HintCode.UNDEFINED_GETTER]);
2402 }
2403
2404 void test_undefinedGetter_message() {
2405 // The implementation of HintCode.UNDEFINED_SETTER assumes that
2406 // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
2407 // same, this verifies that assumption.
2408 expect(StaticWarningCode.UNDEFINED_GETTER.message,
2409 StaticTypeWarningCode.UNDEFINED_GETTER.message);
2410 }
2411
2412 void test_undefinedIdentifier_exportHide() {
2413 Source source = addSource(r'''
2414 library L;
2415 export 'lib1.dart' hide a;''');
2416 addNamedSource("/lib1.dart", "library lib1;");
2417 computeLibrarySourceErrors(source);
2418 assertErrors(source, [HintCode.UNDEFINED_HIDDEN_NAME]);
2419 verify([source]);
2420 }
2421
2422 void test_undefinedIdentifier_exportShow() {
2423 Source source = addSource(r'''
2424 library L;
2425 export 'lib1.dart' show a;''');
2426 addNamedSource("/lib1.dart", "library lib1;");
2427 computeLibrarySourceErrors(source);
2428 assertErrors(source, [HintCode.UNDEFINED_SHOWN_NAME]);
2429 verify([source]);
2430 }
2431
2432 void test_undefinedIdentifier_importHide() {
2433 Source source = addSource(r'''
2434 library L;
2435 import 'lib1.dart' hide a;''');
2436 addNamedSource("/lib1.dart", "library lib1;");
2437 computeLibrarySourceErrors(source);
2438 assertErrors(
2439 source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_HIDDEN_NAME]);
2440 verify([source]);
2441 }
2442
2443 void test_undefinedIdentifier_importShow() {
2444 Source source = addSource(r'''
2445 library L;
2446 import 'lib1.dart' show a;''');
2447 addNamedSource("/lib1.dart", "library lib1;");
2448 computeLibrarySourceErrors(source);
2449 assertErrors(
2450 source, [HintCode.UNUSED_IMPORT, HintCode.UNDEFINED_SHOWN_NAME]);
2451 verify([source]);
2452 }
2453
2454 void test_undefinedMethod() {
2455 Source source = addSource(r'''
2456 f() {
2457 var a = 'str';
2458 a.notAMethodOnString();
2459 }''');
2460 computeLibrarySourceErrors(source);
2461 assertErrors(source, [HintCode.UNDEFINED_METHOD]);
2462 }
2463
2464 void test_undefinedMethod_assignmentExpression() {
2465 Source source = addSource(r'''
2466 class A {}
2467 class B {
2468 f(var a, var a2) {
2469 a = new A();
2470 a2 = new A();
2471 a += a2;
2472 }
2473 }''');
2474 computeLibrarySourceErrors(source);
2475 assertErrors(source, [HintCode.UNDEFINED_METHOD]);
2476 }
2477
2478 void test_undefinedOperator_binaryExpression() {
2479 Source source = addSource(r'''
2480 class A {}
2481 f(var a) {
2482 if(a is A) {
2483 a + 1;
2484 }
2485 }''');
2486 computeLibrarySourceErrors(source);
2487 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2488 }
2489
2490 void test_undefinedOperator_indexBoth() {
2491 Source source = addSource(r'''
2492 class A {}
2493 f(var a) {
2494 if(a is A) {
2495 a[0]++;
2496 }
2497 }''');
2498 computeLibrarySourceErrors(source);
2499 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2500 }
2501
2502 void test_undefinedOperator_indexGetter() {
2503 Source source = addSource(r'''
2504 class A {}
2505 f(var a) {
2506 if(a is A) {
2507 a[0];
2508 }
2509 }''');
2510 computeLibrarySourceErrors(source);
2511 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2512 }
2513
2514 void test_undefinedOperator_indexSetter() {
2515 Source source = addSource(r'''
2516 class A {}
2517 f(var a) {
2518 if(a is A) {
2519 a[0] = 1;
2520 }
2521 }''');
2522 computeLibrarySourceErrors(source);
2523 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2524 }
2525
2526 void test_undefinedOperator_postfixExpression() {
2527 Source source = addSource(r'''
2528 class A {}
2529 f(var a) {
2530 if(a is A) {
2531 a++;
2532 }
2533 }''');
2534 computeLibrarySourceErrors(source);
2535 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2536 }
2537
2538 void test_undefinedOperator_prefixExpression() {
2539 Source source = addSource(r'''
2540 class A {}
2541 f(var a) {
2542 if(a is A) {
2543 ++a;
2544 }
2545 }''');
2546 computeLibrarySourceErrors(source);
2547 assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
2548 }
2549
2550 void test_undefinedSetter() {
2551 Source source = addSource(r'''
2552 class A {}
2553 f(var a) {
2554 if(a is A) {
2555 a.m = 0;
2556 }
2557 }''');
2558 computeLibrarySourceErrors(source);
2559 assertErrors(source, [HintCode.UNDEFINED_SETTER]);
2560 }
2561
2562 void test_undefinedSetter_message() {
2563 // The implementation of HintCode.UNDEFINED_SETTER assumes that
2564 // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
2565 // same, this verifies that assumption.
2566 expect(StaticWarningCode.UNDEFINED_SETTER.message,
2567 StaticTypeWarningCode.UNDEFINED_SETTER.message);
2568 }
2569
2570 void test_unnecessaryCast_type_supertype() {
2571 Source source = addSource(r'''
2572 m(int i) {
2573 var b = i as Object;
2574 }''');
2575 computeLibrarySourceErrors(source);
2576 assertErrors(source, [HintCode.UNNECESSARY_CAST]);
2577 verify([source]);
2578 }
2579
2580 void test_unnecessaryCast_type_type() {
2581 Source source = addSource(r'''
2582 m(num i) {
2583 var b = i as num;
2584 }''');
2585 computeLibrarySourceErrors(source);
2586 assertErrors(source, [HintCode.UNNECESSARY_CAST]);
2587 verify([source]);
2588 }
2589
2590 void test_unnecessaryNoSuchMethod_blockBody() {
2591 Source source = addSource(r'''
2592 class A {
2593 noSuchMethod(x) => super.noSuchMethod(x);
2594 }
2595 class B extends A {
2596 mmm();
2597 noSuchMethod(y) {
2598 return super.noSuchMethod(y);
2599 }
2600 }''');
2601 computeLibrarySourceErrors(source);
2602 assertErrors(source, [HintCode.UNNECESSARY_NO_SUCH_METHOD]);
2603 verify([source]);
2604 }
2605
2606 void test_unnecessaryNoSuchMethod_expressionBody() {
2607 Source source = addSource(r'''
2608 class A {
2609 noSuchMethod(x) => super.noSuchMethod(x);
2610 }
2611 class B extends A {
2612 mmm();
2613 noSuchMethod(y) => super.noSuchMethod(y);
2614 }''');
2615 computeLibrarySourceErrors(source);
2616 assertErrors(source, [HintCode.UNNECESSARY_NO_SUCH_METHOD]);
2617 verify([source]);
2618 }
2619
2620 void test_unnecessaryTypeCheck_null_is_Null() {
2621 Source source = addSource("bool b = null is Null;");
2622 computeLibrarySourceErrors(source);
2623 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
2624 verify([source]);
2625 }
2626
2627 void test_unnecessaryTypeCheck_null_not_Null() {
2628 Source source = addSource("bool b = null is! Null;");
2629 computeLibrarySourceErrors(source);
2630 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
2631 verify([source]);
2632 }
2633
2634 void test_unnecessaryTypeCheck_type_is_dynamic() {
2635 Source source = addSource(r'''
2636 m(i) {
2637 bool b = i is dynamic;
2638 }''');
2639 computeLibrarySourceErrors(source);
2640 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
2641 verify([source]);
2642 }
2643
2644 void test_unnecessaryTypeCheck_type_is_object() {
2645 Source source = addSource(r'''
2646 m(i) {
2647 bool b = i is Object;
2648 }''');
2649 computeLibrarySourceErrors(source);
2650 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
2651 verify([source]);
2652 }
2653
2654 void test_unnecessaryTypeCheck_type_not_dynamic() {
2655 Source source = addSource(r'''
2656 m(i) {
2657 bool b = i is! dynamic;
2658 }''');
2659 computeLibrarySourceErrors(source);
2660 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
2661 verify([source]);
2662 }
2663
2664 void test_unnecessaryTypeCheck_type_not_object() {
2665 Source source = addSource(r'''
2666 m(i) {
2667 bool b = i is! Object;
2668 }''');
2669 computeLibrarySourceErrors(source);
2670 assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
2671 verify([source]);
2672 }
2673
2674 void test_unusedElement_class_isUsed_extends() {
2675 enableUnusedElement = true;
2676 Source source = addSource(r'''
2677 class _A {}
2678 class B extends _A {}
2679 ''');
2680 computeLibrarySourceErrors(source);
2681 assertNoErrors(source);
2682 verify([source]);
2683 }
2684
2685 void test_unusedElement_class_isUsed_fieldDeclaration() {
2686 enableUnusedElement = true;
2687 var src = r'''
2688 class Foo {
2689 _Bar x;
2690 }
2691
2692 class _Bar {
2693 }
2694 ''';
2695 Source source = addSource(src);
2696 computeLibrarySourceErrors(source);
2697 assertNoErrors(source);
2698 verify([source]);
2699 }
2700
2701 void test_unusedElement_class_isUsed_implements() {
2702 enableUnusedElement = true;
2703 Source source = addSource(r'''
2704 class _A {}
2705 class B implements _A {}
2706 ''');
2707 computeLibrarySourceErrors(source);
2708 assertNoErrors(source);
2709 verify([source]);
2710 }
2711
2712 void test_unusedElement_class_isUsed_instanceCreation() {
2713 enableUnusedElement = true;
2714 Source source = addSource(r'''
2715 class _A {}
2716 main() {
2717 new _A();
2718 }''');
2719 computeLibrarySourceErrors(source);
2720 assertNoErrors(source);
2721 verify([source]);
2722 }
2723
2724 void test_unusedElement_class_isUsed_staticFieldAccess() {
2725 enableUnusedElement = true;
2726 Source source = addSource(r'''
2727 class _A {
2728 static const F = 42;
2729 }
2730 main() {
2731 _A.F;
2732 }''');
2733 computeLibrarySourceErrors(source);
2734 assertNoErrors(source);
2735 verify([source]);
2736 }
2737
2738 void test_unusedElement_class_isUsed_staticMethodInvocation() {
2739 enableUnusedElement = true;
2740 Source source = addSource(r'''
2741 class _A {
2742 static m() {}
2743 }
2744 main() {
2745 _A.m();
2746 }''');
2747 computeLibrarySourceErrors(source);
2748 assertNoErrors(source);
2749 verify([source]);
2750 }
2751
2752 void test_unusedElement_class_isUsed_typeArgument() {
2753 enableUnusedElement = true;
2754 Source source = addSource(r'''
2755 class _A {}
2756 main() {
2757 var v = new List<_A>();
2758 print(v);
2759 }''');
2760 computeLibrarySourceErrors(source);
2761 assertNoErrors(source);
2762 verify([source]);
2763 }
2764
2765 void test_unusedElement_class_notUsed_inClassMember() {
2766 enableUnusedElement = true;
2767 Source source = addSource(r'''
2768 class _A {
2769 static staticMethod() {
2770 new _A();
2771 }
2772 instanceMethod() {
2773 new _A();
2774 }
2775 }
2776 ''');
2777 computeLibrarySourceErrors(source);
2778 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2779 verify([source]);
2780 }
2781
2782 void test_unusedElement_class_notUsed_inConstructorName() {
2783 enableUnusedElement = true;
2784 Source source = addSource(r'''
2785 class _A {
2786 _A() {}
2787 _A.named() {}
2788 }
2789 ''');
2790 computeLibrarySourceErrors(source);
2791 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2792 verify([source]);
2793 }
2794
2795 void test_unusedElement_class_notUsed_isExpression() {
2796 enableUnusedElement = true;
2797 Source source = addSource(r'''
2798 class _A {}
2799 main(p) {
2800 if (p is _A) {
2801 }
2802 }
2803 ''');
2804 computeLibrarySourceErrors(source);
2805 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2806 verify([source]);
2807 }
2808
2809 void test_unusedElement_class_notUsed_noReference() {
2810 enableUnusedElement = true;
2811 Source source = addSource(r'''
2812 class _A {}
2813 main() {
2814 }''');
2815 computeLibrarySourceErrors(source);
2816 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2817 verify([source]);
2818 }
2819
2820 void test_unusedElement_class_notUsed_variableDeclaration() {
2821 enableUnusedElement = true;
2822 Source source = addSource(r'''
2823 class _A {}
2824 main() {
2825 _A v;
2826 print(v);
2827 }
2828 print(x) {}
2829 ''');
2830 computeLibrarySourceErrors(source);
2831 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2832 verify([source]);
2833 }
2834
2835 void test_unusedElement_enum_isUsed_fieldReference() {
2836 enableUnusedElement = true;
2837 Source source = addSource(r'''
2838 enum _MyEnum {A, B, C}
2839 main() {
2840 print(_MyEnum.B);
2841 }''');
2842 computeLibrarySourceErrors(source);
2843 assertNoErrors(source);
2844 verify([source]);
2845 }
2846
2847 void test_unusedElement_enum_notUsed_noReference() {
2848 enableUnusedElement = true;
2849 Source source = addSource(r'''
2850 enum _MyEnum {A, B, C}
2851 main() {
2852 }''');
2853 computeLibrarySourceErrors(source);
2854 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2855 verify([source]);
2856 }
2857
2858 void test_unusedElement_functionLocal_isUsed_closure() {
2859 enableUnusedElement = true;
2860 Source source = addSource(r'''
2861 main() {
2862 print(() {});
2863 }
2864 print(x) {}
2865 ''');
2866 computeLibrarySourceErrors(source);
2867 assertNoErrors(source);
2868 verify([source]);
2869 }
2870
2871 void test_unusedElement_functionLocal_isUsed_invocation() {
2872 enableUnusedElement = true;
2873 Source source = addSource(r'''
2874 main() {
2875 f() {}
2876 f();
2877 }''');
2878 computeLibrarySourceErrors(source);
2879 assertNoErrors(source);
2880 verify([source]);
2881 }
2882
2883 void test_unusedElement_functionLocal_isUsed_reference() {
2884 enableUnusedElement = true;
2885 Source source = addSource(r'''
2886 main() {
2887 f() {}
2888 print(f);
2889 }
2890 print(x) {}
2891 ''');
2892 computeLibrarySourceErrors(source);
2893 assertNoErrors(source);
2894 verify([source]);
2895 }
2896
2897 void test_unusedElement_functionLocal_notUsed_noReference() {
2898 enableUnusedElement = true;
2899 Source source = addSource(r'''
2900 main() {
2901 f() {}
2902 }''');
2903 computeLibrarySourceErrors(source);
2904 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2905 verify([source]);
2906 }
2907
2908 void test_unusedElement_functionLocal_notUsed_referenceFromItself() {
2909 enableUnusedElement = true;
2910 Source source = addSource(r'''
2911 main() {
2912 _f(int p) {
2913 _f(p - 1);
2914 }
2915 }''');
2916 computeLibrarySourceErrors(source);
2917 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2918 verify([source]);
2919 }
2920
2921 void test_unusedElement_functionTop_isUsed_invocation() {
2922 enableUnusedElement = true;
2923 Source source = addSource(r'''
2924 _f() {}
2925 main() {
2926 _f();
2927 }''');
2928 computeLibrarySourceErrors(source);
2929 assertNoErrors(source);
2930 verify([source]);
2931 }
2932
2933 void test_unusedElement_functionTop_isUsed_reference() {
2934 enableUnusedElement = true;
2935 Source source = addSource(r'''
2936 _f() {}
2937 main() {
2938 print(_f);
2939 }
2940 print(x) {}
2941 ''');
2942 computeLibrarySourceErrors(source);
2943 assertNoErrors(source);
2944 verify([source]);
2945 }
2946
2947 void test_unusedElement_functionTop_notUsed_noReference() {
2948 enableUnusedElement = true;
2949 Source source = addSource(r'''
2950 _f() {}
2951 main() {
2952 }''');
2953 computeLibrarySourceErrors(source);
2954 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2955 verify([source]);
2956 }
2957
2958 void test_unusedElement_functionTop_notUsed_referenceFromItself() {
2959 enableUnusedElement = true;
2960 Source source = addSource(r'''
2961 _f(int p) {
2962 _f(p - 1);
2963 }
2964 main() {
2965 }''');
2966 computeLibrarySourceErrors(source);
2967 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
2968 verify([source]);
2969 }
2970
2971 void test_unusedElement_functionTypeAlias_isUsed_isExpression() {
2972 enableUnusedElement = true;
2973 Source source = addSource(r'''
2974 typedef _F(a, b);
2975 main(f) {
2976 if (f is _F) {
2977 print('F');
2978 }
2979 }''');
2980 computeLibrarySourceErrors(source);
2981 assertNoErrors(source);
2982 verify([source]);
2983 }
2984
2985 void test_unusedElement_functionTypeAlias_isUsed_reference() {
2986 enableUnusedElement = true;
2987 Source source = addSource(r'''
2988 typedef _F(a, b);
2989 main(_F f) {
2990 }''');
2991 computeLibrarySourceErrors(source);
2992 assertNoErrors(source);
2993 verify([source]);
2994 }
2995
2996 void test_unusedElement_functionTypeAlias_isUsed_typeArgument() {
2997 enableUnusedElement = true;
2998 Source source = addSource(r'''
2999 typedef _F(a, b);
3000 main() {
3001 var v = new List<_F>();
3002 print(v);
3003 }''');
3004 computeLibrarySourceErrors(source);
3005 assertNoErrors(source);
3006 verify([source]);
3007 }
3008
3009 void test_unusedElement_functionTypeAlias_isUsed_variableDeclaration() {
3010 enableUnusedElement = true;
3011 Source source = addSource(r'''
3012 typedef _F(a, b);
3013 class A {
3014 _F f;
3015 }''');
3016 computeLibrarySourceErrors(source);
3017 assertNoErrors(source);
3018 verify([source]);
3019 }
3020
3021 void test_unusedElement_functionTypeAlias_notUsed_noReference() {
3022 enableUnusedElement = true;
3023 Source source = addSource(r'''
3024 typedef _F(a, b);
3025 main() {
3026 }''');
3027 computeLibrarySourceErrors(source);
3028 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3029 verify([source]);
3030 }
3031
3032 void test_unusedElement_getter_isUsed_invocation_implicitThis() {
3033 enableUnusedElement = true;
3034 Source source = addSource(r'''
3035 class A {
3036 get _g => null;
3037 useGetter() {
3038 var v = _g;
3039 }
3040 }''');
3041 computeLibrarySourceErrors(source);
3042 assertNoErrors(source);
3043 verify([source]);
3044 }
3045
3046 void test_unusedElement_getter_isUsed_invocation_PrefixedIdentifier() {
3047 enableUnusedElement = true;
3048 Source source = addSource(r'''
3049 class A {
3050 get _g => null;
3051 }
3052 main(A a) {
3053 var v = a._g;
3054 }
3055 ''');
3056 computeLibrarySourceErrors(source);
3057 assertNoErrors(source);
3058 verify([source]);
3059 }
3060
3061 void test_unusedElement_getter_isUsed_invocation_PropertyAccess() {
3062 enableUnusedElement = true;
3063 Source source = addSource(r'''
3064 class A {
3065 get _g => null;
3066 }
3067 main() {
3068 var v = new A()._g;
3069 }
3070 ''');
3071 computeLibrarySourceErrors(source);
3072 assertNoErrors(source);
3073 verify([source]);
3074 }
3075
3076 void test_unusedElement_getter_notUsed_noReference() {
3077 enableUnusedElement = true;
3078 Source source = addSource(r'''
3079 class A {
3080 get _g => null;
3081 }''');
3082 computeLibrarySourceErrors(source);
3083 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3084 verify([source]);
3085 }
3086
3087 void test_unusedElement_getter_notUsed_referenceFromItself() {
3088 enableUnusedElement = true;
3089 Source source = addSource(r'''
3090 class A {
3091 get _g {
3092 return _g;
3093 }
3094 }''');
3095 computeLibrarySourceErrors(source);
3096 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3097 verify([source]);
3098 }
3099
3100 void test_unusedElement_method_isUsed_hasReference_implicitThis() {
3101 enableUnusedElement = true;
3102 Source source = addSource(r'''
3103 class A {
3104 _m() {}
3105 useMethod() {
3106 print(_m);
3107 }
3108 }
3109 print(x) {}
3110 ''');
3111 computeLibrarySourceErrors(source);
3112 assertNoErrors(source);
3113 verify([source]);
3114 }
3115
3116 void test_unusedElement_method_isUsed_hasReference_implicitThis_subclass() {
3117 enableUnusedElement = true;
3118 Source source = addSource(r'''
3119 class A {
3120 _m() {}
3121 useMethod() {
3122 print(_m);
3123 }
3124 }
3125 class B extends A {
3126 _m() {}
3127 }
3128 print(x) {}
3129 ''');
3130 computeLibrarySourceErrors(source);
3131 assertNoErrors(source);
3132 verify([source]);
3133 }
3134
3135 void test_unusedElement_method_isUsed_hasReference_PrefixedIdentifier() {
3136 enableUnusedElement = true;
3137 Source source = addSource(r'''
3138 class A {
3139 _m() {}
3140 }
3141 main(A a) {
3142 a._m;
3143 }''');
3144 computeLibrarySourceErrors(source);
3145 assertNoErrors(source);
3146 verify([source]);
3147 }
3148
3149 void test_unusedElement_method_isUsed_hasReference_PropertyAccess() {
3150 enableUnusedElement = true;
3151 Source source = addSource(r'''
3152 class A {
3153 _m() {}
3154 }
3155 main() {
3156 new A()._m;
3157 }''');
3158 computeLibrarySourceErrors(source);
3159 assertNoErrors(source);
3160 verify([source]);
3161 }
3162
3163 void test_unusedElement_method_isUsed_invocation_implicitThis() {
3164 enableUnusedElement = true;
3165 Source source = addSource(r'''
3166 class A {
3167 _m() {}
3168 useMethod() {
3169 _m();
3170 }
3171 }''');
3172 computeLibrarySourceErrors(source);
3173 assertNoErrors(source);
3174 verify([source]);
3175 }
3176
3177 void test_unusedElement_method_isUsed_invocation_implicitThis_subclass() {
3178 enableUnusedElement = true;
3179 Source source = addSource(r'''
3180 class A {
3181 _m() {}
3182 useMethod() {
3183 _m();
3184 }
3185 }
3186 class B extends A {
3187 _m() {}
3188 }''');
3189 computeLibrarySourceErrors(source);
3190 assertNoErrors(source);
3191 verify([source]);
3192 }
3193
3194 void test_unusedElement_method_isUsed_invocation_MemberElement() {
3195 enableUnusedElement = true;
3196 Source source = addSource(r'''
3197 class A<T> {
3198 _m(T t) {}
3199 }
3200 main(A<int> a) {
3201 a._m(0);
3202 }''');
3203 computeLibrarySourceErrors(source);
3204 assertNoErrors(source);
3205 verify([source]);
3206 }
3207
3208 void test_unusedElement_method_isUsed_invocation_propagated() {
3209 enableUnusedElement = true;
3210 Source source = addSource(r'''
3211 class A {
3212 _m() {}
3213 }
3214 main() {
3215 var a = new A();
3216 a._m();
3217 }''');
3218 computeLibrarySourceErrors(source);
3219 assertNoErrors(source);
3220 verify([source]);
3221 }
3222
3223 void test_unusedElement_method_isUsed_invocation_static() {
3224 enableUnusedElement = true;
3225 Source source = addSource(r'''
3226 class A {
3227 _m() {}
3228 }
3229 main() {
3230 A a = new A();
3231 a._m();
3232 }''');
3233 computeLibrarySourceErrors(source);
3234 assertNoErrors(source);
3235 verify([source]);
3236 }
3237
3238 void test_unusedElement_method_isUsed_invocation_subclass() {
3239 enableUnusedElement = true;
3240 Source source = addSource(r'''
3241 class A {
3242 _m() {}
3243 }
3244 class B extends A {
3245 _m() {}
3246 }
3247 main(A a) {
3248 a._m();
3249 }''');
3250 computeLibrarySourceErrors(source);
3251 assertNoErrors(source);
3252 verify([source]);
3253 }
3254
3255 void test_unusedElement_method_isUsed_notPrivate() {
3256 enableUnusedElement = true;
3257 Source source = addSource(r'''
3258 class A {
3259 m() {}
3260 }
3261 main() {
3262 }''');
3263 computeLibrarySourceErrors(source);
3264 assertNoErrors(source);
3265 verify([source]);
3266 }
3267
3268 void test_unusedElement_method_isUsed_staticInvocation() {
3269 enableUnusedElement = true;
3270 Source source = addSource(r'''
3271 class A {
3272 static _m() {}
3273 }
3274 main() {
3275 A._m();
3276 }''');
3277 computeLibrarySourceErrors(source);
3278 assertNoErrors(source);
3279 verify([source]);
3280 }
3281
3282 void test_unusedElement_method_notUsed_noReference() {
3283 enableUnusedElement = true;
3284 Source source = addSource(r'''
3285 class A {
3286 static _m() {}
3287 }''');
3288 computeLibrarySourceErrors(source);
3289 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3290 verify([source]);
3291 }
3292
3293 void test_unusedElement_method_notUsed_referenceFromItself() {
3294 enableUnusedElement = true;
3295 Source source = addSource(r'''
3296 class A {
3297 static _m(int p) {
3298 _m(p - 1);
3299 }
3300 }''');
3301 computeLibrarySourceErrors(source);
3302 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3303 verify([source]);
3304 }
3305
3306 void test_unusedElement_setter_isUsed_invocation_implicitThis() {
3307 enableUnusedElement = true;
3308 Source source = addSource(r'''
3309 class A {
3310 set _s(x) {}
3311 useSetter() {
3312 _s = 42;
3313 }
3314 }''');
3315 computeLibrarySourceErrors(source);
3316 assertNoErrors(source);
3317 verify([source]);
3318 }
3319
3320 void test_unusedElement_setter_isUsed_invocation_PrefixedIdentifier() {
3321 enableUnusedElement = true;
3322 Source source = addSource(r'''
3323 class A {
3324 set _s(x) {}
3325 }
3326 main(A a) {
3327 a._s = 42;
3328 }
3329 ''');
3330 computeLibrarySourceErrors(source);
3331 assertNoErrors(source);
3332 verify([source]);
3333 }
3334
3335 void test_unusedElement_setter_isUsed_invocation_PropertyAccess() {
3336 enableUnusedElement = true;
3337 Source source = addSource(r'''
3338 class A {
3339 set _s(x) {}
3340 }
3341 main() {
3342 new A()._s = 42;
3343 }
3344 ''');
3345 computeLibrarySourceErrors(source);
3346 assertNoErrors(source);
3347 verify([source]);
3348 }
3349
3350 void test_unusedElement_setter_notUsed_noReference() {
3351 enableUnusedElement = true;
3352 Source source = addSource(r'''
3353 class A {
3354 set _s(x) {}
3355 }''');
3356 computeLibrarySourceErrors(source);
3357 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3358 verify([source]);
3359 }
3360
3361 void test_unusedElement_setter_notUsed_referenceFromItself() {
3362 enableUnusedElement = true;
3363 Source source = addSource(r'''
3364 class A {
3365 set _s(int x) {
3366 if (x > 5) {
3367 _s = x - 1;
3368 }
3369 }
3370 }''');
3371 computeLibrarySourceErrors(source);
3372 assertErrors(source, [HintCode.UNUSED_ELEMENT]);
3373 verify([source]);
3374 }
3375
3376 void test_unusedField_isUsed_argument() {
3377 enableUnusedElement = true;
3378 Source source = addSource(r'''
3379 class A {
3380 int _f = 0;
3381 main() {
3382 print(++_f);
3383 }
3384 }
3385 print(x) {}''');
3386 computeLibrarySourceErrors(source);
3387 assertErrors(source);
3388 verify([source]);
3389 }
3390
3391 void test_unusedField_isUsed_reference_implicitThis() {
3392 enableUnusedElement = true;
3393 Source source = addSource(r'''
3394 class A {
3395 int _f;
3396 main() {
3397 print(_f);
3398 }
3399 }
3400 print(x) {}''');
3401 computeLibrarySourceErrors(source);
3402 assertErrors(source);
3403 verify([source]);
3404 }
3405
3406 void test_unusedField_isUsed_reference_implicitThis_expressionFunctionBody() {
3407 enableUnusedElement = true;
3408 Source source = addSource(r'''
3409 class A {
3410 int _f;
3411 m() => _f;
3412 }''');
3413 computeLibrarySourceErrors(source);
3414 assertErrors(source);
3415 verify([source]);
3416 }
3417
3418 void test_unusedField_isUsed_reference_implicitThis_subclass() {
3419 enableUnusedElement = true;
3420 Source source = addSource(r'''
3421 class A {
3422 int _f;
3423 main() {
3424 print(_f);
3425 }
3426 }
3427 class B extends A {
3428 int _f;
3429 }
3430 print(x) {}''');
3431 computeLibrarySourceErrors(source);
3432 assertErrors(source);
3433 verify([source]);
3434 }
3435
3436 void test_unusedField_isUsed_reference_qualified_propagatedElement() {
3437 enableUnusedElement = true;
3438 Source source = addSource(r'''
3439 class A {
3440 int _f;
3441 }
3442 main() {
3443 var a = new A();
3444 print(a._f);
3445 }
3446 print(x) {}''');
3447 computeLibrarySourceErrors(source);
3448 assertErrors(source);
3449 verify([source]);
3450 }
3451
3452 void test_unusedField_isUsed_reference_qualified_staticElement() {
3453 enableUnusedElement = true;
3454 Source source = addSource(r'''
3455 class A {
3456 int _f;
3457 }
3458 main() {
3459 A a = new A();
3460 print(a._f);
3461 }
3462 print(x) {}''');
3463 computeLibrarySourceErrors(source);
3464 assertErrors(source);
3465 verify([source]);
3466 }
3467
3468 void test_unusedField_isUsed_reference_qualified_unresolved() {
3469 enableUnusedElement = true;
3470 Source source = addSource(r'''
3471 class A {
3472 int _f;
3473 }
3474 main(a) {
3475 print(a._f);
3476 }
3477 print(x) {}''');
3478 computeLibrarySourceErrors(source);
3479 assertErrors(source);
3480 verify([source]);
3481 }
3482
3483 void test_unusedField_notUsed_compoundAssign() {
3484 enableUnusedElement = true;
3485 Source source = addSource(r'''
3486 class A {
3487 int _f;
3488 main() {
3489 _f += 2;
3490 }
3491 }''');
3492 computeLibrarySourceErrors(source);
3493 assertErrors(source, [HintCode.UNUSED_FIELD]);
3494 verify([source]);
3495 }
3496
3497 void test_unusedField_notUsed_constructorFieldInitializers() {
3498 enableUnusedElement = true;
3499 Source source = addSource(r'''
3500 class A {
3501 int _f;
3502 A() : _f = 0;
3503 }''');
3504 computeLibrarySourceErrors(source);
3505 assertErrors(source, [HintCode.UNUSED_FIELD]);
3506 verify([source]);
3507 }
3508
3509 void test_unusedField_notUsed_fieldFormalParameter() {
3510 enableUnusedElement = true;
3511 Source source = addSource(r'''
3512 class A {
3513 int _f;
3514 A(this._f);
3515 }''');
3516 computeLibrarySourceErrors(source);
3517 assertErrors(source, [HintCode.UNUSED_FIELD]);
3518 verify([source]);
3519 }
3520
3521 void test_unusedField_notUsed_noReference() {
3522 enableUnusedElement = true;
3523 Source source = addSource(r'''
3524 class A {
3525 int _f;
3526 }
3527 ''');
3528 computeLibrarySourceErrors(source);
3529 assertErrors(source, [HintCode.UNUSED_FIELD]);
3530 verify([source]);
3531 }
3532
3533 void test_unusedField_notUsed_postfixExpr() {
3534 enableUnusedElement = true;
3535 Source source = addSource(r'''
3536 class A {
3537 int _f = 0;
3538 main() {
3539 _f++;
3540 }
3541 }''');
3542 computeLibrarySourceErrors(source);
3543 assertErrors(source, [HintCode.UNUSED_FIELD]);
3544 verify([source]);
3545 }
3546
3547 void test_unusedField_notUsed_prefixExpr() {
3548 enableUnusedElement = true;
3549 Source source = addSource(r'''
3550 class A {
3551 int _f = 0;
3552 main() {
3553 ++_f;
3554 }
3555 }''');
3556 computeLibrarySourceErrors(source);
3557 assertErrors(source, [HintCode.UNUSED_FIELD]);
3558 verify([source]);
3559 }
3560
3561 void test_unusedField_notUsed_simpleAssignment() {
3562 enableUnusedElement = true;
3563 Source source = addSource(r'''
3564 class A {
3565 int _f;
3566 m() {
3567 _f = 1;
3568 }
3569 }
3570 main(A a) {
3571 a._f = 2;
3572 }
3573 ''');
3574 computeLibrarySourceErrors(source);
3575 assertErrors(source, [HintCode.UNUSED_FIELD]);
3576 verify([source]);
3577 }
3578
3579 void test_unusedImport() {
3580 Source source = addSource(r'''
3581 library L;
3582 import 'lib1.dart';''');
3583 Source source2 = addNamedSource("/lib1.dart", "library lib1;");
3584 computeLibrarySourceErrors(source);
3585 assertErrors(source, [HintCode.UNUSED_IMPORT]);
3586 assertNoErrors(source2);
3587 verify([source, source2]);
3588 }
3589
3590 void test_unusedImport_as() {
3591 Source source = addSource(r'''
3592 library L;
3593 import 'lib1.dart';
3594 import 'lib1.dart' as one;
3595 one.A a;''');
3596 Source source2 = addNamedSource(
3597 "/lib1.dart",
3598 r'''
3599 library lib1;
3600 class A {}''');
3601 computeLibrarySourceErrors(source);
3602 assertErrors(source, [HintCode.UNUSED_IMPORT]);
3603 assertNoErrors(source2);
3604 verify([source, source2]);
3605 }
3606
3607 @failingTest
3608 void test_unusedImport_as_equalPrefixes() {
3609 // See todo at ImportsVerifier.prefixElementMap.
3610 Source source = addSource(r'''
3611 library L;
3612 import 'lib1.dart' as one;
3613 import 'lib2.dart' as one;
3614 one.A a;''');
3615 Source source2 = addNamedSource(
3616 "/lib1.dart",
3617 r'''
3618 library lib1;
3619 class A {}''');
3620 Source source3 = addNamedSource(
3621 "/lib2.dart",
3622 r'''
3623 library lib2;
3624 class B {}''');
3625 computeLibrarySourceErrors(source);
3626 assertErrors(source, [HintCode.UNUSED_IMPORT]);
3627 assertNoErrors(source2);
3628 assertNoErrors(source3);
3629 verify([source, source2, source3]);
3630 }
3631
3632 void test_unusedImport_hide() {
3633 Source source = addSource(r'''
3634 library L;
3635 import 'lib1.dart';
3636 import 'lib1.dart' hide A;
3637 A a;''');
3638 Source source2 = addNamedSource(
3639 "/lib1.dart",
3640 r'''
3641 library lib1;
3642 class A {}''');
3643 computeLibrarySourceErrors(source);
3644 assertErrors(source, [HintCode.UNUSED_IMPORT]);
3645 assertNoErrors(source2);
3646 verify([source, source2]);
3647 }
3648
3649 void test_unusedImport_inComment_libraryDirective() {
3650 Source source = addSource(r'''
3651 /// Use [Future] class.
3652 library L;
3653 import 'dart:async';
3654 ''');
3655 assertNoErrors(source);
3656 }
3657
3658 void test_unusedImport_show() {
3659 Source source = addSource(r'''
3660 library L;
3661 import 'lib1.dart' show A;
3662 import 'lib1.dart' show B;
3663 A a;''');
3664 Source source2 = addNamedSource(
3665 "/lib1.dart",
3666 r'''
3667 library lib1;
3668 class A {}
3669 class B {}''');
3670 computeLibrarySourceErrors(source);
3671 assertErrors(source, [HintCode.UNUSED_IMPORT]);
3672 assertNoErrors(source2);
3673 verify([source, source2]);
3674 }
3675
3676 void test_unusedLocalVariable_inCatch_exception() {
3677 enableUnusedLocalVariable = true;
3678 Source source = addSource(r'''
3679 main() {
3680 try {
3681 } on String catch (exception) {
3682 }
3683 }''');
3684 computeLibrarySourceErrors(source);
3685 assertErrors(source, [HintCode.UNUSED_CATCH_CLAUSE]);
3686 verify([source]);
3687 }
3688
3689 void test_unusedLocalVariable_inCatch_exception_hasStack() {
3690 enableUnusedLocalVariable = true;
3691 Source source = addSource(r'''
3692 main() {
3693 try {
3694 } catch (exception, stack) {
3695 print(stack);
3696 }
3697 }''');
3698 computeLibrarySourceErrors(source);
3699 assertNoErrors(source);
3700 verify([source]);
3701 }
3702
3703 void test_unusedLocalVariable_inCatch_exception_noOnClause() {
3704 enableUnusedLocalVariable = true;
3705 Source source = addSource(r'''
3706 main() {
3707 try {
3708 } catch (exception) {
3709 }
3710 }''');
3711 computeLibrarySourceErrors(source);
3712 assertNoErrors(source);
3713 verify([source]);
3714 }
3715
3716 void test_unusedLocalVariable_inCatch_stackTrace() {
3717 enableUnusedLocalVariable = true;
3718 Source source = addSource(r'''
3719 main() {
3720 try {
3721 } catch (exception, stackTrace) {
3722 }
3723 }''');
3724 computeLibrarySourceErrors(source);
3725 assertErrors(source, [HintCode.UNUSED_CATCH_STACK]);
3726 verify([source]);
3727 }
3728
3729 void test_unusedLocalVariable_inCatch_stackTrace_used() {
3730 enableUnusedLocalVariable = true;
3731 Source source = addSource(r'''
3732 main() {
3733 try {
3734 } catch (exception, stackTrace) {
3735 print('exception at $stackTrace');
3736 }
3737 }
3738 print(x) {}''');
3739 computeLibrarySourceErrors(source);
3740 assertErrors(source);
3741 verify([source]);
3742 }
3743
3744 void test_unusedLocalVariable_inFor_underscore_ignored() {
3745 enableUnusedLocalVariable = true;
3746 Source source = addSource(r'''
3747 main() {
3748 for (var _ in [1,2,3]) {
3749 for (var __ in [4,5,6]) {
3750 // do something
3751 }
3752 }
3753 }''');
3754 computeLibrarySourceErrors(source);
3755 assertErrors(source);
3756 verify([source]);
3757 }
3758
3759 void test_unusedLocalVariable_inFunction() {
3760 enableUnusedLocalVariable = true;
3761 Source source = addSource(r'''
3762 main() {
3763 var v = 1;
3764 v = 2;
3765 }''');
3766 computeLibrarySourceErrors(source);
3767 assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
3768 verify([source]);
3769 }
3770
3771 void test_unusedLocalVariable_inMethod() {
3772 enableUnusedLocalVariable = true;
3773 Source source = addSource(r'''
3774 class A {
3775 foo() {
3776 var v = 1;
3777 v = 2;
3778 }
3779 }''');
3780 computeLibrarySourceErrors(source);
3781 assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
3782 verify([source]);
3783 }
3784
3785 void test_unusedLocalVariable_isInvoked() {
3786 enableUnusedLocalVariable = true;
3787 Source source = addSource(r'''
3788 typedef Foo();
3789 main() {
3790 Foo foo;
3791 foo();
3792 }''');
3793 computeLibrarySourceErrors(source);
3794 assertErrors(source);
3795 verify([source]);
3796 }
3797
3798 void test_unusedLocalVariable_isRead_notUsed_compoundAssign() {
3799 enableUnusedLocalVariable = true;
3800 Source source = addSource(r'''
3801 main() {
3802 var v = 1;
3803 v += 2;
3804 }''');
3805 computeLibrarySourceErrors(source);
3806 assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
3807 verify([source]);
3808 }
3809
3810 void test_unusedLocalVariable_isRead_notUsed_postfixExpr() {
3811 enableUnusedLocalVariable = true;
3812 Source source = addSource(r'''
3813 main() {
3814 var v = 1;
3815 v++;
3816 }''');
3817 computeLibrarySourceErrors(source);
3818 assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
3819 verify([source]);
3820 }
3821
3822 void test_unusedLocalVariable_isRead_notUsed_prefixExpr() {
3823 enableUnusedLocalVariable = true;
3824 Source source = addSource(r'''
3825 main() {
3826 var v = 1;
3827 ++v;
3828 }''');
3829 computeLibrarySourceErrors(source);
3830 assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
3831 verify([source]);
3832 }
3833
3834 void test_unusedLocalVariable_isRead_usedArgument() {
3835 enableUnusedLocalVariable = true;
3836 Source source = addSource(r'''
3837 main() {
3838 var v = 1;
3839 print(++v);
3840 }
3841 print(x) {}''');
3842 computeLibrarySourceErrors(source);
3843 assertErrors(source);
3844 verify([source]);
3845 }
3846
3847 void test_unusedLocalVariable_isRead_usedInvocationTarget() {
3848 enableUnusedLocalVariable = true;
3849 Source source = addSource(r'''
3850 class A {
3851 foo() {}
3852 }
3853 main() {
3854 var a = new A();
3855 a.foo();
3856 }
3857 ''');
3858 computeLibrarySourceErrors(source);
3859 assertErrors(source);
3860 verify([source]);
3861 }
3862
3863 void test_unusedShownName() {
3864 Source source = addSource(r'''
3865 library L;
3866 import 'lib1.dart' show A, B;
3867 A a;''');
3868 Source source2 = addNamedSource(
3869 "/lib1.dart",
3870 r'''
3871 library lib1;
3872 class A {}
3873 class B {}''');
3874 computeLibrarySourceErrors(source);
3875 assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
3876 assertNoErrors(source2);
3877 verify([source, source2]);
3878 }
3879
3880 void test_unusedShownName_as() {
3881 Source source = addSource(r'''
3882 library L;
3883 import 'lib1.dart' as p show A, B;
3884 p.A a;''');
3885 Source source2 = addNamedSource(
3886 "/lib1.dart",
3887 r'''
3888 library lib1;
3889 class A {}
3890 class B {}''');
3891 computeLibrarySourceErrors(source);
3892 assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
3893 assertNoErrors(source2);
3894 verify([source, source2]);
3895 }
3896
3897 void test_unusedShownName_duplicates() {
3898 Source source = addSource(r'''
3899 library L;
3900 import 'lib1.dart' show A, B;
3901 import 'lib1.dart' show C, D;
3902 A a;
3903 C c;''');
3904 Source source2 = addNamedSource(
3905 "/lib1.dart",
3906 r'''
3907 library lib1;
3908 class A {}
3909 class B {}
3910 class C {}
3911 class D {}''');
3912 computeLibrarySourceErrors(source);
3913 assertErrors(
3914 source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
3915 assertNoErrors(source2);
3916 verify([source, source2]);
3917 }
3918
3919 void test_unusedShownName_topLevelVariable() {
3920 Source source = addSource(r'''
3921 library L;
3922 import 'lib1.dart' show var1, var2;
3923 import 'lib1.dart' show var3, var4;
3924 int a = var1;
3925 int b = var2;
3926 int c = var3;''');
3927 Source source2 = addNamedSource(
3928 "/lib1.dart",
3929 r'''
3930 library lib1;
3931 const int var1 = 1;
3932 const int var2 = 2;
3933 const int var3 = 3;
3934 const int var4 = 4;''');
3935 computeLibrarySourceErrors(source);
3936 assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
3937 assertNoErrors(source2);
3938 verify([source, source2]);
3939 }
3940
3941 void test_useOfVoidResult_assignmentExpression_function() {
3942 Source source = addSource(r'''
3943 void f() {}
3944 class A {
3945 n() {
3946 var a;
3947 a = f();
3948 }
3949 }''');
3950 computeLibrarySourceErrors(source);
3951 assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
3952 verify([source]);
3953 }
3954
3955 void test_useOfVoidResult_assignmentExpression_method() {
3956 Source source = addSource(r'''
3957 class A {
3958 void m() {}
3959 n() {
3960 var a;
3961 a = m();
3962 }
3963 }''');
3964 computeLibrarySourceErrors(source);
3965 assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
3966 verify([source]);
3967 }
3968
3969 void test_useOfVoidResult_inForLoop() {
3970 Source source = addSource(r'''
3971 class A {
3972 void m() {}
3973 n() {
3974 for(var a = m();;) {}
3975 }
3976 }''');
3977 computeLibrarySourceErrors(source);
3978 assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
3979 verify([source]);
3980 }
3981
3982 void test_useOfVoidResult_variableDeclaration_function() {
3983 Source source = addSource(r'''
3984 void f() {}
3985 class A {
3986 n() {
3987 var a = f();
3988 }
3989 }''');
3990 computeLibrarySourceErrors(source);
3991 assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
3992 verify([source]);
3993 }
3994
3995 void test_useOfVoidResult_variableDeclaration_method() {
3996 Source source = addSource(r'''
3997 class A {
3998 void m() {}
3999 n() {
4000 var a = m();
4001 }
4002 }''');
4003 computeLibrarySourceErrors(source);
4004 assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
4005 verify([source]);
4006 }
4007
4008 void test_useOfVoidResult_variableDeclaration_method2() {
4009 Source source = addSource(r'''
4010 class A {
4011 void m() {}
4012 n() {
4013 var a = m(), b = m();
4014 }
4015 }''');
4016 computeLibrarySourceErrors(source);
4017 assertErrors(
4018 source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]);
4019 verify([source]);
4020 }
4021 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698