2121import java .util .ArrayList ;
2222import java .util .Collections ;
2323import java .util .List ;
24+ import java .util .UUID ;
2425
2526import org .checkstyle .autofix .PositionHelper ;
2627import org .checkstyle .autofix .parser .CheckstyleViolation ;
3233import org .openrewrite .java .tree .J ;
3334import org .openrewrite .java .tree .Space ;
3435import org .openrewrite .java .tree .Statement ;
36+ import org .openrewrite .marker .Marker ;
3537import 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}
0 commit comments