From 34110df5f4660ba08e440e3f0b363ae526852434 Mon Sep 17 00:00:00 2001 From: Graham Date: Tue, 14 Jul 2020 21:31:57 +0100 Subject: [PATCH] Improve heuristic for converting while loops to for loops We now only convert while loops to for loops if the same variable is used in the initialisation statement, condition and increment statement. --- .../modules/decompiler/MergeHelper.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java index 7f0aef6..fcdbdff 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java @@ -4,6 +4,7 @@ package org.jetbrains.java.decompiler.modules.decompiler; import org.jetbrains.java.decompiler.code.cfg.BasicBlock; import org.jetbrains.java.decompiler.main.DecompilerContext; import org.jetbrains.java.decompiler.main.collectors.CounterContainer; +import org.jetbrains.java.decompiler.modules.decompiler.exps.AssignmentExprent; import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; import org.jetbrains.java.decompiler.modules.decompiler.exps.IfExprent; import org.jetbrains.java.decompiler.modules.decompiler.stats.*; @@ -268,7 +269,7 @@ public class MergeHelper { } private static void matchFor(DoStatement stat) { - Exprent lastDoExprent, initDoExprent; + Exprent lastDoExprent, initDoExprent = null; Statement lastData, preData = null; // get last exprent @@ -316,19 +317,37 @@ public class MergeHelper { } } - if (hasinit) { - Set set = stat.getNeighboursSet(StatEdge.TYPE_CONTINUE, Statement.DIRECTION_BACKWARD); - set.remove(lastData); + if (!hasinit) { + return; + } - if (!set.isEmpty()) { - return; - } + Exprent initVar = ((AssignmentExprent) initDoExprent).getLeft(); + Exprent incVar; + if (lastDoExprent.type == Exprent.EXPRENT_ASSIGNMENT) { + incVar = ((AssignmentExprent) lastDoExprent).getLeft(); + } else { + incVar = lastDoExprent.getAllExprents().get(0); + } - stat.setLooptype(DoStatement.LOOP_FOR); - stat.setInitExprent(preData.getExprents().remove(preData.getExprents().size() - 1)); - stat.setIncExprent(lastData.getExprents().remove(lastData.getExprents().size() - 1)); + if (!initVar.equals(incVar)) { + return; } + if (!stat.getConditionExprent().containsExprent(initVar)) { + return; + } + + Set set = stat.getNeighboursSet(StatEdge.TYPE_CONTINUE, Statement.DIRECTION_BACKWARD); + set.remove(lastData); + + if (!set.isEmpty()) { + return; + } + + stat.setLooptype(DoStatement.LOOP_FOR); + stat.setInitExprent(preData.getExprents().remove(preData.getExprents().size() - 1)); + stat.setIncExprent(lastData.getExprents().remove(lastData.getExprents().size() - 1)); + if (lastData.getExprents().isEmpty()) { List lst = lastData.getAllSuccessorEdges(); if (!lst.isEmpty()) {