| // 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:test_reflective_loader/test_reflective_loader.dart'; | |
| import '../src/dart/resolution/context_collection_resolution.dart'; | |
| main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(ErrorSuppressionTest); | |
| }); | |
| } | |
| @reflectiveTest | |
| class ErrorSuppressionTest extends PubPackageResolutionTest { | |
| String get ignoredCode => 'unused_element'; | |
| test_error_code_mismatch() async { | |
| await assertErrorsInCode(''' | |
| // ignore: $ignoredCode | |
| int x = ''; | |
| int _y = 0; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 34, 2), | |
| error(HintCode.UNUSED_ELEMENT, 42, 2), | |
| ]); | |
| } | |
| test_ignore_first() async { | |
| await assertErrorsInCode(''' | |
| // ignore: unnecessary_cast | |
| int x = (0 as int); | |
| // ... but no ignore here ... | |
| const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 88, | |
| 1), | |
| ]); | |
| } | |
| test_ignore_first_trailing() async { | |
| await assertErrorsInCode(''' | |
| int x = (0 as int); // ignore: unnecessary_cast | |
| // ... but no ignore here ... | |
| const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 88, | |
| 1), | |
| ]); | |
| } | |
| test_ignore_for_file() async { | |
| await assertErrorsInCode(''' | |
| int x = (0 as int); //UNNECESSARY_CAST | |
| const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| // ignore_for_file: unnecessary_cast | |
| ''', [ | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 49, | |
| 1), | |
| ]); | |
| } | |
| test_ignore_for_file_whitespace_variant() async { | |
| await assertNoErrorsInCode(''' | |
| //ignore_for_file: unused_element , unnecessary_cast | |
| int x = (0 as int); //UNNECESSARY_CAST | |
| String _foo = ''; //UNUSED_ELEMENT | |
| '''); | |
| } | |
| test_ignore_only_trailing() async { | |
| await assertNoErrorsInCode(''' | |
| int x = (0 as int); // ignore: unnecessary_cast | |
| '''); | |
| } | |
| test_ignore_second() async { | |
| await assertErrorsInCode(''' | |
| //UNNECESSARY_CAST | |
| int x = (0 as int); | |
| // ignore: unused_element | |
| String _foo = ''; //UNUSED_ELEMENT | |
| ''', [ | |
| error(HintCode.UNNECESSARY_CAST, 28, 8), | |
| ]); | |
| } | |
| test_ignore_second_trailing() async { | |
| await assertErrorsInCode(''' | |
| //UNNECESSARY_CAST | |
| int x = (0 as int); | |
| String _foo = ''; // ignore: $ignoredCode | |
| ''', [ | |
| error(HintCode.UNNECESSARY_CAST, 28, 8), | |
| ]); | |
| } | |
| test_ignore_uniqueName() async { | |
| writeTestPackageConfigWithMeta(); | |
| await assertNoErrorsInCode(''' | |
| import 'package:meta/meta.dart'; | |
| int f({@Required('x') int? a}) => 0; | |
| // ignore: missing_required_param_with_details | |
| int x = f(); | |
| '''); | |
| } | |
| test_ignore_upper_case() async { | |
| await assertNoErrorsInCode(''' | |
| int x = (0 as int); // ignore: UNNECESSARY_CAST | |
| '''); | |
| } | |
| test_invalid_error_code() async { | |
| await assertErrorsInCode(''' | |
| // ignore: right_format_wrong_code | |
| int x = ''; | |
| const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 2), | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 57, | |
| 1), | |
| ]); | |
| } | |
| test_missing_error_codes() async { | |
| await assertErrorsInCode(''' | |
| int x = 3; | |
| // ignore: | |
| const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43, | |
| 1), | |
| error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 1), | |
| ]); | |
| } | |
| test_missing_metadata_suffix() async { | |
| await assertErrorsInCode(''' | |
| // ignore invalid_assignment | |
| String y = 3; //INVALID_ASSIGNMENT | |
| ''', [ | |
| error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 40, 1), | |
| ]); | |
| } | |
| test_multiple_comments() async { | |
| await assertErrorsInCode(''' | |
| int x = (0 as int); //This is the first comment... | |
| // ignore: $ignoredCode | |
| String _foo = ''; //UNUSED_ELEMENT | |
| ''', [ | |
| error(HintCode.UNNECESSARY_CAST, 9, 8), | |
| ]); | |
| } | |
| test_multiple_ignore_for_files() async { | |
| await assertNoErrorsInCode(''' | |
| int x = (0 as int); //UNNECESSARY_CAST | |
| String _foo = ''; //UNUSED_ELEMENT | |
| // ignore_for_file: unnecessary_cast,$ignoredCode | |
| '''); | |
| } | |
| test_multiple_ignores() async { | |
| await assertNoErrorsInCode(''' | |
| int x = 3; | |
| // ignore: unnecessary_cast, $ignoredCode | |
| int _y = x as int; //UNNECESSARY_CAST, UNUSED_ELEMENT | |
| '''); | |
| } | |
| test_multiple_ignores_trailing() async { | |
| await assertNoErrorsInCode(''' | |
| int x = 3; | |
| int _y = x as int; // ignore: unnecessary_cast, $ignoredCode | |
| '''); | |
| } | |
| test_multiple_ignores_whitespace_variant_1() async { | |
| await assertNoErrorsInCode(''' | |
| int x = 3; | |
| //ignore:unnecessary_cast,$ignoredCode | |
| int _y = x as int; //UNNECESSARY_CAST, UNUSED_ELEMENT | |
| '''); | |
| } | |
| test_multiple_ignores_whitespace_variant_2() async { | |
| await assertNoErrorsInCode(''' | |
| int x = 3; | |
| //ignore: unnecessary_cast,$ignoredCode | |
| int _y = x as int; //UNNECESSARY_CAST, UNUSED_ELEMENT | |
| '''); | |
| } | |
| test_multiple_ignores_whitespace_variant_3() async { | |
| await assertNoErrorsInCode(''' | |
| int x = 3; | |
| // ignore: unnecessary_cast,$ignoredCode | |
| int _y = x as int; //UNNECESSARY_CAST, UNUSED_ELEMENT | |
| '''); | |
| } | |
| test_no_ignores() async { | |
| await assertErrorsInCode(''' | |
| int x = ''; //INVALID_ASSIGNMENT | |
| const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE | |
| ''', [ | |
| error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 2), | |
| error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43, | |
| 1), | |
| ]); | |
| } | |
| test_trailing_not_above() async { | |
| await assertErrorsInCode(''' | |
| int x = (0 as int); // ignore: unnecessary_cast | |
| int y = (0 as int); | |
| ''', [ | |
| error(HintCode.UNNECESSARY_CAST, 57, 8), | |
| ]); | |
| } | |
| test_undefined_function_within_flutter_can_be_ignored() async { | |
| await assertErrorsInFile( | |
| '$workspaceRootPath/flutterlib/flutter.dart', | |
| ''' | |
| // ignore: undefined_function | |
| f() => g(); | |
| ''', | |
| [], | |
| ); | |
| } | |
| test_undefined_function_within_flutter_without_ignore() async { | |
| await assertErrorsInFile( | |
| '$workspaceRootPath/flutterlib/flutter.dart', | |
| ''' | |
| f() => g(); | |
| ''', | |
| [error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 7, 1)], | |
| ); | |
| } | |
| test_undefined_prefixed_name_within_flutter_can_be_ignored() async { | |
| await assertErrorsInFile( | |
| '$workspaceRootPath/flutterlib/flutter.dart', | |
| ''' | |
| import 'dart:collection' as c; | |
| // ignore: undefined_prefixed_name | |
| f() => c.g; | |
| ''', | |
| [], | |
| ); | |
| } | |
| } |