| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:analyzer/src/error/codes.dart'; |
| import 'package:analyzer/src/generated/engine.dart'; |
| import 'package:analyzer/src/generated/parser.dart'; |
| import 'package:analyzer/src/generated/source.dart'; |
| import 'package:analyzer/src/task/options.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import '../src/util/yaml_test.dart'; |
| import 'resolver_test_case.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(HintCodeTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class HintCodeTest extends ResolverTestCase { |
| @override |
| void reset() { |
| super.resetWith(packages: [ |
| [ |
| 'js', |
| r''' |
| library js; |
| class JS { |
| const JS([String js]); |
| } |
| ''' |
| ], |
| ]); |
| } |
| |
| test_deprecatedFunction_class() async { |
| Source source = addSource(r''' |
| class Function {} |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION]); |
| verify([source]); |
| } |
| |
| test_deprecatedFunction_extends() async { |
| Source source = addSource(r''' |
| class A extends Function {} |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.DEPRECATED_EXTENDS_FUNCTION]); |
| verify([source]); |
| } |
| |
| test_deprecatedFunction_extends2() async { |
| Source source = addSource(r''' |
| class Function {} |
| class A extends Function {} |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [ |
| HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, |
| HintCode.DEPRECATED_EXTENDS_FUNCTION |
| ]); |
| verify([source]); |
| } |
| |
| test_deprecatedFunction_mixin() async { |
| Source source = addSource(r''' |
| class A extends Object with Function {} |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.DEPRECATED_MIXIN_FUNCTION]); |
| verify([source]); |
| } |
| |
| test_deprecatedFunction_mixin2() async { |
| Source source = addSource(r''' |
| class Function {} |
| class A extends Object with Function {} |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [ |
| HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, |
| HintCode.DEPRECATED_MIXIN_FUNCTION |
| ]); |
| verify([source]); |
| } |
| |
| test_duplicateShownHiddenName_hidden() async { |
| Source source = addSource(r''' |
| library L; |
| export 'lib1.dart' hide A, B, A;'''); |
| addNamedSource("/lib1.dart", r''' |
| library lib1; |
| class A {} |
| class B {}'''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.DUPLICATE_HIDDEN_NAME]); |
| verify([source]); |
| } |
| |
| test_duplicateShownHiddenName_shown() async { |
| Source source = addSource(r''' |
| library L; |
| export 'lib1.dart' show A, B, A;'''); |
| addNamedSource("/lib1.dart", r''' |
| library lib1; |
| class A {} |
| class B {}'''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.DUPLICATE_SHOWN_NAME]); |
| verify([source]); |
| } |
| |
| test_isDouble() async { |
| AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| options.dart2jsHint = true; |
| resetWith(options: options); |
| Source source = addSource("var v = 1 is double;"); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.IS_DOUBLE]); |
| verify([source]); |
| } |
| |
| @failingTest |
| test_isInt() async { |
| Source source = addSource("var v = 1 is int;"); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.IS_INT]); |
| verify([source]); |
| } |
| |
| test_isNotDouble() async { |
| AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| options.dart2jsHint = true; |
| resetWith(options: options); |
| Source source = addSource("var v = 1 is! double;"); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.IS_NOT_DOUBLE]); |
| verify([source]); |
| } |
| |
| @failingTest |
| test_isNotInt() async { |
| Source source = addSource("var v = 1 is! int;"); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.IS_NOT_INT]); |
| verify([source]); |
| } |
| |
| test_js_lib_OK() async { |
| Source source = addSource(r''' |
| @JS() |
| library foo; |
| |
| import 'package:js/js.dart'; |
| |
| @JS() |
| class A { } |
| '''); |
| await computeAnalysisResult(source); |
| assertNoErrors(source); |
| verify([source]); |
| } |
| |
| test_missingJsLibAnnotation_class() async { |
| Source source = addSource(r''' |
| library foo; |
| |
| import 'package:js/js.dart'; |
| |
| @JS() |
| class A { } |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
| verify([source]); |
| } |
| |
| test_missingJsLibAnnotation_externalField() async { |
| // https://github.com/dart-lang/sdk/issues/26987 |
| Source source = addSource(r''' |
| import 'package:js/js.dart'; |
| |
| @JS() |
| external dynamic exports; |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, |
| [ParserErrorCode.EXTERNAL_FIELD, HintCode.MISSING_JS_LIB_ANNOTATION]); |
| verify([source]); |
| } |
| |
| test_missingJsLibAnnotation_function() async { |
| Source source = addSource(r''' |
| library foo; |
| |
| import 'package:js/js.dart'; |
| |
| @JS('acxZIndex') |
| set _currentZIndex(int value) { } |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
| verify([source]); |
| } |
| |
| test_missingJsLibAnnotation_method() async { |
| Source source = addSource(r''' |
| library foo; |
| |
| import 'package:js/js.dart'; |
| |
| class A { |
| @JS() |
| void a() { } |
| } |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
| verify([source]); |
| } |
| |
| test_missingJsLibAnnotation_variable() async { |
| Source source = addSource(r''' |
| import 'package:js/js.dart'; |
| |
| @JS() |
| dynamic variable; |
| '''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]); |
| verify([source]); |
| } |
| |
| test_strongMode_downCastCompositeHint() async { |
| AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| options.strongModeHints = true; |
| resetWith(options: options); |
| Source source = addSource(r''' |
| main() { |
| List dynamicList = [ ]; |
| List<int> list = dynamicList; |
| print(list); |
| }'''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [StrongModeCode.DOWN_CAST_COMPOSITE]); |
| verify([source]); |
| } |
| |
| test_strongMode_downCastCompositeNoHint() async { |
| AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| options.strongModeHints = false; |
| resetWith(options: options); |
| Source source = addSource(r''' |
| main() { |
| List dynamicList = [ ]; |
| List<int> list = dynamicList; |
| print(list); |
| }'''); |
| await computeAnalysisResult(source); |
| assertNoErrors(source); |
| verify([source]); |
| } |
| |
| test_strongMode_downCastCompositeWarn() async { |
| AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
| applyToAnalysisOptions( |
| options, |
| wrap({ |
| AnalyzerOptions.analyzer: { |
| AnalyzerOptions.errors: { |
| StrongModeCode.DOWN_CAST_COMPOSITE.name: 'warning' |
| }, |
| } |
| })); |
| options.strongModeHints = false; |
| resetWith(options: options); |
| Source source = addSource(r''' |
| main() { |
| List dynamicList = [ ]; |
| List<int> list = dynamicList; |
| print(list); |
| }'''); |
| await computeAnalysisResult(source); |
| assertErrors(source, [StrongModeCode.DOWN_CAST_COMPOSITE]); |
| verify([source]); |
| } |
| } |