From 66990edcf534ff07d4fa55a8113f9cf0f23e1ff8 Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Thu, 8 Dec 2022 06:33:09 +0000 Subject: [PATCH] [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 Commit-Queue: Brian Wilkerson --- .../correction/dart/remove_dead_code.dart | 74 +++++++++++-------- .../correction/fix/remove_dead_code_test.dart | 26 +++++++ 2 files changed, 69 insertions(+), 31 deletions(-) diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart index 845fcdfd304..d880ccd1480 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_dead_code.dart @@ -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 _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)); } diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart index 08dd1ce99b5..0b87da7bce8 100644 --- a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart +++ b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart @@ -412,6 +412,32 @@ void f() { '''); } + Future 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 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 test_statements_one() async { await resolveTestCode(''' int f() {