Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit b9c7b57

Browse files
authored
fix: visit only widgets for use-setstate-synchronously (#1210)
1 parent a2433c4 commit b9c7b57

File tree

4 files changed

+42
-4
lines changed

4 files changed

+42
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* chore: restrict `analyzer` version to `>=5.1.0 <5.8.0`.
99
* feat: add static code diagnostic [`avoid-substring`](https://dcm.dev/docs/individuals/rules/common/avoid-substring).
1010
* fix: correctly track prefixes usage for check-unused-code.
11+
* fix: visit only widgets for [`use-setstate-synchronously`](https://dcm.dev/docs/individuals/rules/flutter/use-setstate-synchronously).
1112

1213
## 5.6.0
1314

lib/src/analyzers/lint_analyzer/rules/rules_list/use_setstate_synchronously/use_setstate_synchronously_rule.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class UseSetStateSynchronouslyRule extends FlutterRule {
3333
@override
3434
Iterable<Issue> check(InternalResolvedUnitResult source) {
3535
final visitor = _Visitor(methods: methods);
36-
source.unit.visitChildren(visitor);
36+
source.unit.accept(visitor);
3737

3838
return visitor.nodes
3939
.map((node) => createIssue(

lib/src/analyzers/lint_analyzer/rules/rules_list/use_setstate_synchronously/visitor.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@ class _Visitor extends RecursiveAstVisitor<void> {
88
final nodes = <SimpleIdentifier>[];
99

1010
@override
11-
void visitClassDeclaration(ClassDeclaration node) {
12-
if (isWidgetStateOrSubclass(node.extendsClause?.superclass.type)) {
13-
node.visitChildren(this);
11+
void visitCompilationUnit(CompilationUnit node) {
12+
for (final declaration in node.declarations) {
13+
if (declaration is ClassDeclaration) {
14+
final type = declaration.extendsClause?.superclass.type;
15+
if (isWidgetStateOrSubclass(type)) {
16+
declaration.visitChildren(this);
17+
}
18+
}
1419
}
1520
}
1621

test/src/analyzers/lint_analyzer/rules/rules_list/use_setstate_synchronously/examples/example.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,35 @@ class State {}
109109
Future<void> fetch() {}
110110

111111
Future<bool> condition() {}
112+
113+
class SomeClass {
114+
void setState(Function() callback) {}
115+
}
116+
117+
Future<void> handle(Future Function() callback) {}
118+
119+
mixin _SomeMixin on SomeClass {
120+
Future<bool> condition() => handle(() async {
121+
await fetch();
122+
123+
setState();
124+
});
125+
}
126+
127+
abstract class IController {
128+
void setState(void Function() fn);
129+
}
130+
131+
abstract class ControllerBase implements IController {
132+
@override
133+
void setState(void Function() fn) {}
134+
}
135+
136+
class ControllerImpl = ControllerBase with ControllerMixin;
137+
138+
mixin ControllerMixin on ControllerBase {
139+
Future<void> helloWorld() async {
140+
await Future<void>.delayed(const Duration(seconds: 1));
141+
setState(() {});
142+
}
143+
}

0 commit comments

Comments
 (0)