diff --git a/DEPS b/DEPS index 75c5e03454f..689f3a8cad9 100644 --- a/DEPS +++ b/DEPS @@ -145,7 +145,7 @@ vars = { "http_parser_rev": "b3b283b9f139640b932d604e8815460bbd3ecab5", "intl_rev": "fca552f2ec5d682b5fa36f02bdd72a5a4e2edcee", "json_rpc_2_rev": "0280ac6cb4f3905d81c47ba927123ba2b95f7940", - "linter_rev": "07c4d177bca9e3b670ab67a7c9a8cffeb90aa318", # disable rev_sdk_deps.dart + "linter_rev": "7c7db85d29b46af51e3f4a5e0a33440c4e3791fc", # disable rev_sdk_deps.dart "lints_rev": "dfded5e265015f21ce154577fe8488dc244e33c2", "logging_rev": "abef3717d958158eb8b0ddb2871f4b15a9804cd4", "markdown_rev": "ecbffa9bf9109d490b9388e9cb1f2bb801aee63c", diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart index 7a115487d0a..2135f67f109 100644 --- a/pkg/analysis_server/lib/src/lsp/mapping.dart +++ b/pkg/analysis_server/lib/src/lsp/mapping.dart @@ -35,10 +35,8 @@ const languageSourceName = 'dart'; final diagnosticTagsForErrorCode = >{ _errorCode(WarningCode.DEAD_CODE): [lsp.DiagnosticTag.Unnecessary], _errorCode(HintCode.DEPRECATED_MEMBER_USE): [lsp.DiagnosticTag.Deprecated], - _errorCode(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE): [ - lsp.DiagnosticTag.Deprecated - ], - _errorCode(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE): [ + 'deprecated_member_use_from_same_package': [lsp.DiagnosticTag.Deprecated], + 'deprecated_member_use_from_same_package_with_message': [ lsp.DiagnosticTag.Deprecated ], _errorCode(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE): [ @@ -1360,9 +1358,8 @@ lsp.WorkspaceEdit toWorkspaceEdit( final supportsDocumentChanges = capabilities.documentChanges; if (supportsDocumentChanges) { final supportsCreate = capabilities.createResourceOperations; - final changes = < - Either4>[]; + final changes = >[]; // Convert each SourceEdit to either a TextDocumentEdit or a // CreateFile + a TextDocumentEdit depending on whether it's a new diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart index a78dc3539c4..47e07ed5abc 100644 --- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart +++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart @@ -132,15 +132,9 @@ class BulkFixProcessor { HintCode.DEPRECATED_MEMBER_USE: [ DataDriven.new, ], - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE: [ - DataDriven.new, - ], HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE: [ DataDriven.new, ], - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE: [ - DataDriven.new, - ], WarningCode.OVERRIDE_ON_NON_OVERRIDING_METHOD: [ DataDriven.new, ], @@ -457,6 +451,16 @@ class BulkFixProcessor { if (isCancelled) { return; } + var multiGenerators = FixProcessor.lintMultiProducerMap[codeName]; + if (multiGenerators != null) { + for (var multiGenerator in multiGenerators) { + var multiProducer = multiGenerator(); + multiProducer.configure(context); + for (var producer in await multiProducer.producers) { + await _generateFix(context, producer, codeName); + } + } + } } else { var generators = FixProcessor.nonLintProducerMap[errorCode] ?? []; await bulkApply(generators, codeName); diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml index 5e6dfef76e2..68ecc26e8a2 100644 --- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml +++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml @@ -1637,6 +1637,14 @@ LintCode.depend_on_referenced_packages: status: needsFix LintCode.deprecated_consistency: status: needsEvaluation +LintCode.deprecated_member_use_from_same_package: + status: needsFix + notes: |- + Should probably be able to use `DataDriven`. +LintCode.deprecated_member_use_from_same_package_with_message: + status: needsFix + notes: |- + Should probably be able to use `DataDriven`. LintCode.diagnostic_describe_all_properties: status: hasFix LintCode.directives_ordering: diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart index 0fbdb42d739..438dad5de64 100644 --- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart +++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart @@ -361,6 +361,13 @@ class FixInFileProcessor { /// The computer for Dart fixes. class FixProcessor extends BaseProcessor { + static final Map> lintMultiProducerMap = + { + LintNames.deprecated_member_use_from_same_package: [ + DataDriven.new, + ], + }; + /// A map from the names of lint rules to a list of the generators that are /// used to create correction producers. The generators are then used to build /// fixes for those diagnostics. The generators used for non-lint diagnostics diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart index b11a5f8c5b2..1743c25c0de 100644 --- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart +++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart @@ -57,6 +57,8 @@ class LintNames { 'curly_braces_in_flow_control_structures'; static const String dangling_library_doc_comments = 'dangling_library_doc_comments'; + static const String deprecated_member_use_from_same_package = + 'deprecated_member_use_from_same_package'; static const String diagnostic_describe_all_properties = 'diagnostic_describe_all_properties'; static const String directives_ordering = 'directives_ordering'; diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart index 5c11923fd34..3b9e7f19c95 100644 --- a/pkg/analysis_server/test/lsp/diagnostic_test.dart +++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:analysis_server/lsp_protocol/protocol.dart'; +import 'package:analyzer/src/test_utilities/package_config_file_builder.dart'; import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin; import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin; import 'package:linter/src/rules.dart'; @@ -175,10 +176,18 @@ void f() { } Future test_diagnosticTag_deprecated() async { - newFile(mainFilePath, ''' + var onePackagePath = convertPath('/home/one'); + writePackageConfig( + projectFolderPath, + config: PackageConfigFileBuilder() + ..add(name: 'one', rootPath: onePackagePath), + ); + newFile(convertPath('$onePackagePath/lib/one.dart'), ''' @deprecated int? dep; - + '''); + newFile(mainFilePath, r''' + import 'package:one/one.dart'; void f() => print(dep); '''); @@ -189,15 +198,23 @@ void f() { final diagnostics = await diagnosticsUpdate; expect(diagnostics, hasLength(1)); final diagnostic = diagnostics!.first; - expect(diagnostic.code, equals('deprecated_member_use_from_same_package')); + expect(diagnostic.code, equals('deprecated_member_use')); expect(diagnostic.tags, contains(DiagnosticTag.Deprecated)); } Future test_diagnosticTag_notSupported() async { - newFile(mainFilePath, ''' + var onePackagePath = convertPath('/home/one'); + writePackageConfig( + projectFolderPath, + config: PackageConfigFileBuilder() + ..add(name: 'one', rootPath: onePackagePath), + ); + newFile(convertPath('$onePackagePath/lib/one.dart'), ''' @deprecated int? dep; - + '''); + newFile(mainFilePath, r''' + import 'package:one/one.dart'; void f() => print(dep); '''); @@ -206,7 +223,7 @@ void f() { final diagnostics = await diagnosticsUpdate; expect(diagnostics, hasLength(1)); final diagnostic = diagnostics!.first; - expect(diagnostic.code, equals('deprecated_member_use_from_same_package')); + expect(diagnostic.code, equals('deprecated_member_use')); expect(diagnostic.tags, isNull); } diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart index d9438af4fc0..23aceaef5c1 100644 --- a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart +++ b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart @@ -61,6 +61,9 @@ class HintCode extends AnalyzerErrorCode { /// Parameters: /// 0: the name of the member + /// + /// This code is deprecated in favor of the + /// 'deprecated_member_from_same_package' lint rule, and will be removed. static const HintCode DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE = HintCode( 'DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE', "'{0}' is deprecated and shouldn't be used.", @@ -72,6 +75,9 @@ class HintCode extends AnalyzerErrorCode { /// Parameters: /// 0: the name of the member /// 1: message details + /// + /// This code is deprecated in favor of the + /// 'deprecated_member_from_same_package' lint rule, and will be removed. static const HintCode DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE = HintCode( 'DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE', diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart index 8fff94eb497..cf5590ed769 100644 --- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart +++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart @@ -306,13 +306,14 @@ class DeprecatedMemberUseVerifier extends BaseDeprecatedMemberUseVerifier { void reportError( AstNode errorNode, Element element, String displayName, String? message) { var library = element is LibraryElement ? element : element.library; + if (_isLibraryInWorkspacePackage(library)) { + return; + } message = message?.trim(); if (message == null || message.isEmpty || message == '.') { _errorReporter.reportErrorForNode( - _isLibraryInWorkspacePackage(library) - ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE - : HintCode.DEPRECATED_MEMBER_USE, + HintCode.DEPRECATED_MEMBER_USE, errorNode, [displayName], ); @@ -323,9 +324,7 @@ class DeprecatedMemberUseVerifier extends BaseDeprecatedMemberUseVerifier { message = '$message.'; } _errorReporter.reportErrorForNode( - _isLibraryInWorkspacePackage(library) - ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE - : HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, + HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, errorNode, [displayName, message], ); diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml index 5ed1fc2efc0..fd689124713 100644 --- a/pkg/analyzer/messages.yaml +++ b/pkg/analyzer/messages.yaml @@ -19377,6 +19377,9 @@ HintCode: comment: |- Parameters: 0: the name of the member + + This code is deprecated in favor of the + 'deprecated_member_from_same_package' lint rule, and will be removed. documentation: |- #### Description @@ -19407,6 +19410,9 @@ HintCode: Parameters: 0: the name of the member 1: message details + + This code is deprecated in favor of the + 'deprecated_member_from_same_package' lint rule, and will be removed. DIVISION_OPTIMIZATION: problemMessage: The operator x ~/ y is more efficient than (x / y).toInt(). correctionMessage: "Try re-writing the expression to use the '~/' operator." diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart index d1d0de43049..60415ce05bf 100644 --- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart +++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart @@ -7,6 +7,7 @@ import 'package:analyzer/src/error/codes.dart'; import 'package:analyzer/src/utilities/legacy.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; +import '../../generated/test_support.dart'; import '../dart/resolution/context_collection_resolution.dart'; main() { @@ -18,16 +19,6 @@ main() { defineReflectiveTests(DeprecatedMemberUse_BlazeWorkspaceTest); defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest); defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest); - - defineReflectiveTests( - DeprecatedMemberUseFromSamePackage_BasicWorkspaceTest, - ); - defineReflectiveTests( - DeprecatedMemberUseFromSamePackage_BlazeWorkspaceTest, - ); - defineReflectiveTests( - DeprecatedMemberUseFromSamePackage_PackageBuildWorkspaceTest, - ); }); } @@ -39,6 +30,46 @@ class DeprecatedMemberUse_BasicWorkspace_WithoutNullSafetyTest @reflectiveTest class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest with DeprecatedMemberUse_BasicWorkspaceTestCases { + test_inDeprecatedEnum() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +void f() {} +''', + code: r''' +@deprecated +enum E { + one, two; + + void m() { + f(); + } +} +''', + ); + } + + test_inEnum() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +void f() {} +''', + code: r''' +enum E { + one, two; + + void m() { + f(); + } +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 68, 1), + ], + ); + } + test_instanceCreation_namedParameter_fromLegacy() async { noSoundNullSafety = false; newFile('$workspaceRootPath/aaa/lib/a.dart', r''' @@ -119,6 +150,35 @@ class B extends A { } mixin DeprecatedMemberUse_BasicWorkspaceTestCases on PubPackageResolutionTest { + String get externalLibPath => '$workspaceRootPath/aaa/lib/a.dart'; + + String get externalLibUri => 'package:aaa/a.dart'; + + Future assertErrorsInCode2( + List expectedErrors, { + required String externalCode, + required String code, + }) async { + newFile(externalLibPath, externalCode); + + await assertErrorsInCode(''' +import '$externalLibUri'; +$code +''', expectedErrors); + } + + Future assertNoErrorsInCode2({ + required String externalCode, + required String code, + }) async { + newFile(externalLibPath, externalCode); + + await assertNoErrorsInCode(''' +import '$externalLibUri'; +$code +'''); + } + @override void setUp() { super.setUp(); @@ -129,6 +189,145 @@ mixin DeprecatedMemberUse_BasicWorkspaceTestCases on PubPackageResolutionTest { ); } + test_assignmentExpression_compound_deprecatedGetter() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int get x => 0; + +set x(int _) {} +''', + code: r''' +void f() { + x += 2; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_assignmentExpression_compound_deprecatedSetter() async { + await assertErrorsInCode2( + externalCode: r''' +int get x => 0; + +@deprecated +set x(int _) {} +''', + code: r''' +void f() { + x += 2; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_assignmentExpression_simple_deprecatedGetter() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +int get x => 0; + +set x(int _) {} +''', + code: r''' +void f() { + x = 0; +} +''', + ); + } + + test_assignmentExpression_simple_deprecatedGetterSetter() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + x = 0; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_assignmentExpression_simple_deprecatedSetter() async { + await assertErrorsInCode2( + externalCode: r''' +int get x => 0; + +@deprecated +set x(int _) {} +''', + code: r''' +void f() { + x = 0; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_call() async { + await assertErrorsInCode2(externalCode: r''' +class A { + @deprecated + call() {} +} +''', code: r''' +void f(A a) { + a(); +} +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 45, 3), + ]); + } + + test_class() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +class A {} +''', + code: r''' +void f(A a) {} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 36, 1), + ], + ); + } + + test_compoundAssignment() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + A operator+(A a) { return a; } +} +''', + code: r''' +f(A a, A b) { + a += b; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 45, 6), + ], + ); + } + test_export() async { newFile('$workspaceRootPath/aaa/lib/a.dart', r''' @deprecated @@ -142,6 +341,63 @@ export 'package:aaa/a.dart'; ]); } + test_extensionOverride() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +extension E on int { + int get foo => 0; +} +''', + code: ''' +void f() { + E(0).foo; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_field_implicitGetter() async { + newFile('$workspaceRootPath/aaa/lib/a.dart', r''' +class A { + @deprecated + int foo = 0; +} +'''); + + await assertErrorsInCode(r''' +import 'package:aaa/a.dart'; + +void f(A a) { + a.foo; +} +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 3), + ]); + } + + test_field_implicitSetter() async { + newFile('$workspaceRootPath/aaa/lib/a.dart', r''' +class A { + @deprecated + int foo = 0; +} +'''); + + await assertErrorsInCode(r''' +import 'package:aaa/a.dart'; + +void f(A a) { + a.foo = 0; +} +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 3), + ]); + } + test_field_inDeprecatedConstructor() async { newFile('$workspaceRootPath/aaa/lib/a.dart', r''' class A { @@ -163,42 +419,15 @@ class B extends A { '''); } - test_fieldGet_implicitGetter() async { - newFile('$workspaceRootPath/aaa/lib/a.dart', r''' -class A { - @deprecated - int foo = 0; -} + test_hideCombinator() async { + newFile(externalLibPath, r''' +@deprecated +class A {} '''); - - await assertErrorsInCode(r''' -import 'package:aaa/a.dart'; - -void f(A a) { - a.foo; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE, 48, 3), - ]); - } - - test_fieldSet_implicitSetter() async { - newFile('$workspaceRootPath/aaa/lib/a.dart', r''' -class A { - @deprecated - int foo = 0; -} + await assertNoErrorsInCode(''' +// ignore: unused_import +import '$externalLibUri' hide A; '''); - - await assertErrorsInCode(r''' -import 'package:aaa/a.dart'; - -void f(A a) { - a.foo = 0; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE, 48, 3), - ]); } test_import() async { @@ -216,26 +445,237 @@ import 'package:aaa/a.dart'; ]); } - test_method_inDeprecatedConstructor() async { - newFile('$workspaceRootPath/aaa/lib/a.dart', r''' -class A { - @deprecated - void foo() {} + test_inDeprecatedClass() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +f() {} +''', + code: r''' +@deprecated +class C { + m() { + f(); + } } -'''); +''', + ); + } - await assertNoErrorsInCode(r''' -import 'package:aaa/a.dart'; + test_inDeprecatedExtension() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +void f() {} +''', + code: r''' +@deprecated +extension E on int { + void m() { + f(); + } +} +''', + ); + } -class B extends A { + test_inDeprecatedField() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +class C {} +''', + code: r''' +class X { @deprecated - B() { - foo(); + C f; + X(this.f); +} +''', + ); + } + + test_inDeprecatedFunction() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +f() {} +''', + code: ''' +@deprecated +g() { + f(); +} +''', + ); + } + + test_inDeprecatedLibrary() async { + newFile(externalLibPath, r''' +@deprecated +f() {} +'''); + await assertNoErrorsInCode(''' +@deprecated +library lib; +import '$externalLibUri'; + +class C { + m() { + f(); } } '''); } + test_inDeprecatedMethod() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +f() {} +''', + code: ''' +class C { + @deprecated + m() { + f(); + } +} +''', + ); + } + + test_inDeprecatedMethod_inDeprecatedClass() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +f() {} +''', + code: ''' +@deprecated +class C { + @deprecated + m() { + f(); + } +} +''', + ); + } + + test_inDeprecatedMixin() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +f() {} +''', + code: ''' +@deprecated +mixin M { + m() { + f(); + } +} +''', + ); + } + + test_inDeprecatedTopLevelVariable() async { + await assertNoErrorsInCode2( + externalCode: r''' +@deprecated +class C {} +var x = C(); +''', + code: r''' +@deprecated +C v = x; +''', + ); + } + + test_indexExpression() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + operator[](int i) {} +} +''', + code: r''' +void f(A a) { + return a[1]; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 52, 4), + ], + ); + } + + test_inExtension() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +void f() {} +''', + code: r''' +extension E on int { + void m() { + f(); + } +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 67, 1), + ], + ); + } + + test_instanceCreation_namedConstructor() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + A.named(int i) {} +} +''', + code: r''' +f() { + return new A.named(1); +} +''', + [ + error( + HintCode.DEPRECATED_MEMBER_USE, + 48, + 7, + // TODO(srawlins): Fix this message! + messageContains: ["'A.A.named' is deprecated and shouldn't be used."], + ), + ], + ); + } + + test_instanceCreation_unnamedConstructor() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + A(int i) {} +} +''', + code: r''' +f() { + return new A(1); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 1), + ], + ); + } + test_methodInvocation() async { newFile('$workspaceRootPath/aaa/lib/a.dart', r''' class A { @@ -255,6 +695,111 @@ void f(A a) { ]); } + test_methodInvocation_constantAnnotation() async { + await assertErrorsInCode2(externalCode: r''' +@deprecated +int f() => 0; +''', code: r''' +var x = f(); +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 37, 1), + ]); + } + + test_methodInvocation_constructorAnnotation() async { + await assertErrorsInCode2( + externalCode: r''' +@Deprecated('0.9') +int f() => 0; +''', + code: r''' +var x = f(); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 37, 1, + text: "'f' is deprecated and shouldn't be used. 0.9."), + ], + ); + } + + test_methodInvocation_constructorAnnotation_dot() async { + await assertErrorsInCode2( + externalCode: r''' +@Deprecated('0.9.') +int f() => 0; +''', + code: r''' +var x = f(); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 37, 1, + text: "'f' is deprecated and shouldn't be used. 0.9."), + ], + ); + } + + test_methodInvocation_constructorAnnotation_exclamationMark() async { + await assertErrorsInCode2( + externalCode: r''' +@Deprecated(' Really! ') +int f() => 0; +''', + code: r''' +var x = f(); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 37, 1, + text: "'f' is deprecated and shouldn't be used. Really!"), + ], + ); + } + + test_methodInvocation_constructorAnnotation_onlyDot() async { + await assertErrorsInCode2( + externalCode: r''' +@Deprecated('.') +int f() => 0; +''', + code: r''' +var x = f(); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 37, 1, + text: "'f' is deprecated and shouldn't be used."), + ], + ); + } + + test_methodInvocation_constructorAnnotation_questionMark() async { + await assertErrorsInCode2( + externalCode: r''' +@Deprecated('Are you sure?') +int f() => 0; +''', + code: r''' +var x = f(); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 37, 1, + text: "'f' is deprecated and shouldn't be used. Are you sure?"), + ], + ); + } + + test_methodInvocation_inDeprecatedConstructor() async { + await assertNoErrorsInCode(r''' +class A { + @deprecated + A() { + foo(); + } + + @deprecated + void foo() {} +} +'''); + } + test_methodInvocation_withMessage() async { newFile('$workspaceRootPath/aaa/lib/a.dart', r''' class A { @@ -275,24 +820,129 @@ void f(A a) { ]); } - test_methodInvocation_withMessage_dot() async { - newFile('$workspaceRootPath/aaa/lib/a.dart', r''' + test_operator() async { + await assertErrorsInCode2( + externalCode: r''' class A { - @Deprecated('0.9.') - void foo() {} + @deprecated + operator+(A a) {} +} +''', + code: r''' +f(A a, A b) { + return a + b; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 52, 5), + ], + ); + } + + test_parameter_named() async { + await assertErrorsInCode2( + externalCode: r''' +void f({@deprecated int x = 0}) {} +''', + code: r''' +void g() => f(x: 1); +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 43, 1), + ], + ); + } + + test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async { + await assertNoErrorsInCode(r''' +class C { + int x; + C({@deprecated this.x = 0}); } '''); + } - await assertErrorsInCode(r''' -import 'package:aaa/a.dart'; - -void f(A a) { - a.foo(); + test_parameter_named_inDefiningConstructor_assertInitializer() async { + await assertNoErrorsInCode(r''' +class C { + C({@deprecated int y = 0}) : assert(y > 0); } -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE, 48, 3, - text: "'foo' is deprecated and shouldn't be used. 0.9."), - ]); +'''); + } + + test_parameter_named_inDefiningConstructor_fieldInitializer() async { + await assertNoErrorsInCode(r''' +class C { + int x; + C({@deprecated int y = 0}) : x = y; +} +'''); + } + + test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async { + await assertErrorsInCode2( + externalCode: r''' +class A {} + +@deprecated +class B extends A { + const B(); +} + +const B instance = const B(); +''', + code: r''' +class C { + final A a; + C({B this.a = instance}); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 57, 1), + ], + ); + } + + test_parameter_named_inDefiningFunction() async { + await assertNoErrorsInCode(r''' +f({@deprecated int x = 0}) => x; +'''); + } + + test_parameter_named_inDefiningLocalFunction() async { + await assertNoErrorsInCode(r''' +class C { + m() { + f({@deprecated int x = 0}) { + return x; + } + return f(); + } +} +'''); + } + + test_parameter_named_inDefiningMethod() async { + await assertNoErrorsInCode(r''' +class C { + m({@deprecated int x = 0}) { + return x; + } +} +'''); + } + + test_parameter_named_inNestedLocalFunction() async { + await assertNoErrorsInCode(r''' +class C { + m({@deprecated int x = 0}) { + f() { + return x; + } + return f(); + } +} +'''); } test_parameter_named_ofFunction() async { @@ -329,6 +979,230 @@ void f(A a) { ]); } + test_parameter_positionalOptional() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + void foo([@deprecated int x = 0]) {} +} +''', + code: ''' +void f(A a) { + a.foo(0); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 51, 1), + ], + ); + } + + test_parameter_positionalOptional_inDeprecatedConstructor() async { + await assertNoErrorsInCode2( + externalCode: r''' +void foo([@deprecated int x = 0]) {} +''', + code: r''' +class A { + @deprecated + A() { + foo(0); + } +} +''', + ); + } + + test_parameter_positionalOptional_inDeprecatedFunction() async { + await assertNoErrorsInCode2( + externalCode: r''' +class A { + void foo([@deprecated int x = 0]) {} +} +''', + code: r''' +@deprecated +void f(A a) { + a.foo(0); +} +''', + ); + } + + test_parameter_positionalRequired() async { + await assertNoErrorsInCode2( + externalCode: r''' +class A { + void foo(@deprecated int x) {} +} +''', + code: r''' +void f(A a) { + a.foo(0); +} +''', + ); + } + + test_postfixExpression_deprecatedGetter() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int get x => 0; + +set x(int _) {} +''', + code: r''' +void f() { + x++; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_postfixExpression_deprecatedNothing() async { + await assertNoErrorsInCode2( + externalCode: r''' +int get x => 0; + +set x(int _) {} +''', + code: r''' +void f() { + x++; +} +''', + ); + } + + test_postfixExpression_deprecatedSetter() async { + await assertErrorsInCode2( + externalCode: r''' +int get x => 0; + +@deprecated +set x(int _) {} +''', + code: r''' +void f() { + x++; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_prefixedIdentifier_identifier() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + static const foo = 0; +} +''', + code: r''' +void f() { + A.foo; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 44, 3), + ], + ); + } + + test_prefixedIdentifier_prefix() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +class A { + static const foo = 0; +} +''', + code: r''' +void f() { + A.foo; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_prefixExpression_deprecatedGetter() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int get x => 0; + +set x(int _) {} +''', + code: r''' +void f() { + ++x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 44, 1), + ], + ); + } + + test_prefixExpression_deprecatedSetter() async { + await assertErrorsInCode2( + externalCode: r''' +int get x => 0; + +@deprecated +set x(int _) {} +''', + code: r''' +void f() { + ++x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 44, 1), + ], + ); + } + + test_propertyAccess_super() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + int get foo => 0; +} +''', + code: r''' +class B extends A { + void bar() { + super.foo; + } +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 74, 3), + ], + ); + } + + test_redirectingConstructorInvocation_namedParameter() async { + await assertNoErrorsInCode(r''' +class A { + A({@deprecated int a = 0}) {} + A.named() : this(a: 0); +} +'''); + } + test_setterInvocation() async { newFile('$workspaceRootPath/aaa/lib/a.dart', r''' class A { @@ -348,6 +1222,456 @@ void f(A a) { ]); } + test_showCombinator() async { + newFile(externalLibPath, r''' +@deprecated +class A {} +'''); + await assertErrorsInCode(''' +// ignore: unused_import +import '$externalLibUri' show A; +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 58, 1), + ]); + } + + test_superConstructor_namedConstructor() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + A.named() {} +} +''', + code: r''' +class B extends A { + B() : super.named() {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 57, 13), + ], + ); + } + + test_superConstructor_unnamedConstructor() async { + await assertErrorsInCode2( + externalCode: r''' +class A { + @deprecated + A() {} +} +''', + code: r''' +class B extends A { + B() : super() {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 57, 7, + // TODO(srawlins): Correct this message! + text: "'A.A' is deprecated and shouldn't be used."), + ], + ); + } + + test_topLevelVariable_argument() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + print(x); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 1), + ], + ); + } + + test_topLevelVariable_assignment_right() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f(int a) { + a = x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 51, 1), + ], + ); + } + + test_topLevelVariable_binaryExpression() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + x + 1; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_topLevelVariable_constructorFieldInitializer() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +const int x = 1; +''', + code: r''' +class A { + final int f; + A() : f = x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 66, 1), + ], + ); + } + + test_topLevelVariable_expressionFunctionBody() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +int f() => x; +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 40, 1), + ], + ); + } + + test_topLevelVariable_expressionStatement() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 42, 1), + ], + ); + } + + test_topLevelVariable_forElement_condition() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = true; +''', + code: r''' +void f() { + [for (;x;) 0]; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 49, 1), + ], + ); + } + + test_topLevelVariable_forStatement_condition() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = true; +''', + code: r''' +void f() { + for (;x;) {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 1), + ], + ); + } + + test_topLevelVariable_ifElement_condition() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = true; +''', + code: r''' +void f() { + [if (x) 0]; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 47, 1), + ], + ); + } + + test_topLevelVariable_ifStatement_condition() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = true; +''', + code: r''' +void f() { + if (x) {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 46, 1), + ], + ); + } + + test_topLevelVariable_listLiteral() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + [x]; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 43, 1), + ], + ); + } + + test_topLevelVariable_mapLiteralEntry() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + ({0: x, x: 0}); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 47, 1), + error(HintCode.DEPRECATED_MEMBER_USE, 50, 1), + ], + ); + } + + test_topLevelVariable_namedExpression() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void g({int a = 0}) {} +void f() { + g(a: x); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 70, 1), + ], + ); + } + + test_topLevelVariable_returnStatement() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +int f() { + return x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 48, 1), + ], + ); + } + + test_topLevelVariable_setLiteral() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + ({x}); +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 44, 1), + ], + ); + } + + test_topLevelVariable_spreadElement() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = [0]; +''', + code: r''' +void f() { + [...x]; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 46, 1), + ], + ); + } + + test_topLevelVariable_switchCase() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +const int x = 1; +''', + code: r''' +void f(int a) { + switch (a) { + case x: + break; + } +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 69, 1), + ], + ); + } + + test_topLevelVariable_switchCase_language218() async { + newFile(externalLibPath, r''' +@deprecated +const int x = 1; +'''); + await assertErrorsInCode(''' +// @dart = 2.18 +import '$externalLibUri'; +void f(int a) { + switch (a) { + case x: + break; + } +} +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 85, 1), + ]); + } + + test_topLevelVariable_switchStatement() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + switch (x) {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 50, 1), + ], + ); + } + + test_topLevelVariable_switchStatement_language218() async { + newFile(externalLibPath, r''' +@deprecated +int x = 1; +'''); + await assertErrorsInCode(''' +// @dart = 2.18 +import '$externalLibUri'; +void f() { + switch (x) {} +} +''', [ + error(HintCode.DEPRECATED_MEMBER_USE, 66, 1), + ]); + } + + test_topLevelVariable_unaryExpression() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +int x = 1; +''', + code: r''' +void f() { + -x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 43, 1), + ], + ); + } + + test_topLevelVariable_variableDeclaration_initializer() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = 1; +''', + code: r''' +void f() { + // ignore: unused_local_variable + var v = x; +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 85, 1), + ], + ); + } + + test_topLevelVariable_whileStatement_condition() async { + await assertErrorsInCode2( + externalCode: r''' +@deprecated +var x = true; +''', + code: r''' +void f() { + while (x) {} +} +''', + [ + error(HintCode.DEPRECATED_MEMBER_USE, 49, 1), + ], + ); + } + @override void verifyCreatedCollection() { super.verifyCreatedCollection(); @@ -446,26 +1770,6 @@ void f(A a) {} ]); } - test_samePackage() async { - var myPackageConfig = getFile('$genPath/my/my_package_config.json'); - _writeWorkspacePackagesFile(myPackageConfig, { - 'my': myPackageLibPath, - }); - - newFile('$myPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - - await assertErrorsInCode(r''' -import 'package:my/a.dart'; - -void f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 36, 1), - ]); - } - @override void verifyCreatedCollection() { super.verifyCreatedCollection(); @@ -540,1264 +1844,6 @@ void f(A a) {} } } -@reflectiveTest -class DeprecatedMemberUseFromSamePackage_BasicWorkspaceTest - extends PubPackageResolutionTest { - test_assignmentExpression_compound_deprecatedGetter() async { - await assertErrorsInCode(r''' -@deprecated -int get x => 0; - -set x(int _) {} - -void f() { - x += 2; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_assignmentExpression_compound_deprecatedSetter() async { - await assertErrorsInCode(r''' -int get x => 0; - -@deprecated -set x(int _) {} - -void f() { - x += 2; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_assignmentExpression_simple_deprecatedGetter() async { - await assertNoErrorsInCode(r''' -@deprecated -int get x => 0; - -set x(int _) {} - -void f() { - x = 0; -} -'''); - } - - test_assignmentExpression_simple_deprecatedGetterSetter() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - x = 0; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1), - ]); - } - - test_assignmentExpression_simple_deprecatedSetter() async { - await assertErrorsInCode(r''' -int get x => 0; - -@deprecated -set x(int _) {} - -void f() { - x = 0; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_call() async { - await assertErrorsInCode(r''' -class A { - @deprecated - call() {} - m() { - A a = new A(); - a(); - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 67, 3), - ]); - } - - test_class() async { - newFile('$testPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - - await assertErrorsInCode(r''' -import 'a.dart'; - -void f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 25, 1), - ]); - } - - test_compoundAssignment() async { - await assertErrorsInCode(r''' -class A { - @deprecated - A operator+(A a) { return a; } -} -f(A a, A b) { - a += b; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 75, 6), - ]); - } - - test_export() async { - newFile('$testPackageLibPath/deprecated_library.dart', r''' -@deprecated -library deprecated_library; -class A {} -'''); - await assertErrorsInCode(''' -export 'deprecated_library.dart'; -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 0, 33), - ]); - } - - test_extensionOverride() async { - await assertErrorsInCode(r''' -@deprecated -extension E on int { - int get foo => 0; -} - -void f() { - E(0).foo; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 1), - ]); - } - - test_field() async { - await assertErrorsInCode(r''' -class A { - @deprecated - int x = 1; -} -f(A a) { - return a.x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_field_inDeprecatedConstructor() async { - await assertNoErrorsInCode(r''' -class A { - @deprecated - int x = 1; - - @deprecated - A() { - x; - x = 2; - } -} -'''); - } - - test_field_inDeprecatedFunction() async { - await assertNoErrorsInCode(r''' -class A { - @deprecated - int x = 1; -} - -@deprecated -void f(A a) { - a.x; - a.x = 2; -} -'''); - } - - test_getter() async { - await assertErrorsInCode(r''' -class A { - @deprecated - get m => 1; -} -f(A a) { - return a.m; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 60, 1), - ]); - } - - test_hideCombinator() async { - newFile('$testPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - await assertErrorsInCode(''' -import 'a.dart' hide A; -''', [ - error(HintCode.UNUSED_IMPORT, 7, 8), - ]); - } - - test_import() async { - newFile('$testPackageLibPath/deprecated_library.dart', r''' -@deprecated -library deprecated_library; -class A {} -'''); - - await assertErrorsInCode(r''' -import 'deprecated_library.dart'; -f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 0, 33), - ]); - } - - test_inDeprecatedClass() async { - await assertNoErrorsInCode(r''' -@deprecated -f() {} - -@deprecated -class C { - m() { - f(); - } -} -'''); - } - - test_inDeprecatedEnum() async { - await assertNoErrorsInCode(r''' -@deprecated -void f() {} - -@deprecated -enum E { - one, two; - - void m() { - f(); - } -} -'''); - } - - test_inDeprecatedExtension() async { - await assertNoErrorsInCode(r''' -@deprecated -void f() {} - -@deprecated -extension E on int { - void m() { - f(); - } -} -'''); - } - - test_inDeprecatedField() async { - await assertNoErrorsInCode(r''' -@deprecated -class C {} - -class X { - @deprecated - late C f; -} -'''); - } - - test_inDeprecatedFunction() async { - await assertNoErrorsInCode(r''' -@deprecated -f() {} - -@deprecated -g() { - f(); -} -'''); - } - - test_inDeprecatedLibrary() async { - await assertNoErrorsInCode(r''' -@deprecated -library lib; - -@deprecated -f() {} - -class C { - m() { - f(); - } -} -'''); - } - - test_inDeprecatedMethod() async { - await assertNoErrorsInCode(r''' -@deprecated -f() {} - -class C { - @deprecated - m() { - f(); - } -} -'''); - } - - test_inDeprecatedMethod_inDeprecatedClass() async { - await assertNoErrorsInCode(r''' -@deprecated -f() {} - -@deprecated -class C { - @deprecated - m() { - f(); - } -} -'''); - } - - test_inDeprecatedMixin() async { - await assertNoErrorsInCode(r''' -@deprecated -f() {} - -@deprecated -mixin M { - m() { - f(); - } -} -'''); - } - - test_inDeprecatedTopLevelVariable() async { - await assertNoErrorsInCode(r''' -@deprecated -class C {} - -@deprecated -late C v; -'''); - } - - test_indexExpression() async { - await assertErrorsInCode(r''' -class A { - @deprecated - operator[](int i) {} -} -f(A a) { - return a[1]; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 67, 4), - ]); - } - - test_inEnum() async { - await assertErrorsInCode(r''' -@deprecated -void f() {} - -enum E { - one, two; - - void m() { - f(); - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 64, 1), - ]); - } - - test_inExtension() async { - await assertErrorsInCode(r''' -@deprecated -void f() {} - -extension E on int { - void m() { - f(); - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 63, 1), - ]); - } - - test_instanceCreation_namedConstructor() async { - await assertErrorsInCode(r''' -class A { - @deprecated - A.named(int i) {} -} -f() { - return new A.named(1); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 65, 7), - ]); - } - - test_instanceCreation_unnamedConstructor() async { - await assertErrorsInCode(r''' -class A { - @deprecated - A(int i) {} -} -f() { - return new A(1); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_method_inDeprecatedConstructor() async { - await assertNoErrorsInCode(r''' -class A { - @deprecated - A() { - foo(); - } - - @deprecated - void foo() {} -} -'''); - } - - test_methodInvocation_constant() async { - await assertErrorsInCode(r''' -class A { - @deprecated - m() {} - n() { - m(); - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1), - ]); - } - - test_methodInvocation_constructor() async { - await assertErrorsInCode(r''' -class A { - @Deprecated('0.9') - m() {} - n() {m();} -} -''', [ - error( - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE, 47, 1, - text: "'m' is deprecated and shouldn't be used. 0.9."), - ]); - } - - test_methodInvocation_constructor_dot() async { - await assertErrorsInCode(r''' -class A { - @Deprecated('0.9.') - m() {} - n() {m();} -} -''', [ - error( - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE, 48, 1, - text: "'m' is deprecated and shouldn't be used. 0.9."), - ]); - } - - test_methodInvocation_constructor_exclamationMark() async { - await assertErrorsInCode(r''' -class A { - @Deprecated(' Really! ') - m() {} - n() {m();} -} -''', [ - error( - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE, 53, 1, - text: "'m' is deprecated and shouldn't be used. Really!"), - ]); - } - - test_methodInvocation_constructor_onlyDot() async { - await assertErrorsInCode(r''' -class A { - @Deprecated('.') - m() {} - n() {m();} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1, - text: "'m' is deprecated and shouldn't be used."), - ]); - } - - test_methodInvocation_constructor_questionMark() async { - await assertErrorsInCode(r''' -class A { - @Deprecated('Are you sure?') - m() {} - n() {m();} -} -''', [ - error( - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE, 57, 1, - text: "'m' is deprecated and shouldn't be used. Are you sure?"), - ]); - } - - test_operator() async { - await assertErrorsInCode(r''' -class A { - @deprecated - operator+(A a) {} -} -f(A a, A b) { - return a + b; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 5), - ]); - } - - test_parameter_named() async { - await assertErrorsInCode(r''' -class A { - m({@deprecated int x = 0}) {} - n() {m(x: 1);} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 51, 1), - ]); - } - - test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async { - await assertNoErrorsInCode(r''' -class C { - int x; - C({@deprecated this.x = 0}); -} -'''); - } - - test_parameter_named_inDefiningConstructor_assertInitializer() async { - await assertNoErrorsInCode(r''' -class C { - C({@deprecated int y = 0}) : assert(y > 0); -} -'''); - } - - test_parameter_named_inDefiningConstructor_fieldInitializer() async { - await assertNoErrorsInCode(r''' -class C { - int x; - C({@deprecated int y = 0}) : x = y; -} -'''); - } - - test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async { - await assertErrorsInCode(r''' -class A {} - -@deprecated -class B extends A {} - -class C { - final A a; - C({required B this.a}); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 83, 1), - ]); - } - - test_parameter_named_inDefiningFunction() async { - await assertNoErrorsInCode(r''' -f({@deprecated int x = 0}) => x; -'''); - } - - test_parameter_named_inDefiningLocalFunction() async { - await assertNoErrorsInCode(r''' -class C { - m() { - f({@deprecated int x = 0}) { - return x; - } - return f(); - } -} -'''); - } - - test_parameter_named_inDefiningMethod() async { - await assertNoErrorsInCode(r''' -class C { - m({@deprecated int x = 0}) { - return x; - } -} -'''); - } - - test_parameter_named_inNestedLocalFunction() async { - await assertNoErrorsInCode(r''' -class C { - m({@deprecated int x = 0}) { - f() { - return x; - } - return f(); - } -} -'''); - } - - test_parameter_positionalOptional() async { - await assertErrorsInCode(r''' -class A { - void foo([@deprecated int x = 0]) {} -} - -void f(A a) { - a.foo(0); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 74, 1), - ]); - } - - test_parameter_positionalOptional_inDeprecatedConstructor() async { - await assertNoErrorsInCode(r''' -class A { - @deprecated - A() { - foo(0); - } - - void foo([@deprecated int x = 0]) {} -} -'''); - } - - test_parameter_positionalOptional_inDeprecatedFunction() async { - await assertNoErrorsInCode(r''' -class A { - void foo([@deprecated int x = 0]) {} -} - -@deprecated -void f(A a) { - a.foo(0); -} -'''); - } - - test_parameter_positionalRequired() async { - await assertNoErrorsInCode(r''' -class A { - void foo(@deprecated int x) {} -} - -void f(A a) { - a.foo(0); -} -'''); - } - - test_postfixExpression_deprecatedGetter() async { - await assertErrorsInCode(r''' -@deprecated -int get x => 0; - -set x(int _) {} - -void f() { - x++; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_postfixExpression_deprecatedNothing() async { - await assertNoErrorsInCode(r''' -int get x => 0; - -set x(int _) {} - -void f() { - x++; -} -'''); - } - - test_postfixExpression_deprecatedSetter() async { - await assertErrorsInCode(r''' -int get x => 0; - -@deprecated -set x(int _) {} - -void f() { - x++; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1), - ]); - } - - test_prefixedIdentifier_identifier() async { - await assertErrorsInCode(r''' -class A { - @deprecated - static const foo = 0; -} - -void f() { - A.foo; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 3), - ]); - } - - test_prefixedIdentifier_prefix() async { - await assertErrorsInCode(r''' -@deprecated -class A { - static const foo = 0; -} - -void f() { - A.foo; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 62, 1), - ]); - } - - test_prefixExpression_deprecatedGetter() async { - await assertErrorsInCode(r''' -@deprecated -int get x => 0; - -set x(int _) {} - -void f() { - ++x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1), - ]); - } - - test_prefixExpression_deprecatedSetter() async { - await assertErrorsInCode(r''' -int get x => 0; - -@deprecated -set x(int _) {} - -void f() { - ++x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1), - ]); - } - - test_propertyAccess_super() async { - await assertErrorsInCode(r''' -class A { - @deprecated - int get foo => 0; -} - -class B extends A { - void bar() { - super.foo; - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 92, 3), - ]); - } - - test_redirectingConstructorInvocation_namedParameter() async { - await assertErrorsInCode(r''' -class A { - A({@deprecated int a = 0}) {} - A.named() : this(a: 0); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1), - ]); - } - - test_setter() async { - await assertErrorsInCode(r''' -class A { - @deprecated - set s(v) {} -} -f(A a) { - return a.s = 1; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 60, 1), - ]); - } - - test_showCombinator() async { - newFile('$testPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - await assertErrorsInCode(''' -import 'a.dart' show A; -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 21, 1), - error(HintCode.UNUSED_IMPORT, 7, 8), - ]); - } - - test_superConstructor_namedConstructor() async { - await assertErrorsInCode(r''' -class A { - @deprecated - A.named() {} -} -class B extends A { - B() : super.named() {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 13), - ]); - } - - test_superConstructor_unnamedConstructor() async { - await assertErrorsInCode(r''' -class A { - @deprecated - A() {} -} -class B extends A { - B() : super() {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 63, 7), - ]); - } - - test_topLevelVariable_argument() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - print(x); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1), - ]); - } - - test_topLevelVariable_assignment_right() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f(int a) { - a = x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1), - ]); - } - - test_topLevelVariable_binaryExpression() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - x + 1; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1), - ]); - } - - test_topLevelVariable_constructorFieldInitializer() async { - await assertErrorsInCode(r''' -@deprecated -const int x = 1; - -class A { - final int f; - A() : f = x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 67, 1), - ]); - } - - test_topLevelVariable_expressionFunctionBody() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -int f() => x; -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 35, 1), - ]); - } - - test_topLevelVariable_expressionStatement() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1), - ]); - } - - test_topLevelVariable_forElement_condition() async { - await assertErrorsInCode(r''' -@deprecated -var x = true; - -void f() { - [for (;x;) 0]; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1), - ]); - } - - test_topLevelVariable_forStatement_condition() async { - await assertErrorsInCode(r''' -@deprecated -var x = true; - -void f() { - for (;x;) {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1), - ]); - } - - test_topLevelVariable_ifElement_condition() async { - await assertErrorsInCode(r''' -@deprecated -var x = true; - -void f() { - [if (x) 0]; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1), - ]); - } - - test_topLevelVariable_ifStatement_condition() async { - await assertErrorsInCode(r''' -@deprecated -var x = true; - -void f() { - if (x) {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 44, 1), - ]); - } - - test_topLevelVariable_listLiteral() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - [x]; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1), - ]); - } - - test_topLevelVariable_mapLiteralEntry() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - ({0: x, x: 0}); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 42, 1), - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1), - ]); - } - - test_topLevelVariable_namedExpression() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void g({int a = 0}) {} - -void f() { - g(a: x); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 1), - ]); - } - - test_topLevelVariable_returnStatement() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -int f() { - return x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1), - ]); - } - - test_topLevelVariable_setLiteral() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - ({x}); -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 39, 1), - ]); - } - - test_topLevelVariable_spreadElement() async { - await assertErrorsInCode(r''' -@deprecated -var x = [0]; - -void f() { - [...x]; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1), - ]); - } - - test_topLevelVariable_switchCase() async { - await assertErrorsInCode(r''' -@deprecated -const int x = 1; - -void f(int a) { - switch (a) { - case x: - break; - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 70, 1), - ]); - } - - test_topLevelVariable_switchCase_language218() async { - await assertErrorsInCode(r''' -// @dart = 2.18 -@deprecated -const int x = 1; - -void f(int a) { - switch (a) { - case x: - break; - } -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 86, 1), - ]); - } - - test_topLevelVariable_switchStatement() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - switch (x) {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1), - ]); - } - - test_topLevelVariable_switchStatement_language218() async { - await assertErrorsInCode(r''' -// @dart = 2.18 -@deprecated -int x = 1; - -void f() { - switch (x) {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1), - ]); - } - - test_topLevelVariable_unaryExpression() async { - await assertErrorsInCode(r''' -@deprecated -int x = 1; - -void f() { - -x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1), - ]); - } - - test_topLevelVariable_variableDeclaration_initializer() async { - await assertErrorsInCode(r''' -@deprecated -var x = 1; - -void f() { - // ignore:unused_local_variable - var v = x; -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 79, 1), - ]); - } - - test_topLevelVariable_whileStatement_condition() async { - await assertErrorsInCode(r''' -@deprecated -var x = true; - -void f() { - while (x) {} -} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1), - ]); - } -} - -@reflectiveTest -class DeprecatedMemberUseFromSamePackage_BlazeWorkspaceTest - extends BlazeWorkspaceResolutionTest { - test_it() async { - newFile('$myPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - - await assertErrorsInCode(r''' -import 'a.dart'; - -void f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 25, 1), - ]); - } -} - -@reflectiveTest -class DeprecatedMemberUseFromSamePackage_PackageBuildWorkspaceTest - extends _PackageBuildWorkspaceBase { - test_generated() async { - newPubspecYamlFile(testPackageRootPath, 'name: test'); - - _newTestPackageGeneratedFile( - packageName: 'test', - pathInLib: 'a.dart', - content: r''' -@deprecated -class A {} -''', - ); - - await assertErrorsInCode(r''' -import 'a.dart'; - -void f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 25, 1), - ]); - } - - test_lib() async { - newPubspecYamlFile(testPackageRootPath, 'name: test'); - _createTestPackageBuildMarker(); - - newFile('$testPackageLibPath/a.dart', r''' -@deprecated -class A {} -'''); - - await assertErrorsInCode(r''' -import 'a.dart'; - -void f(A a) {} -''', [ - error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 25, 1), - ]); - } -} - class _PackageBuildWorkspaceBase extends PubPackageResolutionTest { String get testPackageGeneratedPath { return '$testPackageRootPath/.dart_tool/build/generated'; diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart index 3be55075713..bb710e6f3e6 100644 --- a/pkg/analyzer/test/verify_diagnostics_test.dart +++ b/pkg/analyzer/test/verify_diagnostics_test.dart @@ -99,6 +99,8 @@ class DocumentationValidator { 'HintCode.DEPRECATED_COLON_FOR_DEFAULT_VALUE', // The code has been replaced but is not yet removed. 'HintCode.DEPRECATED_MEMBER_USE', + // This is deprecated. + 'HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE', // Produces two diagnostics when it should only produce one (see // https://github.com/dart-lang/sdk/issues/43051) 'HintCode.UNNECESSARY_NULL_COMPARISON_FALSE', diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart index afa95194320..796afd8c798 100644 --- a/pkg/dartdev/test/commands/analyze_test.dart +++ b/pkg/dartdev/test/commands/analyze_test.dart @@ -360,7 +360,13 @@ void defineAnalyze() { test('info implicit no --fatal-infos', () async { p = project( - mainSrc: '$dartVersionFilePrefix2_9@deprecated var x = 1; var y = x;'); + mainSrc: 'var x = 1; var y = x?.isEven;', + analysisOptions: r''' +analyzer: + errors: + INVALID_NULL_AWARE_OPERATOR: info +''', + ); var result = await p.runAnalyze([p.dirPath]); expect(result.exitCode, 0); @@ -370,7 +376,13 @@ void defineAnalyze() { test('info --fatal-infos', () async { p = project( - mainSrc: '$dartVersionFilePrefix2_9@deprecated var x = 1; var y = x;'); + mainSrc: 'var x = 1; var y = x?.isEven;', + analysisOptions: r''' +analyzer: + errors: + INVALID_NULL_AWARE_OPERATOR: info +''', + ); var result = await p.runAnalyze(['--fatal-infos', p.dirPath]); expect(result.exitCode, 1); diff --git a/tools/verify_docs/bin/verify_docs.dart b/tools/verify_docs/bin/verify_docs.dart index 73e6d9ea6e9..f587131acf8 100755 --- a/tools/verify_docs/bin/verify_docs.dart +++ b/tools/verify_docs/bin/verify_docs.dart @@ -348,14 +348,6 @@ class ValidateCommentCodeSamplesVisitor extends GeneralizingAstVisitor { e.errorCode == HintCode.UNUSED_ELEMENT, ); - // Remove warnings about deprecated member use from the same library. - errors.removeWhere( - (e) => - e.errorCode == HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE || - e.errorCode == - HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE, - ); - // Handle edge case around dart:_http errors.removeWhere((e) { if (e.message.contains("'dart:_http'")) {