Skip to content

Commit b741117

Browse files
MBoegerstimtebeek
andauthored
Omit migration to @Setter annotated field of other annotations are present (#672)
* Omit migration to @Setter annotated field of other annotations are present * make `LombokUtils` use a `Cursor` instead a `J.MethodDeclaration` * Retrieve AnnotationService through `org.openrewrite.java.JavaVisitor.service(class)` * Rename private method to express when to skip Getter/Setter --------- Co-authored-by: Tim te Beek <[email protected]>
1 parent 2756731 commit b741117

File tree

5 files changed

+138
-4
lines changed

5 files changed

+138
-4
lines changed

src/main/java/org/openrewrite/java/migrate/lombok/LombokUtils.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,28 @@
1717

1818
import lombok.AccessLevel;
1919
import org.jspecify.annotations.Nullable;
20+
import org.openrewrite.Cursor;
2021
import org.openrewrite.internal.StringUtils;
22+
import org.openrewrite.java.AnnotationMatcher;
23+
import org.openrewrite.java.service.AnnotationService;
2124
import org.openrewrite.java.tree.Expression;
2225
import org.openrewrite.java.tree.J;
2326
import org.openrewrite.java.tree.JavaType;
2427

28+
import java.util.List;
29+
2530
import static lombok.AccessLevel.*;
2631
import static org.openrewrite.java.tree.J.Modifier.Type.*;
2732

2833
class LombokUtils {
2934

30-
static boolean isGetter(J.MethodDeclaration method) {
35+
private static final AnnotationMatcher OVERRIDE_MATCHER = new AnnotationMatcher("java.lang.Override");
36+
37+
static boolean isGetter(Cursor cursor, AnnotationService service) {
38+
if (!(cursor.getValue() instanceof J.MethodDeclaration)) {
39+
return false;
40+
}
41+
J.MethodDeclaration method = cursor.getValue();
3142
if (method.getMethodType() == null) {
3243
return false;
3344
}
@@ -41,6 +52,10 @@ static boolean isGetter(J.MethodDeclaration method) {
4152
!(method.getBody().getStatements().get(0) instanceof J.Return)) {
4253
return false;
4354
}
55+
// Check there is no annotation except @Overwrite
56+
if (hasAnyAnnotatioOtherThanOverride(cursor, service)) {
57+
return false;
58+
}
4459
// Check field is declared on method type
4560
JavaType.FullyQualified declaringType = method.getMethodType().getDeclaringType();
4661
Expression returnExpression = ((J.Return) method.getBody().getStatements().get(0)).getExpression();
@@ -83,7 +98,12 @@ private static String deriveGetterMethodName(@Nullable JavaType type, String fie
8398
return "get" + StringUtils.capitalize(fieldName);
8499
}
85100

86-
static boolean isSetter(J.MethodDeclaration method) {
101+
static boolean isSetter(Cursor cursor, AnnotationService service) {
102+
if (!(cursor.getValue() instanceof J.MethodDeclaration)) {
103+
return false;
104+
}
105+
J.MethodDeclaration method = cursor.getValue();
106+
87107
// Check return type: void
88108
if (method.getType() != JavaType.Primitive.Void) {
89109
return false;
@@ -99,6 +119,11 @@ static boolean isSetter(J.MethodDeclaration method) {
99119
return false;
100120
}
101121

122+
// Check there is no annotation except @Overwrite
123+
if (hasAnyAnnotatioOtherThanOverride(cursor, service)) {
124+
return false;
125+
}
126+
102127
// Check there's no up/down cast between parameter and field
103128
J.VariableDeclarations.NamedVariable param = ((J.VariableDeclarations) method.getParameters().get(0)).getVariables().get(0);
104129
Expression variable = ((J.Assignment) method.getBody().getStatements().get(0)).getVariable();
@@ -141,4 +166,9 @@ static AccessLevel getAccessLevel(J.MethodDeclaration methodDeclaration) {
141166
}
142167
return PACKAGE;
143168
}
169+
170+
private static boolean hasAnyAnnotatioOtherThanOverride(Cursor cursor, AnnotationService service) {
171+
List<J.Annotation> annotations = service.getAllAnnotations(cursor);
172+
return !(annotations.isEmpty() || (annotations.size() == 1 && OVERRIDE_MATCHER.matches(annotations.get(0))));
173+
}
144174
}

src/main/java/org/openrewrite/java/migrate/lombok/UseLombokGetter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.openrewrite.Recipe;
2424
import org.openrewrite.TreeVisitor;
2525
import org.openrewrite.java.JavaIsoVisitor;
26+
import org.openrewrite.java.service.AnnotationService;
2627
import org.openrewrite.java.tree.Expression;
2728
import org.openrewrite.java.tree.J;
2829

@@ -54,7 +55,7 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
5455
return new JavaIsoVisitor<ExecutionContext>() {
5556
@Override
5657
public J.@Nullable MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) {
57-
if (LombokUtils.isGetter(method)) {
58+
if (LombokUtils.isGetter(getCursor(), service(AnnotationService.class))) {
5859
Expression returnExpression = ((J.Return) method.getBody().getStatements().get(0)).getExpression();
5960
if (returnExpression instanceof J.Identifier &&
6061
((J.Identifier) returnExpression).getFieldType() != null) {

src/main/java/org/openrewrite/java/migrate/lombok/UseLombokSetter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.openrewrite.Recipe;
2424
import org.openrewrite.TreeVisitor;
2525
import org.openrewrite.java.JavaIsoVisitor;
26+
import org.openrewrite.java.service.AnnotationService;
2627
import org.openrewrite.java.tree.Expression;
2728
import org.openrewrite.java.tree.J;
2829

@@ -53,7 +54,7 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
5354
return new JavaIsoVisitor<ExecutionContext>() {
5455
@Override
5556
public J.@Nullable MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) {
56-
if (LombokUtils.isSetter(method)) {
57+
if (LombokUtils.isSetter(getCursor(), service(AnnotationService.class))) {
5758
Expression assignmentVariable = ((J.Assignment) method.getBody().getStatements().get(0)).getVariable();
5859
if (assignmentVariable instanceof J.FieldAccess &&
5960
((J.FieldAccess) assignmentVariable).getName().getFieldType() != null) {

src/test/java/org/openrewrite/java/migrate/lombok/UseLombokGetterTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.junit.jupiter.api.Test;
1919
import org.openrewrite.DocumentExample;
20+
import org.openrewrite.Issue;
2021
import org.openrewrite.test.RecipeSpec;
2122
import org.openrewrite.test.RewriteTest;
2223

@@ -528,4 +529,54 @@ public int getFoo() {
528529
)
529530
);
530531
}
532+
533+
@Test
534+
@Issue("https://github.com/openrewrite/rewrite/issues/5015")
535+
void noChangeIfAnnotated() {
536+
rewriteRun(// language=java
537+
java("@interface MyOtherAnnotation {}"),
538+
java(
539+
"""
540+
class A {
541+
542+
int foo = 9;
543+
544+
@MyOtherAnnotation
545+
public int getFoo() {
546+
return foo;
547+
}
548+
}
549+
"""
550+
)
551+
);
552+
}
553+
554+
@Test
555+
@Issue("https://github.com/openrewrite/rewrite/issues/5015")
556+
void replaceGetterIfOverwrite() {
557+
rewriteRun(// language=java
558+
java(
559+
"""
560+
class A {
561+
562+
int foo = 9;
563+
564+
@Override
565+
public int getFoo() {
566+
return foo;
567+
}
568+
}
569+
""",
570+
"""
571+
import lombok.Getter;
572+
573+
class A {
574+
575+
@Getter
576+
int foo = 9;
577+
}
578+
"""
579+
)
580+
);
581+
}
531582
}

src/test/java/org/openrewrite/java/migrate/lombok/UseLombokSetterTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.junit.jupiter.api.Test;
1919
import org.openrewrite.DocumentExample;
20+
import org.openrewrite.Issue;
2021
import org.openrewrite.java.JavaParser;
2122
import org.openrewrite.test.RecipeSpec;
2223
import org.openrewrite.test.RewriteTest;
@@ -537,4 +538,54 @@ public void setFoo(int foo) {
537538
)
538539
);
539540
}
541+
542+
@Test
543+
@Issue("https://github.com/openrewrite/rewrite/issues/5015")
544+
void noChangeIfAnnotated() {
545+
rewriteRun(// language=java
546+
java("@interface MyOtherAnnotation {}"),
547+
java(
548+
"""
549+
class A {
550+
551+
int foo = 9;
552+
553+
@MyOtherAnnotation
554+
public void setFoo(int fub) {
555+
this.foo = fub;
556+
}
557+
}
558+
"""
559+
)
560+
);
561+
}
562+
563+
@Test
564+
@Issue("https://github.com/openrewrite/rewrite/issues/5015")
565+
void replaceSetterIfOverwrite() {
566+
rewriteRun(// language=java
567+
java(
568+
"""
569+
class A {
570+
571+
int foo = 9;
572+
573+
@Override
574+
public void setFoo(int foo) {
575+
this.foo = foo;
576+
}
577+
}
578+
""",
579+
"""
580+
import lombok.Setter;
581+
582+
class A {
583+
584+
@Setter
585+
int foo = 9;
586+
}
587+
"""
588+
)
589+
);
590+
}
540591
}

0 commit comments

Comments
 (0)