Skip to content

Commit df2e50a

Browse files
committed
stuff
1 parent 6f54027 commit df2e50a

File tree

2 files changed

+83
-18
lines changed

2 files changed

+83
-18
lines changed

src/main/java/org/checkstyle/autofix/recipe/FinalLocalVariable.java

Lines changed: 81 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.ArrayList;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.UUID;
2425

2526
import org.checkstyle.autofix.PositionHelper;
2627
import org.checkstyle.autofix.parser.CheckstyleViolation;
@@ -32,6 +33,7 @@
3233
import org.openrewrite.java.tree.J;
3334
import org.openrewrite.java.tree.Space;
3435
import org.openrewrite.java.tree.Statement;
36+
import org.openrewrite.marker.Marker;
3537
import org.openrewrite.marker.Markers;
3638

3739
/**
@@ -44,6 +46,7 @@ public class FinalLocalVariable extends Recipe {
4446

4547
public FinalLocalVariable(List<CheckstyleViolation> violations) {
4648
this.violations = violations;
49+
System.out.println("Created FinalLocalVariable");
4750
}
4851

4952
@Override
@@ -58,16 +61,90 @@ public String getDescription() {
5861

5962
@Override
6063
public TreeVisitor<?, ExecutionContext> getVisitor() {
61-
return new FinalLocalVariableVisitor();
64+
return new JavaIsoVisitor<>() {
65+
@Override
66+
public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) {
67+
cu = new MarkViolationVisitor().visitCompilationUnit(cu, ctx);
68+
69+
cu = new FinalLocalVariableVisitor().visitCompilationUnit(cu, ctx);
70+
71+
return cu;
72+
}
73+
};
6274
}
6375

64-
private final class FinalLocalVariableVisitor extends JavaIsoVisitor<ExecutionContext> {
76+
public static class FinalLocalVariableMarker implements Marker {
77+
private final UUID id;
78+
79+
public FinalLocalVariableMarker(UUID id) {
80+
this.id = id;
81+
}
82+
83+
@Override
84+
public UUID getId() {
85+
return id;
86+
}
87+
88+
@Override
89+
public <M extends Marker> M withId(UUID id) {
90+
return (M) new FinalLocalVariableMarker(id);
91+
}
92+
93+
}
94+
95+
private class MarkViolationVisitor extends JavaIsoVisitor<ExecutionContext> {
6596

6697
private Path sourcePath;
98+
private J.CompilationUnit currentCompilationUnit;
6799

68100
@Override
69101
public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) {
70102
this.sourcePath = cu.getSourcePath().toAbsolutePath();
103+
this.currentCompilationUnit = cu;
104+
return super.visitCompilationUnit(cu, ctx);
105+
}
106+
107+
@Override
108+
public J.VariableDeclarations.NamedVariable visitVariable(J.VariableDeclarations.NamedVariable variable,
109+
ExecutionContext ctx) {
110+
111+
112+
if (isAtViolationLocation(variable)) {
113+
return variable.withMarkers(
114+
variable.getMarkers().add(new FinalLocalVariableMarker(UUID.randomUUID()))
115+
);
116+
}
117+
return variable;
118+
}
119+
120+
private boolean isAtViolationLocation(J.VariableDeclarations.NamedVariable variable) {
121+
122+
final int line = PositionHelper.computeLinePosition(currentCompilationUnit, variable, getCursor());
123+
final int column = PositionHelper.computeColumnPosition(currentCompilationUnit, variable, getCursor());
124+
125+
System.out.println("Variable: " + variable.getSimpleName() +
126+
" at " + line + ":" + column);
127+
128+
violations.forEach(v -> {
129+
if (v.getFileName().contains("InputSingleLocalTest")) {
130+
System.out.println(" Looking for violation at " + v.getLine() + ":" + v.getColumn());
131+
}
132+
});
133+
134+
return violations.removeIf(violation -> {
135+
final Path absolutePath = Path.of(violation.getFileName()).toAbsolutePath();
136+
return violation.getLine() == line
137+
&& violation.getColumn() == column
138+
&& absolutePath.equals(sourcePath);
139+
});
140+
}
141+
}
142+
143+
private final class FinalLocalVariableVisitor extends JavaIsoVisitor<ExecutionContext> {
144+
145+
146+
@Override
147+
public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) {
71148
return super.visitCompilationUnit(cu, ctx);
72149
}
73150

@@ -85,7 +162,7 @@ public J.VariableDeclarations visitVariableDeclarations(
85162

86163
boolean hasViolation = false;
87164
for (J.VariableDeclarations.NamedVariable variable : declarations.getVariables()) {
88-
if (isAtViolationLocation(variable)) {
165+
if (variable.getMarkers().findFirst(FinalLocalVariableMarker.class).isPresent()) {
89166
hasViolation = true;
90167
break;
91168
}
@@ -142,7 +219,7 @@ private boolean handleMultiVariableDeclaration(J.VariableDeclarations varDecl,
142219
final List<J.VariableDeclarations.NamedVariable> nonViolations = new ArrayList<>();
143220

144221
for (J.VariableDeclarations.NamedVariable variable : varDecl.getVariables()) {
145-
if (isAtViolationLocation(variable)) {
222+
if (variable.getMarkers().findFirst(FinalLocalVariableMarker.class).isPresent()) {
146223
violationsList.add(variable.withPrefix(Space.SINGLE_SPACE));
147224
}
148225
else {
@@ -186,18 +263,5 @@ private J.VariableDeclarations addFinalModifier(J.VariableDeclarations varDecl)
186263

187264
return result;
188265
}
189-
190-
private boolean isAtViolationLocation(J.VariableDeclarations.NamedVariable variable) {
191-
final J.CompilationUnit cu = getCursor().firstEnclosing(J.CompilationUnit.class);
192-
193-
final int line = PositionHelper.computeLinePosition(cu, variable, getCursor());
194-
final int column = PositionHelper.computeColumnPosition(cu, variable, getCursor());
195-
196-
return violations.stream().anyMatch(violation -> {
197-
return violation.getLine() == line
198-
&& violation.getColumn() == column
199-
&& Path.of(violation.getFileName()).equals(sourcePath);
200-
});
201-
}
202266
}
203267
}

src/test/resources/org/checkstyle/autofix/recipe/finallocalvariable/multiplevariable/InputMultipleVariable.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ public void multipleDeclarations() {
1616

1717
String name = "John", city = "NYC"; // 2 violations
1818

19-
double price = 19.99, tax = 0.08; // 2 violations
19+
double price = 19.99, tax = 0.08; // violation, "should be declared final"
2020

21+
tax = 50;
2122
System.out.println("Sum: " + (x + y + z));
2223
System.out.println(name + " lives in " + city);
2324
System.out.println("Total: " + (price + (price * tax)));

0 commit comments

Comments
 (0)