pattern variable declaration support for replace_final_with_var

Fixes: https://github.com/dart-lang/sdk/issues/51864


Change-Id: I6c1c23f7fdce5bea7d9b3b09210b2ded04be3a60
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/291342
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
pq 2023-03-27 23:35:48 +00:00 committed by Commit Queue
parent e0ab0d1be5
commit 0d000e85d6
2 changed files with 62 additions and 6 deletions

View file

@ -5,6 +5,7 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
@ -25,13 +26,17 @@ class ReplaceFinalWithVar extends CorrectionProducer {
@override
Future<void> compute(ChangeBuilder builder) async {
final node = this.node;
Token? keyword;
if (node is VariableDeclarationList) {
var keyword = node.keyword;
if (keyword != null && node.type == null) {
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(range.token(keyword), 'var');
});
}
if (node.type == null) keyword = node.keyword;
} else if (node is PatternVariableDeclaration) {
keyword = node.keyword;
}
if (keyword != null) {
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleReplacement(range.token(keyword!), 'var');
});
}
}
}

View file

@ -49,6 +49,41 @@ class ReplaceFinalWithVarTest extends FixProcessorLintTest {
@override
String get lintCode => LintNames.unnecessary_final;
/// https://github.com/dart-lang/sdk/issues/51864
Future<void> test_listPattern_assignment() async {
await resolveTestCode('''
f() {
final [a] = [1];
print(a);
}
''');
await assertHasFix('''
f() {
var [a] = [1];
print(a);
}
''');
}
/// https://github.com/dart-lang/sdk/issues/51864
@FailingTest(reason: 'Not supported')
Future<void> test_listPattern_ifCase() async {
// Note that the simpler case is also unsupported:
// final int x = 0;
// Switch cases are similarly unsupported.
await resolveTestCode('''
f(Object o) {
if (o case [final int x]) print(x);
}
''');
await assertHasFix('''
f(Object o) {
if (o case [int x]) print(x);
}
''');
}
Future<void> test_method() async {
await resolveTestCode('''
void f() {
@ -61,6 +96,22 @@ void f() {
var a = 1;
print(a);
}
''');
}
/// https://github.com/dart-lang/sdk/issues/51864
Future<void> test_recordPattern_assignment() async {
await resolveTestCode(r'''
f() {
final (a, b) = (1, 2);
print('$a$b');
}
''');
await assertHasFix(r'''
f() {
var (a, b) = (1, 2);
print('$a$b');
}
''');
}
}