Skip to content

Commit 63762a0

Browse files
Merge branch 'openrewrite:main' into Recipe_DatagramChannelSendMethod
2 parents fef252b + 05b8264 commit 63762a0

File tree

5 files changed

+99
-18
lines changed

5 files changed

+99
-18
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/main/resources/META-INF/rewrite/jspecify.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ recipeList:
5252
ignoreDefinition: true
5353
- org.openrewrite.java.ChangeType:
5454
oldFullyQualifiedTypeName: javax.annotation.ParametersAreNonnullByDefault
55-
newFullyQualifiedTypeName: org.jspecify.annotation.NullMarked
55+
newFullyQualifiedTypeName: org.jspecify.annotations.NullMarked
5656
ignoreDefinition: true
5757
- org.openrewrite.staticanalysis.java.MoveFieldAnnotationToType:
5858
annotationType: org.jspecify.annotations.*

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
}

src/test/java/org/openrewrite/java/migrate/jspecify/MigrateToJspecifyTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Bar {
8484
}
8585
"""
8686
),
87-
// package-info.java
87+
//language=java
8888
java(
8989
"""
9090
@ParametersAreNonnullByDefault
@@ -96,8 +96,9 @@ class Bar {
9696
@NullMarked
9797
package org.openrewrite.example;
9898
99-
import org.jspecify.annotation.NullMarked;
100-
"""
99+
import org.jspecify.annotations.NullMarked;
100+
""",
101+
spec -> spec.path("src/main/java/org/openrewrite/example/package-info.java")
101102
)
102103
),
103104
//language=xml

0 commit comments

Comments
 (0)