mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 04:16:51 +00:00
[analysis_server] fix RemoveDeadCode
with forParts
Bug #43511 Change-Id: I82854382928cd29bfc7c646f0c202d28603f8836 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/271200 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
parent
293ae7dabe
commit
66990edcf5
|
@ -57,25 +57,7 @@ class RemoveDeadCode extends CorrectionProducer {
|
|||
} 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);
|
||||
});
|
||||
}
|
||||
await _computeForStatementParts(builder, forStatement, parent);
|
||||
}
|
||||
} else if (coveredNode is Block) {
|
||||
var block = coveredNode;
|
||||
|
@ -121,18 +103,7 @@ class RemoveDeadCode extends CorrectionProducer {
|
|||
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));
|
||||
});
|
||||
}
|
||||
await _computeForStatementParts(builder, forStatement, coveredNode);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -197,6 +168,47 @@ class RemoveDeadCode extends CorrectionProducer {
|
|||
return false;
|
||||
}
|
||||
|
||||
Future<void> _computeForStatementParts(ChangeBuilder builder,
|
||||
ForStatement forStatement, ForParts forParts) async {
|
||||
var beginNode = coveredNode;
|
||||
if (beginNode == null) return;
|
||||
var updaters = forParts.updaters;
|
||||
if (!updaters.contains(beginNode)) {
|
||||
var problemMessage = diagnostic?.problemMessage;
|
||||
if (problemMessage == null) return;
|
||||
|
||||
beginNode = null;
|
||||
var problemOffset = problemMessage.offset;
|
||||
var problemLength = problemMessage.length;
|
||||
var updatersEnd = updaters.endToken!.end;
|
||||
|
||||
for (var node in updaters) {
|
||||
var nodeOffset = node.offset;
|
||||
if (problemOffset == nodeOffset &&
|
||||
problemLength == updatersEnd - nodeOffset) {
|
||||
beginNode = node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (beginNode == null) return;
|
||||
}
|
||||
var isFirstNode = updaters.first == beginNode;
|
||||
var rightParenthesis = forStatement.rightParenthesis;
|
||||
var isComma =
|
||||
!isFirstNode && rightParenthesis.previous?.type == TokenType.COMMA;
|
||||
|
||||
var previous = beginNode.beginToken.previous!;
|
||||
|
||||
var deletionRange = isComma
|
||||
? range.endStart(previous, rightParenthesis)
|
||||
: range.startStart(
|
||||
isFirstNode ? beginNode : previous, rightParenthesis);
|
||||
|
||||
await builder.addDartFileEdit(file, (builder) {
|
||||
builder.addDeletion(deletionRange);
|
||||
});
|
||||
}
|
||||
|
||||
void _deleteLineRange(DartFileEditBuilder builder, SourceRange sourceRange) {
|
||||
builder.addDeletion(utils.getLinesRange(sourceRange));
|
||||
}
|
||||
|
|
|
@ -412,6 +412,32 @@ void f() {
|
|||
''');
|
||||
}
|
||||
|
||||
Future<void> test_forParts_updaters_throw_multiple() async {
|
||||
await resolveTestCode('''
|
||||
void f() {
|
||||
for (;; 0, throw 1, 2, 3) {}
|
||||
}
|
||||
''');
|
||||
await assertHasFix('''
|
||||
void f() {
|
||||
for (;; 0, throw 1) {}
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
Future<void> test_forParts_updaters_throw_multiple_comma() async {
|
||||
await resolveTestCode('''
|
||||
void f() {
|
||||
for (;; 0, throw 1, 2, 3,) {}
|
||||
}
|
||||
''');
|
||||
await assertHasFix('''
|
||||
void f() {
|
||||
for (;; 0, throw 1,) {}
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
Future<void> test_statements_one() async {
|
||||
await resolveTestCode('''
|
||||
int f() {
|
||||
|
|
Loading…
Reference in a new issue