Skip to content

Commit 81c9699

Browse files
committed
Convert most of the checks as used for UseLombokGetter
1 parent 108fdfd commit 81c9699

File tree

2 files changed

+51
-69
lines changed

2 files changed

+51
-69
lines changed

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

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,7 @@
2121
import org.openrewrite.java.tree.Expression;
2222
import org.openrewrite.java.tree.J;
2323
import org.openrewrite.java.tree.JavaType;
24-
import org.openrewrite.java.tree.Statement;
2524

26-
import java.util.List;
27-
28-
import static java.util.stream.Collectors.toList;
2925
import static lombok.AccessLevel.*;
3026
import static org.openrewrite.java.tree.J.Modifier.Type.*;
3127

@@ -66,40 +62,6 @@ static boolean isGetter(J.MethodDeclaration method) {
6662
return false;
6763
}
6864

69-
static boolean isEffectivelySetter(J.MethodDeclaration method) {
70-
boolean isVoid = "void".equals(method.getType().toString());
71-
List<Statement> actualParameters = method.getParameters().stream()
72-
.filter(s -> !(s instanceof J.Empty))
73-
.collect(toList());
74-
boolean oneParam = actualParameters.size() == 1;
75-
if (!isVoid || !oneParam)
76-
return false;
77-
78-
J.VariableDeclarations variableDeclarations = (J.VariableDeclarations) actualParameters.get(0);
79-
J.VariableDeclarations.NamedVariable param = variableDeclarations.getVariables().get(0);
80-
String paramName = param.getName().toString();
81-
82-
boolean singularStatement = method.getBody() != null //abstract methods can be null
83-
&& method.getBody().getStatements().size() == 1 &&
84-
method.getBody().getStatements().get(0) instanceof J.Assignment;
85-
86-
if (!singularStatement) {
87-
return false;
88-
}
89-
J.Assignment assignment = (J.Assignment) method.getBody().getStatements().get(0);
90-
91-
J.FieldAccess fieldAccess = (J.FieldAccess) assignment.getVariable();
92-
93-
return
94-
// assigned value is exactly the parameter
95-
assignment.getAssignment().toString().equals(paramName) // type of parameter and field have to match
96-
&&
97-
98-
// type of parameter and field have to match
99-
param.getType().equals(fieldAccess.getType());
100-
101-
}
102-
10365
private static boolean hasMatchingTypeAndName(J.MethodDeclaration method, @Nullable JavaType type, String simpleName) {
10466
if (method.getType() == type) {
10567
String deriveGetterMethodName = deriveGetterMethodName(type, simpleName);
@@ -121,8 +83,46 @@ private static String deriveGetterMethodName(@Nullable JavaType type, String fie
12183
return "get" + StringUtils.capitalize(fieldName);
12284
}
12385

124-
static String deriveSetterMethodName(JavaType.Variable fieldType) {
125-
return "set" + StringUtils.capitalize(fieldType.getName());
86+
static boolean isSetter(J.MethodDeclaration method) {
87+
// Check return type: void
88+
if (method.getType() != JavaType.Primitive.Void) {
89+
return false;
90+
}
91+
// Check signature: single parameter
92+
if (method.getParameters().size() != 1 || method.getParameters().get(0) instanceof J.Empty) {
93+
return false;
94+
}
95+
// Check body: just an assignment
96+
if (method.getBody() == null || //abstract methods can be null
97+
method.getBody().getStatements().size() != 1 ||
98+
!(method.getBody().getStatements().get(0) instanceof J.Assignment)) {
99+
return false;
100+
}
101+
J.Assignment assignment = (J.Assignment) method.getBody().getStatements().get(0);
102+
J.FieldAccess fieldAccess = (J.FieldAccess) assignment.getVariable();
103+
if (!method.getSimpleName().equals(deriveSetterMethodName(fieldAccess))) {
104+
return false;
105+
}
106+
107+
// Check argument is assigned to field
108+
J.VariableDeclarations variableDeclarations = (J.VariableDeclarations) method.getParameters().get(0);
109+
J.VariableDeclarations.NamedVariable param = variableDeclarations.getVariables().get(0);
110+
JavaType paramType = param.getType();
111+
String paramName = param.getName().toString();
112+
113+
114+
return
115+
// assigned value is exactly the parameter
116+
assignment.getAssignment().toString().equals(paramName) // type of parameter and field have to match
117+
&&
118+
119+
// type of parameter and field have to match
120+
param.getType().equals(fieldAccess.getType());
121+
122+
}
123+
124+
private static String deriveSetterMethodName(J.FieldAccess fieldAccess) {
125+
return "set" + StringUtils.capitalize(fieldAccess.getSimpleName());
126126
}
127127

128128
static AccessLevel getAccessLevel(J.MethodDeclaration methodDeclaration) {

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

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,7 @@ public String getDisplayName() {
4242
@Override
4343
public String getDescription() {
4444
//language=markdown
45-
return "Convert trivial setter methods to `@Setter` annotations on their respective fields.\n\n" +
46-
"Limitations:\n\n" +
47-
" - Does not add a dependency to Lombok, users need to do that manually\n" +
48-
" - Ignores fields that are declared on the same line as others, e.g. `private int foo, bar; " +
49-
"Users who have such fields are advised to separate them beforehand with [org.openrewrite.staticanalysis.MultipleVariableDeclaration](https://docs.openrewrite.org/recipes/staticanalysis/multiplevariabledeclarations).\n" +
50-
" - Does not offer any of the configuration keys listed in https://projectlombok.org/features/GetterSetter.";
45+
return "Convert trivial setter methods to `@Setter` annotations on their respective fields.";
5146
}
5247

5348
@Override
@@ -57,31 +52,18 @@ public Set<String> getTags() {
5752

5853
@Override
5954
public TreeVisitor<?, ExecutionContext> getVisitor() {
60-
return new MethodRemover();
61-
}
62-
63-
@Value
64-
@EqualsAndHashCode(callSuper = false)
65-
private static class MethodRemover extends JavaIsoVisitor<ExecutionContext> {
66-
67-
@Override
68-
public J.@Nullable MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) {
69-
if (LombokUtils.isEffectivelySetter(method)) {
70-
J.Assignment assignment_ = (J.Assignment) method.getBody().getStatements().get(0);
71-
J.FieldAccess fieldAccess = (J.FieldAccess) assignment_.getVariable();
72-
73-
Variable fieldType = fieldAccess.getName().getFieldType();
74-
boolean nameMatch = method.getSimpleName().equals(LombokUtils.deriveSetterMethodName(fieldType));
75-
if (nameMatch) {
76-
doAfterVisit(new FieldAnnotator(
77-
Setter.class,
78-
fieldType,
79-
LombokUtils.getAccessLevel(method)
80-
));
55+
return new JavaIsoVisitor<ExecutionContext>() {
56+
@Override
57+
public J.@Nullable MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) {
58+
if (LombokUtils.isSetter(method)) {
59+
J.Assignment assignment_ = (J.Assignment) method.getBody().getStatements().get(0);
60+
J.FieldAccess fieldAccess = (J.FieldAccess) assignment_.getVariable();
61+
Variable fieldType = fieldAccess.getName().getFieldType();
62+
doAfterVisit(new FieldAnnotator(Setter.class, fieldType, LombokUtils.getAccessLevel(method)));
8163
return null; //delete
8264
}
65+
return method;
8366
}
84-
return method;
85-
}
67+
};
8668
}
8769
}

0 commit comments

Comments
 (0)