Skip to content

Commit 0b09c20

Browse files
committed
Merge remote-tracking branch 'origin/main' into java-template-only
2 parents 29cc689 + d267c8f commit 0b09c20

File tree

2 files changed

+119
-11
lines changed

2 files changed

+119
-11
lines changed

src/main/java/org/openrewrite/staticanalysis/RemoveExtraSemicolons.java

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,23 @@
1515
*/
1616
package org.openrewrite.staticanalysis;
1717

18+
import java.time.Duration;
19+
import java.util.ArrayList;
20+
import java.util.Arrays;
21+
import java.util.Iterator;
22+
import java.util.LinkedHashSet;
23+
import java.util.List;
24+
import java.util.Optional;
25+
import java.util.Set;
26+
1827
import org.openrewrite.ExecutionContext;
1928
import org.openrewrite.Recipe;
2029
import org.openrewrite.TreeVisitor;
2130
import org.openrewrite.java.JavaIsoVisitor;
31+
import org.openrewrite.java.tree.Comment;
2232
import org.openrewrite.java.tree.J;
23-
24-
import java.time.Duration;
25-
import java.util.Arrays;
26-
import java.util.LinkedHashSet;
27-
import java.util.Set;
33+
import org.openrewrite.java.tree.Space;
34+
import org.openrewrite.java.tree.Statement;
2835

2936
public class RemoveExtraSemicolons extends Recipe {
3037

@@ -52,20 +59,33 @@ public Duration getEstimatedEffortPerOccurrence() {
5259
@Override
5360
public TreeVisitor<?, ExecutionContext> getVisitor() {
5461
return new JavaIsoVisitor<ExecutionContext>() {
62+
5563
@Override
56-
public J.Empty visitEmpty(J.Empty empty, ExecutionContext ctx) {
57-
if (getCursor().getParentTreeCursor().getValue() instanceof J.Block) {
58-
return null;
64+
public J.Block visitBlock(final J.Block block, final ExecutionContext executionContext) {
65+
final Iterator<Statement> iterator = block.getStatements().iterator();
66+
final List<Statement> result = new ArrayList<>();
67+
while (iterator.hasNext()) {
68+
Statement statement = iterator.next();
69+
if (statement instanceof J.Empty) {
70+
nextNonEmptyAggregatedWithComments(statement, iterator)
71+
.ifPresent(nextLine -> {
72+
Space updatedPrefix = nextLine.getPrefix()
73+
.withWhitespace(statement.getPrefix().getWhitespace());
74+
result.add(nextLine.withPrefix(updatedPrefix));
75+
});
76+
} else {
77+
result.add(statement);
78+
}
5979
}
60-
return empty;
80+
return super.visitBlock(block.withStatements(result), executionContext);
6181
}
6282

6383
@Override
6484
public J.Try.Resource visitTryResource(J.Try.Resource tr, ExecutionContext executionContext) {
6585
J.Try _try = getCursor().dropParentUntil(is -> is instanceof J.Try).getValue();
6686
if (_try.getResources().isEmpty() ||
67-
_try.getResources().get(_try.getResources().size() - 1) != tr ||
68-
!_try.getResources().get(_try.getResources().size() - 1).isTerminatedWithSemicolon()) {
87+
_try.getResources().get(_try.getResources().size() - 1) != tr ||
88+
!_try.getResources().get(_try.getResources().size() - 1).isTerminatedWithSemicolon()) {
6989
return tr;
7090
}
7191
return tr.withTerminatedWithSemicolon(false);
@@ -81,4 +101,16 @@ public J.EnumValueSet visitEnumValueSet(J.EnumValueSet enums, ExecutionContext e
81101
}
82102
};
83103
}
104+
105+
private Optional<Statement> nextNonEmptyAggregatedWithComments(Statement current, Iterator<Statement> iterator) {
106+
List<Comment> comments = new ArrayList<>(current.getComments());
107+
while (iterator.hasNext()) {
108+
Statement statement = iterator.next();
109+
comments.addAll(statement.getComments());
110+
if (!(statement instanceof J.Empty)) {
111+
return Optional.of(statement.withComments(comments));
112+
}
113+
}
114+
return Optional.empty();
115+
}
84116
}

src/test/java/org/openrewrite/staticanalysis/RemoveExtraSemicolonsTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,80 @@ public J.Try visitTry(J.Try t, Object o) {
137137
)
138138
);
139139
}
140+
141+
@Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/99")
142+
@Test
143+
void semicolonBeforeStatement() {
144+
rewriteRun(
145+
//language=java
146+
java(
147+
"""
148+
class Test {
149+
void test() {
150+
int a = 1;
151+
;int b = 2;
152+
}
153+
}
154+
""",
155+
"""
156+
class Test {
157+
void test() {
158+
int a = 1;
159+
int b = 2;
160+
}
161+
}
162+
"""
163+
)
164+
);
165+
}
166+
167+
@Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/99")
168+
@Test
169+
void manySemicolonBeforeStatement() {
170+
rewriteRun(
171+
//language=java
172+
java(
173+
"""
174+
class Test {
175+
int test() {
176+
int a = 1; //first we set a to 1
177+
;a = 2;/*then we set a to 2 */
178+
a = 3;//then we set a to 3
179+
;a = 4;;;;;//then we set a to 4
180+
;a = 5;//then we set a to 5
181+
a = 6;;//then we set a to 6
182+
if (a == 6) { //if a is 6
183+
;a = 7;;//then if a is 6 we set a to 7
184+
}
185+
;;
186+
;//next we set a to 8
187+
;a = 8;
188+
return a;
189+
;
190+
//we are done!
191+
}
192+
}
193+
""",
194+
"""
195+
class Test {
196+
int test() {
197+
int a = 1; //first we set a to 1
198+
a = 2;/*then we set a to 2 */
199+
a = 3;//then we set a to 3
200+
a = 4;//then we set a to 4
201+
a = 5;//then we set a to 5
202+
a = 6;//then we set a to 6
203+
if (a == 6) { //if a is 6
204+
a = 7;//then if a is 6 we set a to 7
205+
}
206+
//next we set a to 8
207+
a = 8;
208+
return a;
209+
//we are done!
210+
}
211+
}
212+
"""
213+
)
214+
);
215+
}
140216
}

0 commit comments

Comments
 (0)