mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 08:51:21 +00:00
Issue 51721. Update MakeFinal to support local variables with type annotations.
Bug: https://github.com/dart-lang/sdk/issues/51721 Change-Id: If99fa9e84eabe4099dcfa674540e27f323eddd65 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/290261 Reviewed-by: Samuel Rawlins <srawlins@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
parent
8384a13ec0
commit
ae143b0201
|
@ -40,53 +40,30 @@ class MakeFinal extends CorrectionProducer {
|
|||
return;
|
||||
}
|
||||
|
||||
final AstNode normalParameter;
|
||||
if (node is DefaultFormalParameter) {
|
||||
normalParameter = node.parameter;
|
||||
} else {
|
||||
normalParameter = node;
|
||||
}
|
||||
|
||||
if (normalParameter is SimpleFormalParameter) {
|
||||
final simpleNode = normalParameter;
|
||||
if (node is SimpleFormalParameter) {
|
||||
await builder.addDartFileEdit(file, (builder) {
|
||||
final keyword = simpleNode.keyword;
|
||||
final keyword = node.keyword;
|
||||
if (keyword != null && keyword.keyword == Keyword.VAR) {
|
||||
builder.addSimpleReplacement(range.token(keyword), 'final');
|
||||
} else {
|
||||
final type = simpleNode.type;
|
||||
final type = node.type;
|
||||
if (type != null) {
|
||||
builder.addSimpleInsertion(type.offset, 'final ');
|
||||
return;
|
||||
}
|
||||
final identifier = simpleNode.name;
|
||||
final identifier = node.name;
|
||||
if (identifier != null) {
|
||||
builder.addSimpleInsertion(identifier.offset, 'final ');
|
||||
} else {
|
||||
builder.addSimpleInsertion(simpleNode.offset, 'final ');
|
||||
builder.addSimpleInsertion(node.offset, 'final ');
|
||||
}
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (node is SimpleFormalParameter) {
|
||||
await builder.addDartFileEdit(file, (builder) {
|
||||
builder.addSimpleInsertion(node.name!.offset, 'final ');
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
VariableDeclarationList list;
|
||||
if (node is VariableDeclaration && parent is VariableDeclarationList) {
|
||||
list = parent;
|
||||
} else if (node is VariableDeclarationList) {
|
||||
list = node;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (list.variables.length == 1) {
|
||||
final list = _getVariableDeclarationList(node);
|
||||
if (list != null && list.variables.length == 1) {
|
||||
await builder.addDartFileEdit(file, (builder) {
|
||||
var keyword = list.keyword;
|
||||
var lateKeyword = list.lateKeyword;
|
||||
|
@ -100,4 +77,22 @@ class MakeFinal extends CorrectionProducer {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
static VariableDeclarationList? _getVariableDeclarationList(AstNode node) {
|
||||
if (node is VariableDeclarationList) {
|
||||
return node;
|
||||
}
|
||||
|
||||
final parent = node.parent;
|
||||
if (node is VariableDeclaration && parent is VariableDeclarationList) {
|
||||
return parent;
|
||||
}
|
||||
|
||||
final parent2 = parent?.parent;
|
||||
if (parent is NamedType && parent2 is VariableDeclarationList) {
|
||||
return parent2;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ void main() {
|
|||
defineReflectiveTests(PreferFinalFieldsTest);
|
||||
defineReflectiveTests(PreferFinalFieldsWithNullSafetyTest);
|
||||
defineReflectiveTests(PreferFinalInForEachTest);
|
||||
defineReflectiveTests(PreferFinalLocalTest);
|
||||
defineReflectiveTests(PreferFinalLocalsBulkTest);
|
||||
defineReflectiveTests(PreferFinalParametersTest);
|
||||
defineReflectiveTests(PreferFinalParametersBulkTest);
|
||||
|
@ -226,6 +227,45 @@ f() {
|
|||
}
|
||||
}
|
||||
|
||||
@reflectiveTest
|
||||
class PreferFinalLocalTest extends FixProcessorLintTest {
|
||||
@override
|
||||
FixKind get kind => DartFixKind.MAKE_FINAL;
|
||||
|
||||
@override
|
||||
String get lintCode => LintNames.prefer_final_locals;
|
||||
|
||||
Future<void> test_variableDeclarationStatement_type() async {
|
||||
await resolveTestCode('''
|
||||
void f() {
|
||||
// ignore:unused_local_variable
|
||||
int v = 0;
|
||||
}
|
||||
''');
|
||||
await assertHasFix('''
|
||||
void f() {
|
||||
// ignore:unused_local_variable
|
||||
final int v = 0;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
Future<void> test_variableDeclarationStatement_var() async {
|
||||
await resolveTestCode('''
|
||||
void f() {
|
||||
// ignore:unused_local_variable
|
||||
var v = 0;
|
||||
}
|
||||
''');
|
||||
await assertHasFix('''
|
||||
void f() {
|
||||
// ignore:unused_local_variable
|
||||
final v = 0;
|
||||
}
|
||||
''');
|
||||
}
|
||||
}
|
||||
|
||||
@reflectiveTest
|
||||
class PreferFinalParametersBulkTest extends BulkFixProcessorTest {
|
||||
@override
|
||||
|
|
Loading…
Reference in a new issue