From 29b0e54fe3edde2bc8aa933c48cdbd9b012c75c1 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 28 Jul 2023 15:47:58 -0700 Subject: [PATCH] Handle overlapping deletions for unused parameters PiperOrigin-RevId: 551969690 --- .../bugpatterns/UnusedVariable.java | 14 ++++++++---- .../bugpatterns/UnusedVariableTest.java | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java b/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java index d5740870ee7..99b4bc659f4 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java @@ -48,7 +48,10 @@ import com.google.common.collect.Iterables; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; import com.google.common.collect.Streams; +import com.google.common.collect.TreeRangeSet; import com.google.errorprone.BugPattern; import com.google.errorprone.ErrorProneFlags; import com.google.errorprone.VisitorState; @@ -475,9 +478,10 @@ private static ImmutableList buildUnusedParameterFixes( Symbol varSymbol, List usagePaths, VisitorState state) { MethodSymbol methodSymbol = (MethodSymbol) varSymbol.owner; int index = methodSymbol.params.indexOf(varSymbol); - SuggestedFix.Builder fix = SuggestedFix.builder(); + RangeSet deletions = TreeRangeSet.create(); for (TreePath path : usagePaths) { - fix.delete(path.getLeaf()); + deletions.add( + Range.closed(getStartPosition(path.getLeaf()), state.getEndPosition(path.getLeaf()))); } new TreePathScanner() { @Override @@ -507,7 +511,7 @@ private void removeByIndex(List trees) { // TODO(b/118437729): handle bogus source positions in enum declarations return; } - fix.delete(tree); + deletions.add(Range.closed(getStartPosition(tree), state.getEndPosition(tree))); return; } int startPos; @@ -526,9 +530,11 @@ private void removeByIndex(List trees) { // TODO(b/118437729): handle bogus source positions in enum declarations return; } - fix.replace(startPos, endPos, ""); + deletions.add(Range.closed(startPos, endPos)); } }.scan(state.getPath().getCompilationUnit(), null); + SuggestedFix.Builder fix = SuggestedFix.builder(); + deletions.asRanges().forEach(x -> fix.replace(x.lowerEndpoint(), x.upperEndpoint(), "")); return ImmutableList.of(fix.build()); } diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java index 853d37485a1..6a172a4e305 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java @@ -1472,4 +1472,26 @@ public void parcelableCreator_noFinding() { "}") .doTest(); } + + @Test + public void nestedParameterRemoval() { + refactoringHelper + .addInputLines( + "Test.java", + "class Test {", + " private int foo(int a, int b) { return b; }", + " void test() {", + " foo(foo(1, 2), 2);", + " }", + "}") + .addOutputLines( + "Test.java", + "class Test {", + " private int foo(int b) { return b; }", + " void test() {", + " foo(2);", + " }", + "}") + .doTest(); + } }