Skip to content

Commit 323bd09

Browse files
pqCommit Queue
authored andcommitted
[primary constructors] support for avoid_final_parameters
Fixes: #62033 Change-Id: I27547ece4f510f8759262f78951dd201cb24b389 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/463060 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent abc6f1e commit 323bd09

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

pkg/linter/lib/src/rules/avoid_final_parameters.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/analysis_rule/analysis_rule.dart';
66
import 'package:analyzer/analysis_rule/rule_context.dart';
77
import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
8+
import 'package:analyzer/dart/analysis/features.dart';
89
import 'package:analyzer/dart/ast/ast.dart';
910
import 'package:analyzer/dart/ast/visitor.dart';
1011
import 'package:analyzer/error/error.dart';
@@ -31,6 +32,11 @@ class AvoidFinalParameters extends AnalysisRule {
3132
RuleVisitorRegistry registry,
3233
RuleContext context,
3334
) {
35+
// This lint isn't relevant with primary constructors enabled
36+
// as `final` is no longer used to indicate a parameter is final,
37+
// but rather as a declaring parameter in a primary constructor.
38+
if (context.isFeatureEnabled(Feature.declaring_constructors)) return;
39+
3440
var visitor = _Visitor(this);
3541
registry.addConstructorDeclaration(this, visitor);
3642
registry.addFunctionExpression(this, visitor);

pkg/linter/messages.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9422,6 +9422,9 @@ LinterLintCode:
94229422
deprecatedDetails: |-
94239423
**Note:** This lint rule was deprecated in Dart 3.11 and
94249424
is set to be removed in a future release of the Dart SDK.
9425+
Also note that the lint is not applied to code that is opted
9426+
in to the `primary-constructors` language feature where using
9427+
`final` for a parameter becomes a compile-time error.
94259428
If you want to ensure parameters aren't reassigned in function bodies,
94269429
consider enabling the
94279430
[`parameter_assignments`](https://dart.dev/lints/parameter_assignments)

pkg/linter/test/rules/avoid_final_parameters_test.dart

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/analysis/features.dart';
56
import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
67
import 'package:test_reflective_loader/test_reflective_loader.dart';
78

@@ -10,11 +11,16 @@ import '../rule_test_support.dart';
1011
void main() {
1112
defineReflectiveSuite(() {
1213
defineReflectiveTests(AvoidFinalParametersTest);
14+
defineReflectiveTests(AvoidFinalParametersPrePrimaryConstructorsTest);
1315
});
1416
}
1517

1618
@reflectiveTest
17-
class AvoidFinalParametersTest extends LintRuleTest {
19+
class AvoidFinalParametersPrePrimaryConstructorsTest extends LintRuleTest {
20+
@override
21+
List<String> get experiments =>
22+
super.experiments..remove(Feature.declaring_constructors.enableString);
23+
1824
@override
1925
String get lintRule => LintNames.avoid_final_parameters;
2026

@@ -223,3 +229,20 @@ class B extends A {
223229
);
224230
}
225231
}
232+
233+
@reflectiveTest
234+
class AvoidFinalParametersTest extends LintRuleTest {
235+
@override
236+
String get lintRule => LintNames.avoid_final_parameters;
237+
238+
// With primary constructors, this lint is disabled.
239+
// No need to repeat all the tests; one will do.
240+
test_constructorSimple_final() async {
241+
await assertNoDiagnostics(r'''
242+
class C {
243+
// Would be flagged.
244+
C(final int p);
245+
}
246+
''');
247+
}
248+
}

0 commit comments

Comments
 (0)