Skip to content

Commit 688ce47

Browse files
committed
UseVar must not modify fields of anonymous subclasses
Fixes: #241
1 parent ff4d3dc commit 688ce47

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
*/
1616
package org.openrewrite.java.migrate.lang.var;
1717

18-
import static java.util.Objects.requireNonNull;
19-
2018
import org.openrewrite.Cursor;
2119
import org.openrewrite.java.tree.*;
2220

21+
import static java.util.Objects.requireNonNull;
22+
2323
final class DeclarationCheck {
2424

2525
private DeclarationCheck() {
@@ -37,14 +37,11 @@ private DeclarationCheck() {
3737
* @return true if var is applicable in general
3838
*/
3939
public static boolean isVarApplicable(Cursor cursor, J.VariableDeclarations vd) {
40-
boolean isMethodParameter = DeclarationCheck.isMethodParameter(vd, cursor);
41-
boolean isMultiVarDefinition = !DeclarationCheck.isSingleVariableDefinition(vd);
42-
boolean useTernary = DeclarationCheck.initializedByTernary(vd);
43-
if (isMethodParameter || isMultiVarDefinition || useTernary) return false;
44-
45-
boolean isInsideMethod = DeclarationCheck.isInsideMethod(cursor);
46-
boolean isInsideInitializer = DeclarationCheck.isInsideInitializer(cursor, 0);
47-
return isInsideMethod || isInsideInitializer;
40+
if (isField(vd, cursor) || isMethodParameter(vd, cursor) || !isSingleVariableDefinition(vd) || initializedByTernary(vd)) {
41+
return false;
42+
}
43+
44+
return isInsideMethod(cursor) || isInsideInitializer(cursor, 0);
4845
}
4946

5047
/**
@@ -140,6 +137,15 @@ private static boolean isInsideMethod(Cursor cursor) {
140137
return isNotRoot && isNotClassDeclaration && isMethodDeclaration;
141138
}
142139

140+
private static boolean isField(J.VariableDeclarations vd, Cursor cursor) {
141+
Cursor parent = cursor.getParentTreeCursor();
142+
if (parent.getParent() == null) {
143+
return false;
144+
}
145+
Cursor grandparent = parent.getParentTreeCursor();
146+
return parent.getValue() instanceof J.Block && (grandparent.getValue() instanceof J.ClassDeclaration || grandparent.getValue() instanceof J.NewClass);
147+
}
148+
143149
/**
144150
* Determine if the variable declaration at hand is part of a method declaration
145151
*

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static final class UseVarForObjectVisitor extends JavaIsoVisitor<ExecutionContex
6464
public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations vd, ExecutionContext ctx) {
6565
vd = super.visitVariableDeclarations(vd, ctx);
6666

67-
boolean isGeneralApplicable = DeclarationCheck.isVarApplicable(this.getCursor(), vd);
67+
boolean isGeneralApplicable = DeclarationCheck.isVarApplicable(getCursor(), vd);
6868
if (!isGeneralApplicable) return vd;
6969

7070
boolean isPrimitive = DeclarationCheck.isPrimitive(vd);

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
import org.openrewrite.DocumentExample;
2222
import org.openrewrite.test.RecipeSpec;
2323

24-
import static org.openrewrite.java.Assertions.*;
24+
import static org.openrewrite.java.Assertions.java;
25+
import static org.openrewrite.java.Assertions.javaVersion;
2526

2627
class UseVarForObjectsTest extends VarBaseTest {
2728

@@ -184,6 +185,23 @@ class A {
184185

185186
@Nested
186187
class NotApplicable {
188+
@Test
189+
void fieldInAnonymousSubclass() {
190+
//language=java
191+
rewriteRun(
192+
java("""
193+
class A {
194+
void m() {
195+
new Object() {
196+
private final Object o1 = new Object();
197+
};
198+
}
199+
}
200+
"""
201+
)
202+
);
203+
}
204+
187205
@Test
188206
void asParameter() {
189207
//language=java

0 commit comments

Comments
 (0)