mirror of
https://github.com/dart-lang/sdk
synced 2024-07-25 04:15:45 +00:00
[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:
parent
8e743ca83c
commit
3556eb571e
|
@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,) {}
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue