constructor tearoff fix support for unnecessary_lambdas

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

Change-Id: I521461a587b9272503772e9b13999d8e4e688352
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212803
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
pq 2021-09-08 21:56:02 +00:00 committed by commit-bot@chromium.org
parent e5c659b55f
commit 8cee82debb
2 changed files with 125 additions and 0 deletions

View file

@ -43,6 +43,16 @@ class ReplaceWithTearOff extends CorrectionProducer {
builder.write(utils.getNodeText(expression.function));
});
});
} else if (expression is InstanceCreationExpression) {
await builder.addDartFileEdit(file, (builder) {
builder.addReplacement(range.node(ancestor), (builder) {
var constructorName = expression.constructorName;
builder.write(utils.getNodeText(constructorName));
if (constructorName.name == null) {
builder.write('.new');
}
});
});
}
}

View file

@ -53,6 +53,121 @@ class ReplaceWithTearOffTest extends FixProcessorLintTest {
@override
String get lintCode => LintNames.unnecessary_lambdas;
Future<void> test_constructorTearOff_named() async {
await resolveTestCode('''
class C {
int c;
C.create([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map((x) => C.create(x))) {
print(c.c);
}
}
''');
await assertHasFix('''
class C {
int c;
C.create([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map(C.create)) {
print(c.c);
}
}
''');
}
// @soloTest
Future<void> test_constructorTearOff_nameUnnamed() async {
await resolveTestCode('''
class C {
int c;
C([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map((x) => C.new(x))) {
print(c.c);
}
}
''');
await assertHasFix('''
class C {
int c;
C([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map(C.new)) {
print(c.c);
}
}
''');
}
Future<void> test_constructorTearOff_oneParameter() async {
await resolveTestCode('''
class C {
int c;
C([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map((x) => C(x))) {
print(c.c);
}
}
''');
await assertHasFix('''
class C {
int c;
C([this.c = 3]);
}
void f() {
var listOfInts = [1, 2, 3];
for (var c in listOfInts.map(C.new)) {
print(c.c);
}
}
''');
}
Future<void> test_constructorTearOff_zeroParameters() async {
await resolveTestCode('''
typedef Maker = Object Function();
class C {
int c;
C([this.c = 3]);
}
var l = <Maker>[
() => C(),
];
''');
await assertHasFix('''
typedef Maker = Object Function();
class C {
int c;
C([this.c = 3]);
}
var l = <Maker>[
C.new,
];
''');
}
Future<void> test_function_oneParameter() async {
await resolveTestCode('''
Function f() => (name) {