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:
Konstantin Shcheglov 2023-03-21 22:19:18 +00:00 committed by Commit Queue
parent 8384a13ec0
commit ae143b0201
2 changed files with 65 additions and 30 deletions

View file

@ -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;
}
}

View file

@ -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