Skip to content

Commit 05b8264

Browse files
authored
Fix multiple issues in JodaTime to JavaTime migration recipe (#614)
* Fix multiple issues in JodaTime to JavaTime migration recipe * formatting
1 parent cd36280 commit 05b8264

File tree

3 files changed

+94
-14
lines changed

3 files changed

+94
-14
lines changed

src/main/java/org/openrewrite/java/migrate/joda/JodaTimeVisitor.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.jspecify.annotations.Nullable;
2020
import org.openrewrite.ExecutionContext;
2121
import org.openrewrite.java.JavaTemplate;
22+
import org.openrewrite.java.JavadocVisitor;
2223
import org.openrewrite.java.migrate.joda.templates.AllTemplates;
2324
import org.openrewrite.java.migrate.joda.templates.MethodTemplate;
2425
import org.openrewrite.java.migrate.joda.templates.TimeClassMap;
@@ -43,6 +44,19 @@ public JodaTimeVisitor(JodaTimeRecipe.Accumulator acc, boolean safeMigration, Li
4344
this.safeMigration = safeMigration;
4445
}
4546

47+
@Override
48+
protected JavadocVisitor<ExecutionContext> getJavadocVisitor() {
49+
return new JavadocVisitor<ExecutionContext>(this) {
50+
/**
51+
* Do not visit the method referenced from the Javadoc, may cause recipe to fail.
52+
*/
53+
@Override
54+
public Javadoc visitReference(Javadoc.Reference reference, ExecutionContext ctx) {
55+
return reference;
56+
}
57+
};
58+
}
59+
4660
@Override
4761
public @NonNull J visitCompilationUnit(@NonNull J.CompilationUnit cu, @NonNull ExecutionContext ctx) {
4862
maybeRemoveImport(JODA_DATE_TIME);
@@ -70,17 +84,17 @@ public JodaTimeVisitor(JodaTimeRecipe.Accumulator acc, boolean safeMigration, Li
7084

7185
@Override
7286
public @NonNull J visitVariableDeclarations(@NonNull J.VariableDeclarations multiVariable, @NonNull ExecutionContext ctx) {
73-
if (!multiVariable.getType().isAssignableFrom(JODA_CLASS_PATTERN)) {
87+
if (multiVariable.getTypeExpression() == null || !multiVariable.getType().isAssignableFrom(JODA_CLASS_PATTERN)) {
7488
return super.visitVariableDeclarations(multiVariable, ctx);
7589
}
7690
if (multiVariable.getVariables().stream().anyMatch(acc.getUnsafeVars()::contains)) {
7791
return multiVariable;
7892
}
79-
multiVariable = (J.VariableDeclarations) super.visitVariableDeclarations(multiVariable, ctx);
80-
return VarTemplates.getTemplate(multiVariable).apply(
81-
updateCursor(multiVariable),
82-
multiVariable.getCoordinates().replace(),
83-
VarTemplates.getTemplateArgs(multiVariable));
93+
J.VariableDeclarations m = (J.VariableDeclarations) super.visitVariableDeclarations(multiVariable, ctx);
94+
return VarTemplates.getTemplate(multiVariable).<J>map(t -> t.apply(
95+
updateCursor(m),
96+
m.getCoordinates().replace(),
97+
VarTemplates.getTemplateArgs(m))).orElse(multiVariable);
8498
}
8599

86100
@Override
@@ -111,11 +125,11 @@ public JodaTimeVisitor(JodaTimeRecipe.Accumulator acc, boolean safeMigration, Li
111125
if (!mayBeVar.isPresent() || acc.getUnsafeVars().contains(mayBeVar.get())) {
112126
return assignment;
113127
}
114-
return VarTemplates.getTemplate(a).apply(
128+
return VarTemplates.getTemplate(assignment).<J>map(t -> t.apply(
115129
updateCursor(a),
116130
a.getCoordinates().replace(),
117131
varName,
118-
a.getAssignment());
132+
a.getAssignment())).orElse(assignment);
119133
}
120134

121135
@Override

src/main/java/org/openrewrite/java/migrate/joda/templates/VarTemplates.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import java.util.HashMap;
2323
import java.util.Map;
24+
import java.util.Optional;
2425

2526
import static org.openrewrite.java.migrate.joda.templates.TimeClassNames.*;
2627

@@ -37,9 +38,12 @@ public class VarTemplates {
3738
}
3839
};
3940

40-
public static JavaTemplate getTemplate(J.VariableDeclarations variable) {
41+
public static Optional<JavaTemplate> getTemplate(J.VariableDeclarations variable) {
4142
JavaType.Class type = (JavaType.Class) variable.getTypeExpression().getType();
4243
String typeName = JodaToJavaTimeType.get(type.getFullyQualifiedName());
44+
if (typeName == null) {
45+
return Optional.empty(); // unhandled type
46+
}
4347
StringBuilder template = new StringBuilder();
4448
String varName;
4549
try {
@@ -60,19 +64,21 @@ public static JavaTemplate getTemplate(J.VariableDeclarations variable) {
6064
template.append(")}");
6165
}
6266
}
63-
return JavaTemplate.builder(template.toString())
67+
return Optional.of(JavaTemplate.builder(template.toString())
6468
.imports(typeName)
65-
.build();
69+
.build());
6670
}
6771

68-
public static JavaTemplate getTemplate(J.Assignment assignment) {
72+
public static Optional<JavaTemplate> getTemplate(J.Assignment assignment) {
6973
JavaType.Class type = (JavaType.Class) assignment.getAssignment().getType();
7074
JavaType.Class varType = (JavaType.Class) assignment.getVariable().getType();
7175
String typeName = JodaToJavaTimeType.get(type.getFullyQualifiedName());
7276
String varTypeName = JodaToJavaTimeType.get(varType.getFullyQualifiedName());
77+
if (typeName == null || varTypeName == null) {
78+
return Optional.empty(); // unhandled type
79+
}
7380
String template = "#{any(" + varTypeName + ")} = #{any(" + typeName + ")}";
74-
return JavaTemplate.builder(template)
75-
.build();
81+
return Optional.of(JavaTemplate.builder(template).build());
7682
}
7783

7884
public static Object[] getTemplateArgs(J.VariableDeclarations variable) {

src/test/java/org/openrewrite/java/migrate/joda/JodaTimeVisitorTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,4 +733,64 @@ public void foo() {
733733
)
734734
);
735735
}
736+
737+
@Test
738+
void lambdaVarDeclaration() {
739+
//language=java
740+
rewriteRun(
741+
java(
742+
"""
743+
import org.joda.time.DateTime;
744+
import java.util.List;
745+
import java.util.ArrayList;
746+
747+
class A {
748+
public void foo() {
749+
List<Long> list = new ArrayList<>();
750+
list.add(100L);
751+
list.add(200L);
752+
list.forEach(millis -> {
753+
System.out.println(new DateTime().withMillis(millis));
754+
});
755+
}
756+
}
757+
""",
758+
"""
759+
import java.util.List;
760+
import java.time.Instant;
761+
import java.time.ZonedDateTime;
762+
import java.util.ArrayList;
763+
764+
class A {
765+
public void foo() {
766+
List<Long> list = new ArrayList<>();
767+
list.add(100L);
768+
list.add(200L);
769+
list.forEach(millis -> {
770+
System.out.println(ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), ZonedDateTime.now().getZone()));
771+
});
772+
}
773+
}
774+
"""
775+
)
776+
);
777+
}
778+
779+
@Test
780+
void unhandledVarDeclaration() {
781+
//language=java
782+
rewriteRun(
783+
java(
784+
"""
785+
import org.joda.time.Interval;
786+
787+
class A {
788+
public void foo(Interval interval) {
789+
interval = new Interval(100, 50);
790+
}
791+
}
792+
"""
793+
)
794+
);
795+
}
736796
}

0 commit comments

Comments
 (0)