Skip to content

Commit 91c579b

Browse files
committed
Also handle field access
1 parent 665e73a commit 91c579b

File tree

3 files changed

+69
-24
lines changed

3 files changed

+69
-24
lines changed

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

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,33 @@
3030

3131
class LombokUtils {
3232

33-
public static boolean isEffectivelyGetter(J.MethodDeclaration method) {
34-
boolean takesNoParameters = method.getParameters().get(0) instanceof J.Empty;
35-
boolean singularReturn = method.getBody() != null //abstract methods can be null
36-
&& method.getBody().getStatements().size() == 1 &&
37-
method.getBody().getStatements().get(0) instanceof J.Return;
38-
39-
if (takesNoParameters && singularReturn) {
40-
Expression returnExpression = ((J.Return) method.getBody().getStatements().get(0)).getExpression();
41-
//returns just an identifier
42-
if (returnExpression instanceof J.Identifier) {
43-
J.Identifier identifier = (J.Identifier) returnExpression;
44-
JavaType.Variable fieldType = identifier.getFieldType();
45-
return method.getType().equals(fieldType.getType());
46-
}
33+
static boolean isEffectivelyGetter(J.MethodDeclaration method) {
34+
// Check signature: no parameters
35+
if (!(method.getParameters().get(0) instanceof J.Empty) || method.getReturnTypeExpression() == null) {
36+
return false;
37+
}
38+
// Check body: just a return statement
39+
if (method.getBody() == null ||
40+
method.getBody().getStatements().size() != 1 ||
41+
!(method.getBody().getStatements().get(0) instanceof J.Return)) {
42+
return false;
43+
}
44+
Expression returnExpression = ((J.Return) method.getBody().getStatements().get(0)).getExpression();
45+
//returns just an identifier
46+
if (returnExpression instanceof J.Identifier) {
47+
J.Identifier identifier = (J.Identifier) returnExpression;
48+
JavaType.Variable fieldType = identifier.getFieldType();
49+
return method.getType().equals(fieldType.getType());
50+
} else if (returnExpression instanceof J.FieldAccess) {
51+
J.FieldAccess fieldAccess = (J.FieldAccess) returnExpression;
52+
JavaType fieldType = fieldAccess.getType();
53+
return method.getType().equals(fieldType);
4754
}
4855
return false;
4956
}
5057

51-
public static String deriveGetterMethodName(JavaType.Variable fieldType) {
52-
String fieldName = fieldType.getName();
53-
if (fieldType.getType() == JavaType.Variable.Primitive.Boolean) {
58+
static String deriveGetterMethodName(JavaType type, String fieldName) {
59+
if (type == JavaType.Primitive.Boolean) {
5460
boolean alreadyStartsWithIs = fieldName.length() >= 3 &&
5561
fieldName.substring(0, 3).matches("is[A-Z]");
5662
if (alreadyStartsWithIs) {
@@ -62,7 +68,7 @@ public static String deriveGetterMethodName(JavaType.Variable fieldType) {
6268
return "get" + StringUtils.capitalize(fieldName);
6369
}
6470

65-
public static AccessLevel getAccessLevel(Collection<J.Modifier> modifiers) {
71+
static AccessLevel getAccessLevel(Collection<J.Modifier> modifiers) {
6672
Map<J.Modifier.Type, AccessLevel> map = ImmutableMap.<J.Modifier.Type, AccessLevel>builder()
6773
.put(Public, PUBLIC)
6874
.put(Protected, PROTECTED)

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.openrewrite.java.JavaIsoVisitor;
2626
import org.openrewrite.java.JavaParser;
2727
import org.openrewrite.java.JavaTemplate;
28+
import org.openrewrite.java.tree.Expression;
2829
import org.openrewrite.java.tree.J;
2930

3031
import java.util.Collections;
@@ -92,12 +93,23 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex
9293
public J.@Nullable MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) {
9394
if (method.getMethodType() != null && LombokUtils.isEffectivelyGetter(method)) {
9495
J.Return return_ = (J.Return) method.getBody().getStatements().get(0);
95-
Variable fieldType = ((J.Identifier) return_.getExpression()).getFieldType();
96-
boolean nameMatch = method.getSimpleName().equals(LombokUtils.deriveGetterMethodName(fieldType));
97-
if (nameMatch) {
98-
((Set<Finding>) getCursor().getNearestMessage(FIELDS_TO_DECORATE_KEY))
99-
.add(new Finding(fieldType.getName(), LombokUtils.getAccessLevel(method.getModifiers())));
100-
return null; //delete
96+
Expression returnExpression = return_.getExpression();
97+
if (returnExpression instanceof J.Identifier) {
98+
J.Identifier identifier = (J.Identifier) returnExpression;
99+
String deriveGetterMethodName = LombokUtils.deriveGetterMethodName(identifier.getType(), identifier.getSimpleName());
100+
if (method.getSimpleName().equals(deriveGetterMethodName)) {
101+
((Set<Finding>) getCursor().getNearestMessage(FIELDS_TO_DECORATE_KEY))
102+
.add(new Finding(identifier.getSimpleName(), LombokUtils.getAccessLevel(method.getModifiers())));
103+
return null;
104+
}
105+
} else if (returnExpression instanceof J.FieldAccess) {
106+
J.FieldAccess fieldAccess = (J.FieldAccess) returnExpression;
107+
String deriveGetterMethodName = LombokUtils.deriveGetterMethodName(fieldAccess.getType(), fieldAccess.getSimpleName());
108+
if (method.getSimpleName().equals(deriveGetterMethodName)) {
109+
((Set<Finding>) getCursor().getNearestMessage(FIELDS_TO_DECORATE_KEY))
110+
.add(new Finding(fieldAccess.getSimpleName(), LombokUtils.getAccessLevel(method.getModifiers())));
111+
return null;
112+
}
101113
}
102114
}
103115
return method;

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,33 @@ class A {
5757
);
5858
}
5959

60+
@Test
61+
void replaceGetterWithFieldAccess() {
62+
rewriteRun(// language=java
63+
java(
64+
"""
65+
class A {
66+
67+
int foo = 9;
68+
69+
public int getFoo() {
70+
return this.foo;
71+
}
72+
}
73+
""",
74+
"""
75+
import lombok.Getter;
76+
77+
class A {
78+
79+
@Getter
80+
int foo = 9;
81+
}
82+
"""
83+
)
84+
);
85+
}
86+
6087
@Test
6188
void replacePackageGetter() {
6289
rewriteRun(// language=java

0 commit comments

Comments
 (0)