From 7a34b8e85ab90e559b99493689eab436a72856f2 Mon Sep 17 00:00:00 2001 From: Graham Date: Sun, 5 Jul 2020 19:37:57 +0100 Subject: [PATCH] Add variable declaration support to iterateExprents --- .../decompiler/sforms/DirectGraph.java | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java b/src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java index aa2fae8..7a6bc75 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java @@ -2,13 +2,14 @@ package org.jetbrains.java.decompiler.modules.decompiler.sforms; import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; +import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent; import org.jetbrains.java.decompiler.modules.decompiler.sforms.FlattenStatementsHelper.FinallyPathWrapper; +import org.jetbrains.java.decompiler.modules.decompiler.stats.CatchAllStatement; +import org.jetbrains.java.decompiler.modules.decompiler.stats.CatchStatement; +import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement; import org.jetbrains.java.decompiler.util.VBStyleCollection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; +import java.util.*; public class DirectGraph { @@ -77,8 +78,11 @@ public class DirectGraph { } } - public boolean iterateExprents(ExprentIterator iter) { + return iterateExprents(iter, false); + } + + public boolean iterateExprents(ExprentIterator iter, boolean decls) { LinkedList stack = new LinkedList<>(); stack.add(first); @@ -94,6 +98,42 @@ public class DirectGraph { } setVisited.add(node); + if (decls) { + for (Iterator it = node.statement.getVarDefinitions().iterator(); it.hasNext(); ) { + int res = iter.processExprent(it.next()); + + if (res == 1) { + return false; + } + + if (res == 2) { + it.remove(); + } + } + + List vars = Collections.emptyList(); + if (node.statement.type == Statement.TYPE_TRYCATCH) { + vars = ((CatchStatement) node.statement).getVars(); + } else if (node.statement.type == Statement.TYPE_CATCHALL) { + CatchAllStatement stmt = (CatchAllStatement) node.statement; + if (!stmt.isFinally()) { + vars = stmt.getVars(); + } + } + + for (Iterator it = vars.iterator(); it.hasNext(); ) { + int res = iter.processExprent(it.next()); + + if (res == 1) { + return false; + } + + if (res == 2) { + it.remove(); + } + } + } + for (int i = 0; i < node.exprents.size(); i++) { int res = iter.processExprent(node.exprents.get(i));