quick fix for prefer_const_literals_to_create_immutables

see: https://github.com/dart-lang/sdk/issues/45932

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

Change-Id: I98d89e9f98b72c333f9bb274b84730d68b71e71f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206102
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
pq 2021-07-09 01:29:20 +00:00 committed by commit-bot@chromium.org
parent 99704187c1
commit 3fb1586b28
4 changed files with 189 additions and 5 deletions

View file

@ -37,6 +37,25 @@ class AddConst extends CorrectionProducer {
});
return;
}
Future<void> insertAtOffset(AstNode targetNode) async {
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleInsertion(targetNode.offset, 'const ');
});
}
// todo(pq):consider removing nested `const` declarations
// made unnecessary by outer ones in List, Set literal and
// instance creations.
if (targetNode is ListLiteral) {
await insertAtOffset(targetNode);
return;
}
if (targetNode is SetOrMapLiteral) {
await insertAtOffset(targetNode);
return;
}
if (targetNode is TypeName) {
targetNode = targetNode.parent;
}
@ -45,10 +64,8 @@ class AddConst extends CorrectionProducer {
}
if (targetNode is InstanceCreationExpression) {
if (targetNode.keyword == null) {
var node_final = targetNode;
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleInsertion(node_final.offset, 'const ');
});
await insertAtOffset(targetNode);
return;
}
}
}
@ -61,4 +78,7 @@ class AddConst extends CorrectionProducer {
// with the `unnecessary_const` lint. Fix it and then enable it for both
// uses.
static AddConst toInvocation() => AddConst(false, false);
/// Return an instance of this class. Used as a tear-off in `FixProcessor`.
static AddConst toLiteral() => AddConst(true, true);
}

View file

@ -439,6 +439,9 @@ class FixProcessor extends BaseProcessor {
LintNames.prefer_const_declarations: [
ReplaceFinalWithConst.newInstance,
],
LintNames.prefer_const_literals_to_create_immutables: [
AddConst.toLiteral,
],
LintNames.prefer_contains: [
ConvertToContains.newInstance,
],

View file

@ -60,6 +60,8 @@ class LintNames {
static const String prefer_const_constructors_in_immutables =
'prefer_const_constructors_in_immutables';
static const String prefer_const_declarations = 'prefer_const_declarations';
static const String prefer_const_literals_to_create_immutables =
'prefer_const_literals_to_create_immutables';
static const String prefer_contains = 'prefer_contains';
static const String prefer_equal_for_default_values =
'prefer_equal_for_default_values';

View file

@ -11,10 +11,13 @@ import 'fix_processor.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(AddConst_PreferConstConstructorsBulkTest);
defineReflectiveTests(AddConst_PreferConstConstructorsInImmutablesBulkTest);
defineReflectiveTests(AddConst_PreferConstConstructorsInImmutablesTest);
defineReflectiveTests(AddConst_PreferConstConstructorsBulkTest);
defineReflectiveTests(AddConst_PreferConstConstructorsTest);
defineReflectiveTests(
AddConst_PreferConstLiteralsToCreateImmutablesBulkTest);
defineReflectiveTests(AddConst_PreferConstLiteralsToCreateImmutablesTest);
});
}
@ -175,3 +178,159 @@ void f() {
''');
}
}
@reflectiveTest
class AddConst_PreferConstLiteralsToCreateImmutablesBulkTest
extends BulkFixProcessorTest {
@override
String get lintCode => LintNames.prefer_const_literals_to_create_immutables;
@override
void setUp() {
super.setUp();
writeTestPackageConfig(
meta: true,
);
}
Future<void> test_map() async {
await resolveTestCode('''
import 'package:meta/meta.dart';
@immutable
class C {
final Map children;
const C({required this.children});
}
void f() {
var c = C(children: {
1 : {}
});
print(c);
}
''');
await assertHasFix('''
import 'package:meta/meta.dart';
@immutable
class C {
final Map children;
const C({required this.children});
}
void f() {
var c = C(children: const {
1 : const {}
});
print(c);
}
''');
}
}
@reflectiveTest
class AddConst_PreferConstLiteralsToCreateImmutablesTest
extends FixProcessorLintTest {
@override
FixKind get kind => DartFixKind.ADD_CONST;
@override
String get lintCode => LintNames.prefer_const_literals_to_create_immutables;
@override
void setUp() {
super.setUp();
writeTestPackageConfig(
meta: true,
);
}
Future<void> test_list() async {
await resolveTestCode('''
import 'package:meta/meta.dart';
@immutable
class C {
final List<C> children;
const C({required this.children});
}
void f() {
var c = C(children: []);
print(c);
}
''');
await assertHasFix('''
import 'package:meta/meta.dart';
@immutable
class C {
final List<C> children;
const C({required this.children});
}
void f() {
var c = C(children: const []);
print(c);
}
''');
}
Future<void> test_map() async {
await resolveTestCode('''
import 'package:meta/meta.dart';
@immutable
class C {
final Map children;
const C({required this.children});
}
void f() {
var c = C(children: {
1 : const {}
});
print(c);
}
''');
await assertHasFix('''
import 'package:meta/meta.dart';
@immutable
class C {
final Map children;
const C({required this.children});
}
void f() {
var c = C(children: const {
1 : const {}
});
print(c);
}
''');
}
Future<void> test_set() async {
await resolveTestCode('''
import 'package:meta/meta.dart';
@immutable
class C {
final Set<C> children;
const C({required this.children});
}
void f() {
var c = C(children: {});
print(c);
}
''');
await assertHasFix('''
import 'package:meta/meta.dart';
@immutable
class C {
final Set<C> children;
const C({required this.children});
}
void f() {
var c = C(children: const {});
print(c);
}
''');
}
}