From 3e2ac6721d5dbac5e257decb99a586ebc844677c Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Mon, 18 Dec 2023 18:02:42 +0000 Subject: [PATCH] [linter] Report deprecated_consistency only on constructor name Before this fix the lint was being reported on the entire constructor definition. Also moves all tests to be reflective. Change-Id: I8e32600cd87a7f34f8e8aa701acf180c741b915a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/342300 Reviewed-by: Brian Wilkerson Reviewed-by: Samuel Rawlins Commit-Queue: Brian Wilkerson --- .../lib/src/rules/deprecated_consistency.dart | 4 +- .../rules/deprecated_consistency_test.dart | 95 ++++++++++++++++++- .../rules/deprecated_consistency.dart | 24 ----- 3 files changed, 95 insertions(+), 28 deletions(-) delete mode 100644 pkg/linter/test_data/rules/deprecated_consistency.dart diff --git a/pkg/linter/lib/src/rules/deprecated_consistency.dart b/pkg/linter/lib/src/rules/deprecated_consistency.dart index f7a7bf387e84..ac954863ed1f 100644 --- a/pkg/linter/lib/src/rules/deprecated_consistency.dart +++ b/pkg/linter/lib/src/rules/deprecated_consistency.dart @@ -99,7 +99,9 @@ class _Visitor extends SimpleAstVisitor { if (constructorElement != null && constructorElement.enclosingElement.hasDeprecated && !constructorElement.hasDeprecated) { - rule.reportLint(node, errorCode: DeprecatedConsistency.constructorCode); + var nodeToAnnotate = node.name ?? node.returnType; + rule.reportLintForOffset(nodeToAnnotate.offset, nodeToAnnotate.length, + errorCode: DeprecatedConsistency.constructorCode); } } diff --git a/pkg/linter/test/rules/deprecated_consistency_test.dart b/pkg/linter/test/rules/deprecated_consistency_test.dart index b2de35e69ed4..f8e704f8fefc 100644 --- a/pkg/linter/test/rules/deprecated_consistency_test.dart +++ b/pkg/linter/test/rules/deprecated_consistency_test.dart @@ -17,18 +17,107 @@ class DeprecatedConsistencyTest extends LintRuleTest { @override String get lintRule => 'deprecated_consistency'; - test_superInit() async { + test_classDeprecated_factoryConstructor() async { + await assertDiagnostics(r''' +@deprecated +class A { + @deprecated + A._(); + + factory A() => A._(); +} +''', [ + lint(56, 1), + ]); + } + + test_classDeprecated_factoryConstructor_deprecated() async { + await assertNoDiagnostics(r''' +@deprecated +class A { + @deprecated + A._(); + + @deprecated + factory A() => A._(); +} +'''); + } + + test_classDeprecated_generativeConstructor() async { + await assertDiagnostics(r''' +@deprecated +class A { + A(); +} +''', [ + lint(24, 1), + ]); + } + + test_classDeprecated_generativeConstructor_deprecated() async { + await assertNoDiagnostics(r''' +@deprecated +class A { + @deprecated + A(); +} +'''); + } + + test_constructorFieldFormalDeprecated_field() async { await assertDiagnostics(r''' class A { String? a; A({@deprecated this.a}); } +''', [ + lint(20, 1), + ]); + } + + test_constructorFieldFormalDeprecated_fieldDeprecated() async { + await assertNoDiagnostics(r''' +class A { + @deprecated + String? a; + A({@deprecated this.a}); +} +'''); + } + + test_constructorSuperFieldFormalDeprecated_field() async { + await assertNoDiagnostics(r''' +class A { + String? a; + A({this.a}); +} class B extends A { - B({super.a}); + B({@deprecated super.a}); +} +'''); + } + + test_fieldDeprecated_fieldFormalParameter() async { + await assertDiagnostics(r''' +class A { + @deprecated + String? a; + A({this.a}); } ''', [ - lint(20, 1), + lint(42, 6), ]); } + + test_fieldDeprecated_fieldFormalParameter_deprecated() async { + await assertNoDiagnostics(r''' +class A { + @deprecated + String? a; + A({@deprecated this.a}); +} +'''); + } } diff --git a/pkg/linter/test_data/rules/deprecated_consistency.dart b/pkg/linter/test_data/rules/deprecated_consistency.dart deleted file mode 100644 index 0e3500f85658..000000000000 --- a/pkg/linter/test_data/rules/deprecated_consistency.dart +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2021, 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. - -@deprecated -class A { - A.ko(); // LINT - @deprecated - A.ok(); // OK -} - -class B { - B.ko({this.field = 0}); // LINT - B.ok({@deprecated this.field = 0}); // OK - - @deprecated - Object field; -} - -class C { - C({@deprecated this.field = 0}); // OK - - Object field; // LINT -}