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

Commit 00d83a6

Browse files
authored
feat: add ignored-types option to avoid-late-keyword (#1146)
* feat: add allow-initialized option to avoid-late-keyword * feat: add ignored-types option to avoid-late-keyword * feat: add AnimationController as default ignored type
1 parent dbdc63e commit 00d83a6

File tree

6 files changed

+45
-7
lines changed

6 files changed

+45
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* chore: restrict `analyzer` version to `>=5.1.0 <5.4.0`.
1010
* fix: ignore method invocations in a variable declaration for [`prefer-moving-to-variable`](https://dartcodemetrics.dev/docs/rules/common/prefer-moving-to-variable).
1111
* feat: add `allow-initialized` option to [`avoid-late-keyword`](https://dartcodemetrics.dev/docs/rules/common/avoid-late-keyword).
12+
* feat: add `ignored-types` option to [`avoid-late-keyword`](https://dartcodemetrics.dev/docs/rules/common/avoid-late-keyword).
1213

1314
## 5.4.0
1415

lib/src/analyzers/lint_analyzer/rules/rules_list/avoid_late_keyword/avoid_late_keyword_rule.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ class AvoidLateKeywordRule extends CommonRule {
2020
static const _warning = "Avoid using 'late' keyword.";
2121

2222
final bool _allowInitialized;
23+
final Iterable<String> _ignoredTypes;
2324

2425
AvoidLateKeywordRule([Map<String, Object> config = const {}])
2526
: _allowInitialized = _ConfigParser.parseAllowInitialized(config),
27+
_ignoredTypes = _ConfigParser.parseIgnoredTypes(config),
2628
super(
2729
id: ruleId,
2830
severity: readSeverity(config, Severity.warning),
@@ -32,7 +34,7 @@ class AvoidLateKeywordRule extends CommonRule {
3234

3335
@override
3436
Iterable<Issue> check(InternalResolvedUnitResult source) {
35-
final visitor = _Visitor(_allowInitialized);
37+
final visitor = _Visitor(_allowInitialized, _ignoredTypes);
3638

3739
source.unit.visitChildren(visitor);
3840

lib/src/analyzers/lint_analyzer/rules/rules_list/avoid_late_keyword/config_parser.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ part of 'avoid_late_keyword_rule.dart';
22

33
class _ConfigParser {
44
static const _allowInitializedConfig = 'allow-initialized';
5+
static const _ignoredTypesConfig = 'ignored-types';
56

67
static bool parseAllowInitialized(Map<String, Object> config) =>
78
config[_allowInitializedConfig] as bool? ?? false;
9+
10+
static Iterable<String> parseIgnoredTypes(Map<String, Object> config) =>
11+
config.containsKey(_ignoredTypesConfig) &&
12+
config[_ignoredTypesConfig] is Iterable
13+
? List<String>.from(config[_ignoredTypesConfig] as Iterable)
14+
: <String>['AnimationController'];
815
}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ part of 'avoid_late_keyword_rule.dart';
22

33
class _Visitor extends RecursiveAstVisitor<void> {
44
final bool allowInitialized;
5+
final Iterable<String> ignoredTypes;
56

67
final _declarations = <AstNode>[];
78

89
Iterable<AstNode> get declarations => _declarations;
910

1011
// ignore: avoid_positional_boolean_parameters
11-
_Visitor(this.allowInitialized);
12+
_Visitor(this.allowInitialized, this.ignoredTypes);
1213

1314
@override
1415
void visitVariableDeclaration(VariableDeclaration node) {
@@ -17,9 +18,17 @@ class _Visitor extends RecursiveAstVisitor<void> {
1718
if (node.isLate && node.parent != null) {
1819
final parent = node.parent;
1920

20-
if (!(allowInitialized && node.initializer != null)) {
21+
if (!_allowsInitialized(node) && !_hasIgnoredType(node)) {
2122
_declarations.add(parent ?? node);
2223
}
2324
}
2425
}
26+
27+
bool _allowsInitialized(VariableDeclaration node) =>
28+
allowInitialized && node.initializer != null;
29+
30+
bool _hasIgnoredType(VariableDeclaration node) => ignoredTypes.contains(
31+
// ignore: deprecated_member_use
32+
node.declaredElement2?.type.getDisplayString(withNullability: false),
33+
);
2534
}

test/src/analyzers/lint_analyzer/rules/rules_list/avoid_late_keyword/avoid_late_keyword_rule_test.dart

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void main() {
2929
startColumns: [3, 3, 5, 5, 1, 1],
3030
locationTexts: [
3131
"late final field = 'string'",
32-
'late String uninitializedField',
32+
'late int uninitializedField',
3333
"late final variable = 'string'",
3434
'late String uninitializedVariable',
3535
"late final topLevelVariable = 'string'",
@@ -46,7 +46,7 @@ void main() {
4646
);
4747
});
4848

49-
test('reports about found issues with config', () async {
49+
test('reports about found issues with allow initialized config', () async {
5050
final unit = await RuleTestHelper.resolveFromFile(_examplePath);
5151
final issues =
5252
AvoidLateKeywordRule({'allow-initialized': true}).check(unit);
@@ -56,7 +56,7 @@ void main() {
5656
startLines: [8, 17, 23],
5757
startColumns: [3, 5, 1],
5858
locationTexts: [
59-
'late String uninitializedField',
59+
'late int uninitializedField',
6060
'late String uninitializedVariable',
6161
'late String topLevelUninitializedVariable',
6262
],
@@ -67,5 +67,24 @@ void main() {
6767
],
6868
);
6969
});
70+
71+
test('reports about found issues with ignored types config', () async {
72+
final unit = await RuleTestHelper.resolveFromFile(_examplePath);
73+
final issues = AvoidLateKeywordRule({
74+
'ignored-types': ['String'],
75+
}).check(unit);
76+
77+
RuleTestHelper.verifyIssues(
78+
issues: issues,
79+
startLines: [8],
80+
startColumns: [3],
81+
locationTexts: [
82+
'late int uninitializedField',
83+
],
84+
messages: [
85+
"Avoid using 'late' keyword.",
86+
],
87+
);
88+
});
7089
});
7190
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class Test {
55

66
String? nullableField;
77

8-
late String uninitializedField; // LINT
8+
late int uninitializedField; // LINT
99

1010
void method() {
1111
late final variable = 'string'; // LINT

0 commit comments

Comments
 (0)