Skip to content

Commit a013505

Browse files
pqCommit Queue
authored andcommitted
[element model] migrate avoid_setters_without_getters
Bug: #59548 Change-Id: Ie5d17b153821a802e694b376c54d3a36bdd7e8d9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398503 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent 45c5424 commit a013505

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

pkg/linter/analyzer_use_new_elements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
lib/src/ast.dart
22
lib/src/extensions.dart
3-
lib/src/rules/avoid_setters_without_getters.dart
43
lib/src/rules/deprecated_member_use_from_same_package.dart
54
lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
65
lib/src/rules/prefer_initializing_formals.dart

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/visitor.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
78

89
import '../analyzer.dart';
9-
import '../extensions.dart';
1010

1111
const _desc = r'Avoid setters without getters.';
1212

@@ -23,7 +23,7 @@ class AvoidSettersWithoutGetters extends LintRule {
2323
@override
2424
void registerNodeProcessors(
2525
NodeLintRegistry registry, LinterContext context) {
26-
var visitor = _Visitor(this);
26+
var visitor = _Visitor(this, context.inheritanceManager);
2727
registry.addClassDeclaration(this, visitor);
2828
registry.addEnumDeclaration(this, visitor);
2929
registry.addExtensionTypeDeclaration(this, visitor);
@@ -33,8 +33,9 @@ class AvoidSettersWithoutGetters extends LintRule {
3333

3434
class _Visitor extends SimpleAstVisitor<void> {
3535
final LintRule rule;
36+
final InheritanceManager3 inheritanceManager;
3637

37-
_Visitor(this.rule);
38+
_Visitor(this.rule, this.inheritanceManager);
3839

3940
@override
4041
void visitClassDeclaration(ClassDeclaration node) {
@@ -53,9 +54,29 @@ class _Visitor extends SimpleAstVisitor<void> {
5354

5455
void visitMembers(NodeList<ClassMember> members) {
5556
for (var member in members.whereType<MethodDeclaration>()) {
56-
if (member.isSetter &&
57-
member.lookUpInheritedConcreteSetter() == null &&
58-
member.lookUpGetter() == null) {
57+
if (!member.isSetter) continue;
58+
59+
var element = member.declaredFragment?.element;
60+
var interface = element?.enclosingElement2;
61+
if (interface is! InterfaceElement2) continue;
62+
63+
var name = Name.forElement(element!);
64+
if (name == null) continue;
65+
66+
// If we're overriding a setter, don't report here.
67+
var overridden = inheritanceManager.getOverridden4(interface, name);
68+
if (overridden != null && overridden.isNotEmpty) continue;
69+
70+
var getterName = element.name3;
71+
if (getterName == null) continue;
72+
73+
// Check for a declared (static) getter.
74+
ExecutableElement2? getter = interface.getGetter2(getterName);
75+
// Then look up for an inherited one.
76+
getter ??= inheritanceManager.getMember4(interface, name.forGetter,
77+
concrete: true);
78+
79+
if (getter == null) {
5980
rule.reportLintForToken(member.name);
6081
}
6182
}

pkg/linter/test/rules/avoid_setters_without_getters_test.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ class A {
6969
]);
7070
}
7171

72+
test_class_static_getter_setter() async {
73+
await assertNoDiagnostics(r'''
74+
class A {
75+
static int get x => 0;
76+
static set x(int value) {}
77+
}
78+
''');
79+
}
80+
7281
test_enum() async {
7382
await assertDiagnostics(r'''
7483
enum A {

0 commit comments

Comments
 (0)