-
Notifications
You must be signed in to change notification settings - Fork 170
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a new
unnecessary_late
lint (#3052)
* Add a new unnecessary_late lint * Sort lint implementation Dart file * Test non-late static and top-level declarations * Provide better matching examples in details
- Loading branch information
Showing
4 changed files
with
112 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
// 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. | ||
|
||
import 'package:analyzer/dart/ast/ast.dart'; | ||
import 'package:analyzer/dart/ast/visitor.dart'; | ||
|
||
import '../analyzer.dart'; | ||
|
||
const _desc = r"Don't specify the `late` modifier when it is not needed."; | ||
|
||
const _details = r''' | ||
**DO** not specify the `late` modifier for top-level and static variables | ||
when the declaration contains an initializer. | ||
Top-level and static variables with initializers are already evaluated lazily | ||
as if they are marked `late`. | ||
**BAD:** | ||
```dart | ||
late String badTopLevel = ''; | ||
``` | ||
**GOOD:** | ||
```dart | ||
String goodTopLevel = ''; | ||
``` | ||
**BAD:** | ||
```dart | ||
class BadExample { | ||
static late String badStatic = ''; | ||
} | ||
``` | ||
**GOOD:** | ||
```dart | ||
class GoodExample { | ||
late String goodStatic; | ||
} | ||
``` | ||
'''; | ||
|
||
class UnnecessaryLate extends LintRule { | ||
UnnecessaryLate() | ||
: super( | ||
name: 'unnecessary_late', | ||
description: _desc, | ||
details: _details, | ||
group: Group.style); | ||
|
||
@override | ||
void registerNodeProcessors( | ||
NodeLintRegistry registry, LinterContext context) { | ||
var visitor = _Visitor(this); | ||
registry.addFieldDeclaration(this, visitor); | ||
registry.addTopLevelVariableDeclaration(this, visitor); | ||
} | ||
} | ||
|
||
class _Visitor extends SimpleAstVisitor<void> { | ||
final LintRule rule; | ||
|
||
_Visitor(this.rule); | ||
|
||
@override | ||
void visitFieldDeclaration(FieldDeclaration node) { | ||
if (node.isStatic) { | ||
_visitVariableDeclarations(node.fields); | ||
} | ||
} | ||
|
||
@override | ||
void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | ||
_visitVariableDeclarations(node.variables); | ||
} | ||
|
||
void _visitVariableDeclarations(VariableDeclarationList node) { | ||
for (var variable in node.variables) { | ||
if (variable.isLate && variable.initializer != null) { | ||
rule.reportLint(variable); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// 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. | ||
|
||
// test w/ `dart test -N unnecessary_late` | ||
|
||
late String unnecessaryTopLevelLate = ''; // LINT | ||
|
||
late String necessaryTopLevelLate; // OK | ||
|
||
String unnecessaryTopLevel = ''; // OK | ||
|
||
class Test { | ||
static late String unnecessaryStaticLate = ''; // LINT | ||
|
||
static late String necessaryStaticLate; // OK | ||
|
||
static String unnecessaryStatic = ''; // OK | ||
|
||
void test() { | ||
late String necessaryLocal = ''; // OK | ||
} | ||
} |