Skip to content

Commit 19833ec

Browse files
committed
Leave a Groovy def declaration alone instead of splicing var into its variable name.
1 parent d469946 commit 19833ec

3 files changed

Lines changed: 52 additions & 3 deletions

File tree

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ private static boolean hasDimensionsAfterName(J.VariableDeclarations vd) {
7474
* @return true if single variable definition with initialization and without var
7575
*/
7676
private static boolean isSingleVariableDefinition(J.VariableDeclarations vd) {
77-
TypeTree typeExpression = vd.getTypeExpression();
77+
if (!replaceableTypeExpression(vd.getTypeExpression())) {
78+
return false;
79+
}
7880

7981
boolean definesSingleVariable = vd.getVariables().size() == 1;
8082
boolean isPureAssigment = JavaType.Primitive.Null == vd.getType();
@@ -90,8 +92,22 @@ private static boolean isSingleVariableDefinition(J.VariableDeclarations vd) {
9092

9193
initializer = initializer.unwrap();
9294
boolean isNullAssigment = J.Literal.isLiteralValue(initializer, null);
93-
boolean alreadyUseVar = typeExpression instanceof J.Identifier && "var".equals(((J.Identifier) typeExpression).getSimpleName());
94-
return !isNullAssigment && !alreadyUseVar;
95+
return !isNullAssigment;
96+
}
97+
98+
/**
99+
* Groovy parses {@code def x = ...} into an empty {@link J.Identifier} and prints {@code def}
100+
* from a marker, so writing {@code var} there splices it onto the name ({@code def varx = ...}).
101+
*/
102+
private static boolean replaceableTypeExpression(@Nullable TypeTree typeExpression) {
103+
if (typeExpression == null) {
104+
return false;
105+
}
106+
if (typeExpression instanceof J.Identifier) {
107+
String simpleName = ((J.Identifier) typeExpression).getSimpleName();
108+
return !simpleName.isEmpty() && !"var".equals(simpleName);
109+
}
110+
return true;
95111
}
96112

97113
/**

‎src/test/java/org/openrewrite/java/migrate/lang/var/UseVarForConstructorsTest.java‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.openrewrite.test.RecipeSpec;
2121
import org.openrewrite.test.RewriteTest;
2222

23+
import static org.openrewrite.groovy.Assertions.groovy;
2324
import static org.openrewrite.java.Assertions.java;
2425
import static org.openrewrite.java.Assertions.javaVersion;
2526

@@ -267,4 +268,19 @@ ArrayList<String> getList() {
267268
)
268269
);
269270
}
271+
272+
@Test
273+
void doNotSpliceVarIntoGroovyDef() {
274+
rewriteRun(
275+
//language=groovy
276+
groovy(
277+
"""
278+
def stripVmExtension(File dir) {
279+
def newFile = new File(dir, "child")
280+
assert newFile != null
281+
}
282+
"""
283+
)
284+
);
285+
}
270286
}

‎src/test/java/org/openrewrite/java/migrate/lang/var/UseVarForPrimitiveTest.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.openrewrite.Issue;
2222
import org.openrewrite.test.RecipeSpec;
2323

24+
import static org.openrewrite.groovy.Assertions.groovy;
2425
import static org.openrewrite.java.Assertions.java;
2526
import static org.openrewrite.java.Assertions.javaVersion;
2627

@@ -33,6 +34,22 @@ public void defaults(RecipeSpec spec) {
3334

3435
@Nested
3536
class NotApplicable {
37+
@Test
38+
void forGroovyDef() {
39+
//language=groovy
40+
rewriteRun(
41+
groovy(
42+
"""
43+
class A {
44+
void m() {
45+
def count = 1
46+
}
47+
}
48+
"""
49+
)
50+
);
51+
}
52+
3653
@Test
3754
void forShort() {
3855
//language=java

0 commit comments

Comments
 (0)