OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer.test.generated.hint_code_test; | 5 library analyzer.test.generated.hint_code_test; |
6 | 6 |
7 import 'package:analyzer/src/generated/engine.dart'; | 7 import 'package:analyzer/src/generated/engine.dart'; |
8 import 'package:analyzer/src/generated/error.dart'; | 8 import 'package:analyzer/src/generated/error.dart'; |
| 9 import 'package:analyzer/src/generated/parser.dart'; |
9 import 'package:analyzer/src/generated/source_io.dart'; | 10 import 'package:analyzer/src/generated/source_io.dart'; |
10 import 'package:unittest/unittest.dart'; | 11 import 'package:unittest/unittest.dart'; |
11 | 12 |
12 import '../reflective_tests.dart'; | 13 import '../reflective_tests.dart'; |
13 import '../utils.dart'; | 14 import '../utils.dart'; |
14 import 'analysis_context_factory.dart'; | 15 import 'analysis_context_factory.dart'; |
15 import 'resolver_test_case.dart'; | 16 import 'resolver_test_case.dart'; |
16 | 17 |
17 main() { | 18 main() { |
18 initializeTestEnvironment(); | 19 initializeTestEnvironment(); |
19 runReflectiveTests(HintCodeTest); | 20 runReflectiveTests(HintCodeTest); |
20 } | 21 } |
21 | 22 |
22 @reflectiveTest | 23 @reflectiveTest |
23 class HintCodeTest extends ResolverTestCase { | 24 class HintCodeTest extends ResolverTestCase { |
24 void fail_isInt() { | |
25 Source source = addSource("var v = 1 is int;"); | |
26 computeLibrarySourceErrors(source); | |
27 assertErrors(source, [HintCode.IS_INT]); | |
28 verify([source]); | |
29 } | |
30 | |
31 void fail_isNotInt() { | |
32 Source source = addSource("var v = 1 is! int;"); | |
33 computeLibrarySourceErrors(source); | |
34 assertErrors(source, [HintCode.IS_NOT_INT]); | |
35 verify([source]); | |
36 } | |
37 | |
38 void fail_overrideEqualsButNotHashCode() { | |
39 Source source = addSource(r''' | |
40 class A { | |
41 bool operator ==(x) {} | |
42 }'''); | |
43 computeLibrarySourceErrors(source); | |
44 assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]); | |
45 verify([source]); | |
46 } | |
47 | |
48 void fail_unusedImport_as_equalPrefixes() { | |
49 // See todo at ImportsVerifier.prefixElementMap. | |
50 Source source = addSource(r''' | |
51 library L; | |
52 import 'lib1.dart' as one; | |
53 import 'lib2.dart' as one; | |
54 one.A a;'''); | |
55 Source source2 = addNamedSource( | |
56 "/lib1.dart", | |
57 r''' | |
58 library lib1; | |
59 class A {}'''); | |
60 Source source3 = addNamedSource( | |
61 "/lib2.dart", | |
62 r''' | |
63 library lib2; | |
64 class B {}'''); | |
65 computeLibrarySourceErrors(source); | |
66 assertErrors(source, [HintCode.UNUSED_IMPORT]); | |
67 assertNoErrors(source2); | |
68 assertNoErrors(source3); | |
69 verify([source, source2, source3]); | |
70 } | |
71 | |
72 @override | 25 @override |
73 void reset() { | 26 void reset() { |
74 analysisContext2 = AnalysisContextFactory.contextWithCoreAndPackages({ | 27 analysisContext2 = AnalysisContextFactory.contextWithCoreAndPackages({ |
75 'package:meta/meta.dart': r''' | 28 'package:meta/meta.dart': r''' |
76 library meta; | 29 library meta; |
77 | 30 |
78 const _Factory factory = const _Factory(); | 31 const _Factory factory = const _Factory(); |
79 const _Literal literal = const _Literal(); | 32 const _Literal literal = const _Literal(); |
80 const _MustCallSuper mustCallSuper = const _MustCallSuper(); | 33 const _MustCallSuper mustCallSuper = const _MustCallSuper(); |
81 const _Override override = const _Override(); | 34 const _Override override = const _Override(); |
(...skipping 1637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 void test_isDouble() { | 1672 void test_isDouble() { |
1720 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); | 1673 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
1721 options.dart2jsHint = true; | 1674 options.dart2jsHint = true; |
1722 resetWithOptions(options); | 1675 resetWithOptions(options); |
1723 Source source = addSource("var v = 1 is double;"); | 1676 Source source = addSource("var v = 1 is double;"); |
1724 computeLibrarySourceErrors(source); | 1677 computeLibrarySourceErrors(source); |
1725 assertErrors(source, [HintCode.IS_DOUBLE]); | 1678 assertErrors(source, [HintCode.IS_DOUBLE]); |
1726 verify([source]); | 1679 verify([source]); |
1727 } | 1680 } |
1728 | 1681 |
| 1682 @failingTest |
| 1683 void test_isInt() { |
| 1684 Source source = addSource("var v = 1 is int;"); |
| 1685 computeLibrarySourceErrors(source); |
| 1686 assertErrors(source, [HintCode.IS_INT]); |
| 1687 verify([source]); |
| 1688 } |
| 1689 |
1729 void test_isNotDouble() { | 1690 void test_isNotDouble() { |
1730 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); | 1691 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
1731 options.dart2jsHint = true; | 1692 options.dart2jsHint = true; |
1732 resetWithOptions(options); | 1693 resetWithOptions(options); |
1733 Source source = addSource("var v = 1 is! double;"); | 1694 Source source = addSource("var v = 1 is! double;"); |
1734 computeLibrarySourceErrors(source); | 1695 computeLibrarySourceErrors(source); |
1735 assertErrors(source, [HintCode.IS_NOT_DOUBLE]); | 1696 assertErrors(source, [HintCode.IS_NOT_DOUBLE]); |
1736 verify([source]); | 1697 verify([source]); |
1737 } | 1698 } |
1738 | 1699 |
| 1700 @failingTest |
| 1701 void test_isNotInt() { |
| 1702 Source source = addSource("var v = 1 is! int;"); |
| 1703 computeLibrarySourceErrors(source); |
| 1704 assertErrors(source, [HintCode.IS_NOT_INT]); |
| 1705 verify([source]); |
| 1706 } |
| 1707 |
1739 void test_js_lib_OK() { | 1708 void test_js_lib_OK() { |
1740 Source source = addSource(r''' | 1709 Source source = addSource(r''' |
1741 @JS() | 1710 @JS() |
1742 library foo; | 1711 library foo; |
1743 | 1712 |
1744 import 'package:js/js.dart'; | 1713 import 'package:js/js.dart'; |
1745 | 1714 |
1746 @JS() | 1715 @JS() |
1747 class A { } | 1716 class A { } |
1748 '''); | 1717 '''); |
1749 computeLibrarySourceErrors(source); | 1718 computeLibrarySourceErrors(source); |
1750 assertNoErrors(source); | 1719 assertNoErrors(source); |
1751 verify([source]); | 1720 verify([source]); |
1752 } | 1721 } |
1753 | 1722 |
1754 void test_missing_js_lib_on_class_decl() { | 1723 void test_missingJsLibAnnotation_class() { |
1755 Source source = addSource(r''' | 1724 Source source = addSource(r''' |
1756 library foo; | 1725 library foo; |
1757 | 1726 |
1758 import 'package:js/js.dart'; | 1727 import 'package:js/js.dart'; |
1759 | 1728 |
1760 @JS() | 1729 @JS() |
1761 class A { } | 1730 class A { } |
1762 '''); | 1731 '''); |
1763 computeLibrarySourceErrors(source); | 1732 computeLibrarySourceErrors(source); |
1764 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); | 1733 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
1765 verify([source]); | 1734 verify([source]); |
1766 } | 1735 } |
1767 | 1736 |
1768 void test_missing_js_lib_on_function() { | 1737 void test_missingJsLibAnnotation_externalField() { |
| 1738 // https://github.com/dart-lang/sdk/issues/26987 |
| 1739 Source source = addSource(r''' |
| 1740 import 'package:js/js.dart'; |
| 1741 |
| 1742 @JS() |
| 1743 external dynamic exports; |
| 1744 '''); |
| 1745 computeLibrarySourceErrors(source); |
| 1746 assertErrors(source, |
| 1747 [ParserErrorCode.EXTERNAL_FIELD, HintCode.MISSING_JS_LIB_ANNOTATION]); |
| 1748 verify([source]); |
| 1749 } |
| 1750 |
| 1751 void test_missingJsLibAnnotation_function() { |
1769 Source source = addSource(r''' | 1752 Source source = addSource(r''' |
1770 library foo; | 1753 library foo; |
1771 | 1754 |
1772 import 'package:js/js.dart'; | 1755 import 'package:js/js.dart'; |
1773 | 1756 |
1774 @JS('acxZIndex') | 1757 @JS('acxZIndex') |
1775 set _currentZIndex(int value) { } | 1758 set _currentZIndex(int value) { } |
1776 '''); | 1759 '''); |
1777 computeLibrarySourceErrors(source); | 1760 computeLibrarySourceErrors(source); |
1778 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); | 1761 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
1779 verify([source]); | 1762 verify([source]); |
1780 } | 1763 } |
1781 | 1764 |
1782 void test_missing_js_lib_on_member() { | 1765 void test_missingJsLibAnnotation_method() { |
1783 Source source = addSource(r''' | 1766 Source source = addSource(r''' |
1784 library foo; | 1767 library foo; |
1785 | 1768 |
1786 import 'package:js/js.dart'; | 1769 import 'package:js/js.dart'; |
1787 | 1770 |
1788 class A { | 1771 class A { |
1789 @JS() | 1772 @JS() |
1790 void a() { } | 1773 void a() { } |
1791 } | 1774 } |
1792 '''); | 1775 '''); |
1793 computeLibrarySourceErrors(source); | 1776 computeLibrarySourceErrors(source); |
1794 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); | 1777 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
1795 verify([source]); | 1778 verify([source]); |
1796 } | 1779 } |
1797 | 1780 |
| 1781 void test_missingJsLibAnnotation_variable() { |
| 1782 Source source = addSource(r''' |
| 1783 import 'package:js/js.dart'; |
| 1784 |
| 1785 @JS() |
| 1786 dynamic variable; |
| 1787 '''); |
| 1788 computeLibrarySourceErrors(source); |
| 1789 assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
| 1790 verify([source]); |
| 1791 } |
| 1792 |
1798 void test_missingReturn_async() { | 1793 void test_missingReturn_async() { |
1799 Source source = addSource(''' | 1794 Source source = addSource(''' |
1800 import 'dart:async'; | 1795 import 'dart:async'; |
1801 Future<int> f() async {} | 1796 Future<int> f() async {} |
1802 '''); | 1797 '''); |
1803 computeLibrarySourceErrors(source); | 1798 computeLibrarySourceErrors(source); |
1804 assertErrors(source, [HintCode.MISSING_RETURN]); | 1799 assertErrors(source, [HintCode.MISSING_RETURN]); |
1805 verify([source]); | 1800 verify([source]); |
1806 } | 1801 } |
1807 | 1802 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2040 Source source = addSource(r''' | 2035 Source source = addSource(r''' |
2041 m(x) { | 2036 m(x) { |
2042 while (x?.a) {} | 2037 while (x?.a) {} |
2043 } | 2038 } |
2044 '''); | 2039 '''); |
2045 computeLibrarySourceErrors(source); | 2040 computeLibrarySourceErrors(source); |
2046 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]); | 2041 assertErrors(source, [HintCode.NULL_AWARE_IN_CONDITION]); |
2047 verify([source]); | 2042 verify([source]); |
2048 } | 2043 } |
2049 | 2044 |
| 2045 @failingTest |
| 2046 void test_overrideEqualsButNotHashCode() { |
| 2047 Source source = addSource(r''' |
| 2048 class A { |
| 2049 bool operator ==(x) {} |
| 2050 }'''); |
| 2051 computeLibrarySourceErrors(source); |
| 2052 assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]); |
| 2053 verify([source]); |
| 2054 } |
| 2055 |
2050 void test_overrideOnNonOverridingField_invalid() { | 2056 void test_overrideOnNonOverridingField_invalid() { |
2051 Source source = addSource(r''' | 2057 Source source = addSource(r''' |
2052 library dart.core; | 2058 library dart.core; |
2053 const override = null; | 2059 const override = null; |
2054 class A { | 2060 class A { |
2055 } | 2061 } |
2056 class B extends A { | 2062 class B extends A { |
2057 @override | 2063 @override |
2058 final int m = 1; | 2064 final int m = 1; |
2059 }'''); | 2065 }'''); |
(...skipping 1444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3504 "/lib1.dart", | 3510 "/lib1.dart", |
3505 r''' | 3511 r''' |
3506 library lib1; | 3512 library lib1; |
3507 class A {}'''); | 3513 class A {}'''); |
3508 computeLibrarySourceErrors(source); | 3514 computeLibrarySourceErrors(source); |
3509 assertErrors(source, [HintCode.UNUSED_IMPORT]); | 3515 assertErrors(source, [HintCode.UNUSED_IMPORT]); |
3510 assertNoErrors(source2); | 3516 assertNoErrors(source2); |
3511 verify([source, source2]); | 3517 verify([source, source2]); |
3512 } | 3518 } |
3513 | 3519 |
| 3520 @failingTest |
| 3521 void test_unusedImport_as_equalPrefixes() { |
| 3522 // See todo at ImportsVerifier.prefixElementMap. |
| 3523 Source source = addSource(r''' |
| 3524 library L; |
| 3525 import 'lib1.dart' as one; |
| 3526 import 'lib2.dart' as one; |
| 3527 one.A a;'''); |
| 3528 Source source2 = addNamedSource( |
| 3529 "/lib1.dart", |
| 3530 r''' |
| 3531 library lib1; |
| 3532 class A {}'''); |
| 3533 Source source3 = addNamedSource( |
| 3534 "/lib2.dart", |
| 3535 r''' |
| 3536 library lib2; |
| 3537 class B {}'''); |
| 3538 computeLibrarySourceErrors(source); |
| 3539 assertErrors(source, [HintCode.UNUSED_IMPORT]); |
| 3540 assertNoErrors(source2); |
| 3541 assertNoErrors(source3); |
| 3542 verify([source, source2, source3]); |
| 3543 } |
| 3544 |
3514 void test_unusedImport_hide() { | 3545 void test_unusedImport_hide() { |
3515 Source source = addSource(r''' | 3546 Source source = addSource(r''' |
3516 library L; | 3547 library L; |
3517 import 'lib1.dart'; | 3548 import 'lib1.dart'; |
3518 import 'lib1.dart' hide A; | 3549 import 'lib1.dart' hide A; |
3519 A a;'''); | 3550 A a;'''); |
3520 Source source2 = addNamedSource( | 3551 Source source2 = addNamedSource( |
3521 "/lib1.dart", | 3552 "/lib1.dart", |
3522 r''' | 3553 r''' |
3523 library lib1; | 3554 library lib1; |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3894 n() { | 3925 n() { |
3895 var a = m(), b = m(); | 3926 var a = m(), b = m(); |
3896 } | 3927 } |
3897 }'''); | 3928 }'''); |
3898 computeLibrarySourceErrors(source); | 3929 computeLibrarySourceErrors(source); |
3899 assertErrors( | 3930 assertErrors( |
3900 source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]); | 3931 source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]); |
3901 verify([source]); | 3932 verify([source]); |
3902 } | 3933 } |
3903 } | 3934 } |
OLD | NEW |