diff --git a/src/main/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscore.java b/src/main/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscore.java index 56b2f7d4f9..38bd7b6e7c 100644 --- a/src/main/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscore.java +++ b/src/main/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscore.java @@ -102,7 +102,8 @@ public J.Lambda visitLambda(J.Lambda lambda, ExecutionContext ctx) { private boolean renameVariableIfUnusedInContext(J.VariableDeclarations.NamedVariable variable, J context) { if (!UNDERSCORE.equals(variable.getName().getSimpleName()) && VariableReferences.findRhsReferences(context, variable.getName()).isEmpty() && - !usedInModifyingUnary(variable.getName(), context)) { + !usedInModifyingUnary(variable.getName(), context) && + !usedAsAssignmentTarget(variable.getName(), context)) { doAfterVisit(new RenameVariable<>(variable, UNDERSCORE)); return true; } @@ -121,6 +122,18 @@ public J.Unary visitUnary(J.Unary unary, AtomicBoolean atomicBoolean) { } }.reduce(context, new AtomicBoolean(false)).get(); } + + private boolean usedAsAssignmentTarget(J.Identifier identifier, J context) { + return new JavaIsoVisitor() { + @Override + public J.Assignment visitAssignment(J.Assignment assignment, AtomicBoolean atomicBoolean) { + if (SemanticallyEqual.areEqual(identifier, assignment.getVariable())) { + atomicBoolean.set(true); + } + return super.visitAssignment(assignment, atomicBoolean); + } + }.reduce(context, new AtomicBoolean(false)).get(); + } }); } } diff --git a/src/test/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscoreTest.java b/src/test/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscoreTest.java index 135b957955..3cd4fbd445 100644 --- a/src/test/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscoreTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lang/ReplaceUnusedVariablesWithUnderscoreTest.java @@ -514,4 +514,76 @@ int countOrders(List orders) { ) ); } + + @Test + void doNotReplaceWhenLambdaParamIsAssignmentTarget() { + rewriteRun( + //language=java + java( + """ + import java.util.function.BinaryOperator; + + class Test { + void test() { + BinaryOperator op = (a, b) -> a = "value"; + } + } + """, + """ + import java.util.function.BinaryOperator; + + class Test { + void test() { + BinaryOperator op = (a, _) -> a = "value"; + } + } + """ + ) + ); + } + + @Test + void doNotReplaceWhenSecondLambdaParamIsAssignmentTarget() { + rewriteRun( + //language=java + java( + """ + import java.util.function.BinaryOperator; + + class Test { + void test() { + BinaryOperator op = (a, b) -> b = "value"; + } + } + """, + """ + import java.util.function.BinaryOperator; + + class Test { + void test() { + BinaryOperator op = (_, b) -> b = "value"; + } + } + """ + ) + ); + } + + @Test + void doNotReplaceWhenSingleLambdaParamIsAssignmentTarget() { + rewriteRun( + //language=java + java( + """ + import java.util.function.UnaryOperator; + + class Test { + void test() { + UnaryOperator op = a -> a = "value"; + } + } + """ + ) + ); + } }