Skip to content

Commit 1ab2cbf

Browse files
committed
(Hot) Fix issue 608 by disable migration of variables that are initialized by static methods
1 parent cf0ec93 commit 1ab2cbf

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

src/main/java/org/openrewrite/java/migrate/lang/var/DeclarationCheck.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import org.openrewrite.Cursor;
1919
import org.openrewrite.java.tree.*;
2020

21+
import javax.annotation.Nullable;
22+
2123
import static java.util.Objects.requireNonNull;
2224

2325
final class DeclarationCheck {
@@ -198,4 +200,30 @@ private static boolean isInsideInitializer(Cursor cursor, int nestedBlockLevel)
198200

199201
return isInsideInitializer(requireNonNull(cursor.getParent()), nestedBlockLevel);
200202
}
203+
204+
/**
205+
* Checks whether the initializer {@linkplain Expression} is a {@linkplain J.MethodInvocation} targeting a static method.
206+
*
207+
* @param initializer {@linkplain J.VariableDeclarations.NamedVariable#getInitializer()} value
208+
* @return true iff is initialized by static method
209+
*/
210+
public static boolean initializedByStaticMethod(@Nullable Expression initializer) {
211+
if (initializer == null) {
212+
return false;
213+
}
214+
initializer = initializer.unwrap();
215+
216+
if (!(initializer instanceof J.MethodInvocation)) {
217+
// no MethodInvocation -> false
218+
return false;
219+
}
220+
221+
J.MethodInvocation invocation = (J.MethodInvocation) initializer;
222+
if (invocation.getMethodType() == null) {
223+
// not a static method -> false
224+
return false;
225+
}
226+
227+
return invocation.getMethodType().getFlags().contains(Flag.Static);
228+
}
201229
}

src/main/java/org/openrewrite/java/migrate/lang/var/UseVarForObject.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations v
7575
boolean isPrimitive = DeclarationCheck.isPrimitive(vd);
7676
boolean usesGenerics = DeclarationCheck.useGenerics(vd);
7777
boolean usesTernary = DeclarationCheck.initializedByTernary(vd);
78-
boolean usesArrayInitializer = vd.getVariables().get(0).getInitializer() instanceof J.NewArray;
79-
if (isPrimitive || usesGenerics || usesTernary || usesArrayInitializer) {
78+
Expression initializer = vd.getVariables().get(0).getInitializer();
79+
boolean usesArrayInitializer = initializer instanceof J.NewArray;
80+
boolean initializedByStaticMethod = DeclarationCheck.initializedByStaticMethod(initializer);
81+
if (isPrimitive || usesGenerics || usesTernary || usesArrayInitializer || initializedByStaticMethod) {
8082
return vd;
8183
}
8284

src/test/java/org/openrewrite/java/migrate/lang/var/UseVarForObjectsTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ void m() {
270270
}
271271

272272
@Test
273+
@Disabled("in favor to https://github.com/openrewrite/rewrite-migrate-java/issues/608 we skip all static methods ATM")
273274
void staticMethods() {
274275
//language=java
275276
rewriteRun(
@@ -345,10 +346,7 @@ class NotApplicable {
345346
@Test
346347
@Issue("https://github.com/openrewrite/rewrite-migrate-java/issues/608")
347348
void genericTypeInStaticMethod() {
348-
/*
349-
* This can be migrated from `String string = Global.cast(o)` to `var string = Global.<String>cast(o)`.
350-
* But we decided to not migrate, because it is very unconventional Java.
351-
*/
349+
// ATM the recipe skips all static method initialized variables
352350
rewriteRun(
353351
java(
354352
"""

0 commit comments

Comments
 (0)