From 9646a6e8485bc6d6f2cba9f8e84a06b8fb2c8e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 10 Jul 2015 06:15:11 +0200 Subject: [PATCH] Block refactoring - uses same method. Use a bit of line information to put commands on same line when needed. --- .../avm2/model/clauses/ForEachInAVM2Item.java | 9 ++----- .../abc/avm2/model/clauses/ForInAVM2Item.java | 9 ++----- .../abc/avm2/model/clauses/TryAVM2Item.java | 26 ++++-------------- .../action/model/clauses/TryActionItem.java | 27 +++++-------------- .../decompiler/graph/GraphTargetItem.java | 22 +++++++++++++++ .../decompiler/graph/model/DoWhileItem.java | 9 ++----- .../jpexs/decompiler/graph/model/ForItem.java | 9 ++----- .../jpexs/decompiler/graph/model/IfItem.java | 24 ++++------------- .../graph/model/UniversalLoopItem.java | 9 ++----- .../decompiler/graph/model/WhileItem.java | 8 +----- 10 files changed, 49 insertions(+), 103 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java index 7a0dbe3fc..8de0d7685 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java @@ -94,13 +94,8 @@ public class ForEachInAVM2Item extends LoopItem implements Block { } writer.append("("); expression.toString(writer, localData); - writer.append(")").startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append(")"); + appendBlock(expression, writer, localData, commands); if (writer instanceof NulWriter) { LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); labelUsed = loopOjb.used; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java index f8d5019f4..d9735ea66 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java @@ -94,13 +94,8 @@ public class ForInAVM2Item extends LoopItem implements Block { } writer.append("("); expression.toString(writer, localData); - writer.append(")").startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append(")"); + appendBlock(expression, writer, localData, commands); if (writer instanceof NulWriter) { LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); labelUsed = loopOjb.used; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java index 929e3e738..6d7d6b462 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java @@ -76,13 +76,8 @@ public class TryAVM2Item extends AVM2Item implements Block { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("try").startBlock(); - for (GraphTargetItem ti : tryCommands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append("try"); + appendBlock(null, writer, localData, tryCommands); for (int e = 0; e < catchExceptions.size(); e++) { writer.newLine(); writer.append("catch("); @@ -102,24 +97,13 @@ public class TryAVM2Item extends AVM2Item implements Block { writer.append(":"); writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.constantsAvm2, localData.fullyQualifiedNames), HighlightSpecialType.TRY_TYPE, e); writer.append(")"); - writer.startBlock(); List commands = catchCommands.get(e); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + appendBlock(null, writer, localData, commands); } if (finallyCommands.size() > 0) { writer.newLine(); - writer.append("finally").startBlock(); - for (GraphTargetItem ti : finallyCommands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append("finally"); + appendBlock(null, writer, localData, finallyCommands); } return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java index 3241dff9e..25761f4c0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java @@ -68,13 +68,8 @@ public class TryActionItem extends ActionItem implements Block { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("try").startBlock(); - for (GraphTargetItem ti : tryCommands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append("try"); + appendBlock(null, writer, localData, tryCommands); for (int e = 0; e < catchExceptions.size(); e++) { writer.newLine(); writer.append("catch"); @@ -83,24 +78,14 @@ public class TryActionItem extends ActionItem implements Block { } writer.append("("); catchExceptions.get(e).toStringNoQuotes(writer, localData); - writer.append(")").startBlock(); + writer.append(")"); List commands = catchCommands.get(e); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + appendBlock(null, writer, localData, commands); } if (finallyCommands.size() > 0) { writer.newLine(); - writer.append("finally").startBlock(); - for (GraphTargetItem ti : finallyCommands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append("finally"); + appendBlock(null, writer, localData, finallyCommands); } return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java index 349beae41..d2a8d82c3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphTargetItem.java @@ -345,4 +345,26 @@ public abstract class GraphTargetItem implements Serializable, Cloneable { public GraphTargetItem invert(GraphSourceItem src) { return new NotItem(src, this); } + + public GraphTextWriter appendBlock(GraphTargetItem prevLineItem, GraphTextWriter writer, LocalData localData, List commands) throws InterruptedException { + int prevLine = prevLineItem == null ? 0 : prevLineItem.getLine(); + writer.startBlock(); + boolean first = true; + for (GraphTargetItem ti : commands) { + if (!ti.isEmpty()) { + //Use stored line information if available to place commands on same line + if (!first && (ti.getLine() < 1 || prevLine < 1 || (prevLine >= 1 && prevLine != ti.getLine()))) { + writer.newLine(); + } + prevLine = ti.getLine(); + first = false; + ti.toStringSemicoloned(writer, localData); + } + } + if (!first) { + writer.newLine(); + } + writer.endBlock(); + return writer; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java index 4a4fe79ce..cf74aac39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/DoWhileItem.java @@ -67,13 +67,8 @@ public class DoWhileItem extends LoopItem implements Block { writer.append("loop").append(loop.id).append(":").newLine(); } writer.append("do"); - writer.startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock().newLine(); + appendBlock(null, writer, localData, commands); + writer.newLine(); writer.append("while"); if (writer.getFormatting().spaceBeforeParenthesesWhileParentheses) { writer.append(" "); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java index e29fc752d..ff5fe8487 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/ForItem.java @@ -104,13 +104,8 @@ public class ForItem extends LoopItem implements Block { finalCommands.get(i).toString(writer, localData); p++; } - writer.append(")").startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append(")"); + appendBlock(expression, writer, localData, commands); if (writer instanceof NulWriter) { LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); labelUsed = loopOjb.used; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java index 43f9f7caf..bf6475078 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/IfItem.java @@ -86,13 +86,8 @@ public class IfItem extends GraphTargetItem implements Block { } writer.append("("); expr.toString(writer, localData); - writer.append(")").startBlock(); - for (GraphTargetItem ti : ifBranch) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append(")"); + appendBlock(expr, writer, localData, ifBranch); if (elseBranch.size() > 0) { boolean elseIf = elseBranch.size() == 1 && (elseBranch.get(0) instanceof IfItem); if (writer.getFormatting().beginBlockOnNewLine) { @@ -102,21 +97,12 @@ public class IfItem extends GraphTargetItem implements Block { } writer.append("else"); if (!elseIf) { - writer.startBlock(); + appendBlock(expr, writer, localData, elseBranch); } else { writer.append(" "); + elseBranch.get(0).toStringSemicoloned(writer, localData); } - for (GraphTargetItem ti : elseBranch) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData); - if (!elseIf) { - writer.newLine(); - } - } - } - if (!elseIf) { - writer.endBlock(); - } + } return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java index 6773c4d02..aff3609f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java @@ -58,13 +58,8 @@ public class UniversalLoopItem extends LoopItem implements Block { if (writer.getFormatting().spaceBeforeParenthesesWhileParentheses) { writer.append(" "); } - writer.append("(true)").startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + writer.append("(true)"); + appendBlock(null, writer, localData, commands); if (writer instanceof NulWriter) { LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); labelUsed = loopOjb.used; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java index 109ab9156..0024d0024 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/WhileItem.java @@ -76,13 +76,7 @@ public class WhileItem extends LoopItem implements Block { expression.get(i).toString(writer, localData); } writer.append(")"); - writer.startBlock(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.endBlock(); + appendBlock(expression.get(expression.size() - 1), writer, localData, commands); if (writer instanceof NulWriter) { LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); labelUsed = loopOjb.used;