From 200f369f347675557152704b55d05e216c2f92d8 Mon Sep 17 00:00:00 2001 From: Anshuman Mishra Date: Tue, 17 Sep 2024 18:33:06 -0700 Subject: [PATCH 1/2] fix: Handle ImmutableOf as Select on MethodInvocation --- .../guava/AbstractNoGuavaImmutableOf.java | 15 +++----- .../guava/NoGuavaImmutableListOfTest.java | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java b/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java index ec1e9c9f6d..35bd1263f0 100644 --- a/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java +++ b/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java @@ -68,7 +68,7 @@ public TreeVisitor getVisitor() { return Preconditions.check(check, new JavaVisitor() { @Override public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (IMMUTABLE_MATCHER.matches(method) && isParentTypeDownCast()) { + if (IMMUTABLE_MATCHER.matches(method) && isParentTypeDownCast(method)) { maybeRemoveImport(guavaType); maybeAddImport(javaType); @@ -115,7 +115,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) return super.visitMethodInvocation(method, ctx); } - private boolean isParentTypeDownCast() { + private boolean isParentTypeDownCast(MethodCall method) { J parent = getCursor().dropParentUntil(J.class::isInstance).getValue(); boolean isParentTypeDownCast = false; if (parent instanceof J.VariableDeclarations.NamedVariable) { @@ -138,14 +138,9 @@ private boolean isParentTypeDownCast() { } } else if (parent instanceof J.MethodInvocation) { J.MethodInvocation m = (J.MethodInvocation) parent; - if (m.getMethodType() != null) { - int index = 0; - for (Expression argument : m.getArguments()) { - if (IMMUTABLE_MATCHER.matches(argument)) { - break; - } - index++; - } + int index = m.getArguments().indexOf(method); + + if (m.getMethodType() != null && index != -1) { isParentTypeDownCast = isParentTypeMatched(m.getMethodType().getParameterTypes().get(index)); } } else if (parent instanceof J.NewClass) { diff --git a/src/test/java/org/openrewrite/java/migrate/guava/NoGuavaImmutableListOfTest.java b/src/test/java/org/openrewrite/java/migrate/guava/NoGuavaImmutableListOfTest.java index 085eccbc3b..3bf5b474b3 100644 --- a/src/test/java/org/openrewrite/java/migrate/guava/NoGuavaImmutableListOfTest.java +++ b/src/test/java/org/openrewrite/java/migrate/guava/NoGuavaImmutableListOfTest.java @@ -312,6 +312,41 @@ class Test { ); } + @Test + void doNotChangeMethodInvocationWithSelect() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + public class A { + Object[] list; + public void method(Object[] list ) { + this.list = list; + } + } + """ + ), + version( + //language=java + java( + """ + import com.google.common.collect.ImmutableList; + + class Test { + void method() { + A a = new A(); + a.method(ImmutableList.of().toArray()); + } + } + """ + ), + 11 + ) + ); + } + @Test void methodInvocationWithListArgument() { //language=java From cdf17aa474809bcdddf84eae8f65151ce5510eb4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 18 Sep 2024 10:41:10 +0200 Subject: [PATCH 2/2] Rename argument for clarity --- .../java/migrate/guava/AbstractNoGuavaImmutableOf.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java b/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java index 35bd1263f0..373f492c23 100644 --- a/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java +++ b/src/main/java/org/openrewrite/java/migrate/guava/AbstractNoGuavaImmutableOf.java @@ -115,7 +115,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) return super.visitMethodInvocation(method, ctx); } - private boolean isParentTypeDownCast(MethodCall method) { + private boolean isParentTypeDownCast(MethodCall immutableMethod) { J parent = getCursor().dropParentUntil(J.class::isInstance).getValue(); boolean isParentTypeDownCast = false; if (parent instanceof J.VariableDeclarations.NamedVariable) { @@ -138,8 +138,7 @@ private boolean isParentTypeDownCast(MethodCall method) { } } else if (parent instanceof J.MethodInvocation) { J.MethodInvocation m = (J.MethodInvocation) parent; - int index = m.getArguments().indexOf(method); - + int index = m.getArguments().indexOf(immutableMethod); if (m.getMethodType() != null && index != -1) { isParentTypeDownCast = isParentTypeMatched(m.getMethodType().getParameterTypes().get(index)); }