Skip to content

Commit a5ff682

Browse files
committed
Added test for manual break of infinite loop
1 parent d0d8fce commit a5ff682

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ private static boolean breaks(Statement s) {
149149
return !statements.isEmpty() && breaks(statements.get(statements.size() - 1));
150150
} else if (s instanceof J.If) {
151151
J.If iff = (J.If) s;
152-
return iff.getElsePart() != null && breaks(iff.getThenPart()) && breaks(iff.getThenPart());
152+
return iff.getElsePart() != null && breaks(iff.getThenPart());
153153
} else if (s instanceof J.Label) {
154154
return breaks(((J.Label) s).getStatement());
155155
} else if (s instanceof J.Try) {
@@ -271,7 +271,7 @@ private static boolean returns(Statement s) {
271271
if (value.getValue() == Boolean.TRUE) {
272272
Statement body = whileLoop.getBody();
273273
if (body instanceof J.Block) {
274-
return hasGuaranteedReturn(((J.Block) body).getStatements());
274+
return !hasBreak(((J.Block) body).getStatements()) && hasGuaranteedReturn(((J.Block) body).getStatements());
275275
} else {
276276
return hasGuaranteedReturn(Collections.singletonList(whileLoop.getBody()));
277277
}
@@ -281,6 +281,15 @@ private static boolean returns(Statement s) {
281281
return s instanceof J.Return;
282282
}
283283

284+
private static boolean hasBreak(List<Statement> statements) {
285+
for(Statement s : statements) {
286+
if(s instanceof J.Break) {
287+
return true;
288+
}
289+
}
290+
return false;
291+
}
292+
284293
@Override
285294
public J.Case visitCase(J.Case case_, Set<J> ctx) {
286295
if (case_ == scope) {

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ void returnNestedInAlwaysTrueLoop() {
531531
java(
532532
"""
533533
enum Enum {
534-
A, B, C, D
534+
A, B, C, D, E, F
535535
}
536536
public class Test {
537537
void foo(Enum a) {
@@ -553,14 +553,28 @@ void foo(Enum a) {
553553
while (b) {
554554
return;
555555
}
556+
case E:
557+
for (; ; ) {
558+
if(false) {
559+
break;
560+
}
561+
return;
562+
}
563+
case F:
564+
while (true) {
565+
if(false) {
566+
break;
567+
}
568+
return;
569+
}
556570
default:
557571
}
558572
}
559573
}
560574
""",
561575
"""
562576
enum Enum {
563-
A, B, C, D
577+
A, B, C, D, E, F
564578
}
565579
public class Test {
566580
void foo(Enum a) {
@@ -584,6 +598,22 @@ void foo(Enum a) {
584598
return;
585599
}
586600
break;
601+
case E:
602+
for (; ; ) {
603+
if(false) {
604+
break;
605+
}
606+
return;
607+
}
608+
break;
609+
case F:
610+
while (true) {
611+
if(false) {
612+
break;
613+
}
614+
return;
615+
}
616+
break;
587617
default:
588618
}
589619
}

0 commit comments

Comments
 (0)