[analysis_server] RemoveDeadCode to handle forParts updaters

Fixes #43511

Change-Id: I8d717038356444c70e082aab37911791de63bd6e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/266389
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Ahmed Ashour 2022-11-21 19:59:27 +00:00 committed by Commit Queue
parent 8e743ca83c
commit 3556eb571e
2 changed files with 99 additions and 8 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/source/source_range.dart';
import 'package:analyzer/src/error/dead_code_verifier.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@ -53,6 +54,28 @@ class RemoveDeadCode extends CorrectionProducer {
builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode));
});
}
} else if (parent is ForParts) {
var forStatement = parent.parent;
if (forStatement is! ForStatement) return;
var updaters = parent.updaters;
if (updaters.contains(coveredNode)) {
var isFirstNode = updaters.first == coveredNode;
var rightParenthesis = forStatement.rightParenthesis;
var isComma = !isFirstNode &&
rightParenthesis.previous?.type == TokenType.COMMA;
var previous = coveredNode.beginToken.previous!;
var deletionRange = isComma
? range.endStart(previous, rightParenthesis)
: range.startStart(
isFirstNode ? coveredNode : previous, rightParenthesis);
await builder.addDartFileEdit(file, (builder) {
builder.addDeletion(deletionRange);
});
}
}
} else if (coveredNode is Block) {
var block = coveredNode;
@ -94,6 +117,22 @@ class RemoveDeadCode extends CorrectionProducer {
await builder.addDartFileEdit(file, (builder) {
builder.addDeletion(range.endEnd(previous, coveredNode));
});
} else if (coveredNode is ForParts) {
var forStatement = coveredNode.parent;
if (forStatement is! ForStatement) return;
var problemMessage = diagnostic?.problemMessage;
if (problemMessage == null) return;
var updaters = coveredNode.updaters;
var beginOffset = updaters.beginToken!.offset;
if (problemMessage.offset == beginOffset &&
problemMessage.length == updaters.endToken!.end - beginOffset) {
await builder.addDartFileEdit(file, (builder) {
builder.addDeletion(range.startOffsetEndOffset(
beginOffset, forStatement.rightParenthesis.offset));
});
}
}
}

View file

@ -103,9 +103,7 @@ void f(int p) {
''');
}
@failingTest
Future<void> test_do_returnInBody() async {
// https://github.com/dart-lang/sdk/issues/43511
await resolveTestCode('''
void f(bool c) {
do {
@ -116,9 +114,10 @@ void f(bool c) {
''');
await assertHasFix('''
void f(bool c) {
print(c);
print(c);
return;
}
''');
''', errorFilter: (error) => error.length == 4);
}
Future<void> test_doWhile_atDo() async {
@ -342,12 +341,10 @@ void f() {
await assertNoFix();
}
@failingTest
Future<void> test_for_returnInBody() async {
// https://github.com/dart-lang/sdk/issues/43511
await resolveTestCode('''
void f() {
for (int i = 0; i < 2; i++) {
for (var i = 0; i < 2; i++) {
print(i);
return;
}
@ -355,7 +352,62 @@ void f() {
''');
await assertHasFix('''
void f() {
print(0);
for (var i = 0; i < 2; ) {
print(i);
return;
}
}
''');
}
Future<void> test_forParts_updaters_multiple() async {
await resolveTestCode('''
void f() {
for (; false; 1, 2) {}
}
''');
await assertHasFix('''
void f() {
for (; false; ) {}
}
''', errorFilter: (error) => error.length == 4);
}
Future<void> test_forParts_updaters_multiple_comma() async {
await resolveTestCode('''
void f() {
for (; false; 1, 2,) {}
}
''');
await assertHasFix('''
void f() {
for (; false; ) {}
}
''', errorFilter: (error) => error.length == 4);
}
Future<void> test_forParts_updaters_throw() async {
await resolveTestCode('''
void f() {
for (;; 0, throw 1, 2) {}
}
''');
await assertHasFix('''
void f() {
for (;; 0, throw 1) {}
}
''');
}
Future<void> test_forParts_updaters_throw_comma() async {
await resolveTestCode('''
void f() {
for (;; 0, throw 1, 2,) {}
}
''');
await assertHasFix('''
void f() {
for (;; 0, throw 1,) {}
}
''');
}