diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java index d677686a1e..7cc2824a10 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java @@ -108,7 +108,7 @@ public static void lowContinueLabels(Statement stat, HashSet edges) { if (!ok) { DoStatement dostat = (DoStatement)stat; ok = dostat.getLooptype() == DoStatement.Type.INFINITE || - dostat.getLooptype() == DoStatement.Type.WHILE || + dostat.getLooptype() == DoStatement.Type.WHILE && dostat.getConditionExprent() == null || (dostat.getLooptype() == DoStatement.Type.FOR && dostat.getIncExprent() == null); } diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java index 5188dfff3c..e33d3fc3fd 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java @@ -100,7 +100,7 @@ && isLastInLoop(stat) && isDirectPath(stat, ifedge.getDestination())) stat.setLooptype(DoStatement.Type.DO_WHILE); IfExprent ifexpr = (IfExprent)lastif.getHeadexprent().copy(); - if (ifedge.getType() == StatEdge.TYPE_BREAK) { + if (elseedge.getType() == StatEdge.TYPE_CONTINUE && elseedge.closure == stat) { ifexpr.negateIf(); } diff --git a/testData/results/pkg/TestDoWhileMerge.dec b/testData/results/pkg/TestDoWhileMerge.dec index 7a832054db..644666ef50 100644 --- a/testData/results/pkg/TestDoWhileMerge.dec +++ b/testData/results/pkg/TestDoWhileMerge.dec @@ -25,7 +25,7 @@ public class TestDoWhileMerge { if (++i == 30) {// 28 30 return;// 31 } - } while (!b || i >= 40);// 33 + } while (b && i < 40);// 33 } System.out.println("after");// 36 @@ -49,6 +49,25 @@ public class TestDoWhileMerge { } } }// 57 + + public void test3() { + while (1.0 < Math.random()) {// 60 + System.out.println();// 61 + + do { + System.out.println();// 63 + } while (1.0 < Math.random());// 64 + } + }// 66 + + public void test4() { + while (1.0 > Math.random()) {// 69 + do { + System.out.println();// 71 + System.out.println();// 72 + } while (1.0 < Math.random());// 73 + } + }// 75 } class 'pkg/TestDoWhileMerge' { @@ -139,9 +158,6 @@ class 'pkg/TestDoWhileMerge' { 1d 24 1e 25 1f 27 - 20 27 - 21 27 - 22 27 23 27 24 27 25 27 @@ -216,6 +232,64 @@ class 'pkg/TestDoWhileMerge' { 38 34 3c 50 } + + method 'test3 ()V' { + 0 53 + 1 53 + 2 53 + 3 53 + 4 53 + 5 53 + 6 53 + 7 53 + 8 54 + 9 54 + a 54 + b 54 + c 54 + d 54 + e 57 + f 57 + 10 57 + 11 57 + 12 57 + 13 57 + 14 58 + 15 58 + 16 58 + 17 58 + 18 58 + 1f 60 + } + + method 'test4 ()V' { + 0 63 + 1 63 + 2 63 + 3 63 + 4 63 + 5 63 + 6 63 + 7 63 + 8 65 + 9 65 + a 65 + b 65 + c 65 + d 65 + e 66 + f 66 + 10 66 + 11 66 + 12 66 + 13 66 + 14 67 + 15 67 + 16 67 + 17 67 + 18 67 + 1f 69 + } } Lines mapping: @@ -245,5 +319,15 @@ Lines mapping: 50 <-> 44 54 <-> 48 57 <-> 51 +60 <-> 54 +61 <-> 55 +63 <-> 58 +64 <-> 59 +66 <-> 61 +69 <-> 64 +71 <-> 66 +72 <-> 67 +73 <-> 68 +75 <-> 70 Not mapped: 51 diff --git a/testData/results/pkg/TestJava11StringConcat.dec b/testData/results/pkg/TestJava11StringConcat.dec index 70f4848b9f..47f7725614 100644 --- a/testData/results/pkg/TestJava11StringConcat.dec +++ b/testData/results/pkg/TestJava11StringConcat.dec @@ -34,12 +34,12 @@ class 'pkg/TestJava11StringConcat' { 0 8 1 8 2 8 - 3 8 - 4 8 - 5 8 6 8 7 8 8 8 + 9 8 + a 8 + b 8 } method 'testEmptyPrefix (I)Ljava/lang/String;' { diff --git a/testData/results/pkg/TestNestedLoops.dec b/testData/results/pkg/TestNestedLoops.dec index eab27f8882..59a9db6a43 100644 --- a/testData/results/pkg/TestNestedLoops.dec +++ b/testData/results/pkg/TestNestedLoops.dec @@ -16,7 +16,7 @@ public class TestNestedLoops { for (int j = 0; j < 20; j++) {// 13 do { s.substring(j);// 15 - } while (s.length() >= j);// 16 + } while (s.length() < j);// 16 } } @@ -34,7 +34,7 @@ public class TestNestedLoops { for (int j = 0; j < 20; j++) {// 33 do { s.substring(j);// 35 - } while (s.length() >= j);// 36 + } while (s.length() < j);// 36 } } diff --git a/testData/src/java8/pkg/TestDoWhileMerge.java b/testData/src/java8/pkg/TestDoWhileMerge.java index 50f5ec632c..04b31e80e9 100644 --- a/testData/src/java8/pkg/TestDoWhileMerge.java +++ b/testData/src/java8/pkg/TestDoWhileMerge.java @@ -55,4 +55,22 @@ public void test2(boolean b, int j) { } } } + + public void test3() { + while (1F < Math.random()) { + System.out.println(); + do { + System.out.println(); + } while (1F < Math.random()); + } + } + + public void test4() { + while (1F > Math.random()) { + do { + System.out.println(); + System.out.println(); + } while (1F < Math.random()); + } + } }