Skip to content

Commit b233472

Browse files
committed
Fix jmpWrapper calls, add if statement support
1 parent cc2a932 commit b233472

File tree

5 files changed

+140
-15
lines changed

5 files changed

+140
-15
lines changed

plugins/kotlin/src/main/java/org/vineflower/kotlin/pass/ReplaceStatsPass.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
import org.jetbrains.java.decompiler.api.plugin.pass.Pass;
44
import org.jetbrains.java.decompiler.api.plugin.pass.PassContext;
5-
import org.jetbrains.java.decompiler.modules.decompiler.stats.DoStatement;
6-
import org.jetbrains.java.decompiler.modules.decompiler.stats.SequenceStatement;
7-
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
8-
import org.jetbrains.java.decompiler.modules.decompiler.stats.SwitchStatement;
5+
import org.jetbrains.java.decompiler.modules.decompiler.stats.*;
96
import org.vineflower.kotlin.stat.KDoStatement;
7+
import org.vineflower.kotlin.stat.KIfStatement;
108
import org.vineflower.kotlin.stat.KSequenceStatement;
119
import org.vineflower.kotlin.stat.KSwitchStatement;
1210

@@ -23,13 +21,16 @@ private static boolean replace(Statement stat) {
2321
Statement st = stat.getStats().get(i);
2422
res |= replace(st);
2523
if (st instanceof SequenceStatement) {
26-
stat.getStats().set(i, new KSequenceStatement((SequenceStatement) st));
24+
st.replaceWith(new KSequenceStatement((SequenceStatement) st));
2725
res = true;
2826
} else if (st instanceof DoStatement) {
29-
stat.getStats().set(i, new KDoStatement((DoStatement) st));
27+
st.replaceWith(new KDoStatement((DoStatement) st));
3028
res = true;
3129
} else if (st instanceof SwitchStatement) {
32-
stat.getStats().set(i, new KSwitchStatement((SwitchStatement) st));
30+
st.replaceWith(new KSwitchStatement((SwitchStatement) st));
31+
res = true;
32+
} else if (st instanceof IfStatement) {
33+
st.replaceWith(new KIfStatement((IfStatement) st));
3334
res = true;
3435
}
3536
}

plugins/kotlin/src/main/java/org/vineflower/kotlin/stat/KDoStatement.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.jetbrains.java.decompiler.util.TextBuffer;
88
import org.vineflower.kotlin.expr.KConstExprent;
99
import org.vineflower.kotlin.expr.KVarExprent;
10+
import org.vineflower.kotlin.util.KExprProcessor;
1011
import org.vineflower.kotlin.util.KUtils;
1112

1213
public class KDoStatement extends DoStatement {
@@ -62,7 +63,7 @@ public TextBuffer toJava(int indent) {
6263
switch (getLooptype()) {
6364
case INFINITE -> {
6465
buf.append("while (true) {").appendLineSeparator();
65-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
66+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
6667
buf.appendIndent(indent).append("}").appendLineSeparator();
6768
}
6869
case DO_WHILE -> {
@@ -72,7 +73,7 @@ public TextBuffer toJava(int indent) {
7273
}
7374

7475
buf.append("do {").appendLineSeparator();
75-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
76+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
7677
buf.appendIndent(indent).append("} while (");
7778
buf.pushNewlineGroup(indent, 1);
7879
buf.appendPossibleNewline();
@@ -94,7 +95,7 @@ public TextBuffer toJava(int indent) {
9495
buf.appendPossibleNewline("", true);
9596
buf.popNewlineGroup();
9697
buf.append(") {").appendLineSeparator();
97-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
98+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
9899
buf.appendIndent(indent).append("}").appendLineSeparator();
99100
}
100101
case FOR_EACH -> {
@@ -109,7 +110,7 @@ public TextBuffer toJava(int indent) {
109110
buf.append("for (").append(init.toJava(indent));
110111
inc.getInferredExprType(null); //TODO: see DoStatement
111112
buf.append(" in ").append(inc.toJava(indent)).append(") {").appendLineSeparator();
112-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
113+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
113114
buf.appendIndent(indent).append("}").appendLineSeparator();
114115
}
115116
case FOR -> {
@@ -195,7 +196,7 @@ public TextBuffer toJava(int indent) {
195196
.appendLineSeparator();
196197
}
197198

198-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
199+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
199200
buf.appendIndent(indent).append("}").appendLineSeparator();
200201
} else {
201202
//TODO other cases
@@ -240,7 +241,7 @@ public TextBuffer toJava(int indent) {
240241
buf.append("if (");
241242
buf.append(condition.toJava(indent + 1));
242243
buf.append(") break").appendLineSeparator();
243-
buf.append(ExprProcessor.jmpWrapper(first, indent + 1, false));
244+
buf.append(KExprProcessor.jmpWrapper(first, indent + 1, false));
244245
buf.appendLineSeparator();
245246
buf.appendIndent(indent + 1).append(inc.toJava(indent + 1)).appendLineSeparator();
246247
buf.appendIndent(indent).append("}").appendLineSeparator();
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.vineflower.kotlin.stat;
2+
3+
import org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor;
4+
import org.jetbrains.java.decompiler.modules.decompiler.StatEdge;
5+
import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent;
6+
import org.jetbrains.java.decompiler.modules.decompiler.stats.IfStatement;
7+
import org.jetbrains.java.decompiler.util.TextBuffer;
8+
import org.jetbrains.java.decompiler.util.TextUtil;
9+
import org.vineflower.kotlin.util.KExprProcessor;
10+
import org.vineflower.kotlin.util.KUtils;
11+
12+
public class KIfStatement extends IfStatement {
13+
public KIfStatement(IfStatement statement) {
14+
super();
15+
16+
setFirst(statement.getFirst());
17+
stats.addAllWithKey(statement.getStats(), statement.getStats().getLstKeys());
18+
parent = statement.getParent();
19+
first = statement.getFirst();
20+
exprents = statement.getExprents();
21+
labelEdges.addAll(statement.getLabelEdges());
22+
varDefinitions.addAll(statement.getVarDefinitions());
23+
post = statement.getPost();
24+
lastBasicType = statement.getLastBasicType();
25+
26+
isMonitorEnter = statement.isMonitorEnter();
27+
containsMonitorExit = statement.containsMonitorExit();
28+
isLastAthrow = statement.containsMonitorExitOrAthrow() && !containsMonitorExit;
29+
30+
continueSet = statement.getContinueSet();
31+
32+
setIfstat(statement.getIfstat());
33+
setElsestat(statement.getElsestat());
34+
setIfEdge(statement.getIfEdge());
35+
setElseEdge(statement.getElseEdge());
36+
setNegated(statement.isNegated());
37+
setPatternMatched(statement.isPatternMatched());
38+
setHasPPMM(statement.hasPPMM());
39+
getHeadexprentList().set(0, statement.getHeadexprent());
40+
}
41+
42+
@Override
43+
public TextBuffer toJava(int indent) {
44+
TextBuffer buf = new TextBuffer();
45+
46+
buf.append(ExprProcessor.listToJava(varDefinitions, indent));
47+
48+
buf.append(first.toJava(indent));
49+
50+
if (isLabeled()) {
51+
buf.appendIndent(indent).append("label").append(id).append("@ ");
52+
}
53+
54+
Exprent condition = getHeadexprent();
55+
buf.appendIndent(indent).append(condition.toJava(indent)).append(" {").appendLineSeparator();
56+
57+
if (getIfstat() == null) {
58+
if (getIfEdge().explicit) {
59+
buf.appendIndent(indent + 1);
60+
if (getIfEdge().getType() == StatEdge.TYPE_BREAK) {
61+
if (getIfEdge().closure instanceof KSequenceStatement) {
62+
buf.append("return");
63+
} else {
64+
buf.append("break");
65+
}
66+
} else {
67+
buf.append("continue");
68+
}
69+
70+
if (getIfEdge().labeled) {
71+
buf.append("@label").append(getIfEdge().closure.id);
72+
} else if (getIfEdge().closure instanceof KSequenceStatement) {
73+
buf.append("@run");
74+
}
75+
76+
buf.appendLineSeparator();
77+
}
78+
} else {
79+
buf.append(KExprProcessor.jmpWrapper(getIfstat(), indent + 1, false));
80+
}
81+
82+
boolean elseIf = false;
83+
84+
if (getElsestat() != null) {
85+
if (getElsestat() instanceof KIfStatement
86+
&& getElsestat().getVarDefinitions().isEmpty()
87+
&& getElsestat().getFirst().getExprents() != null
88+
&& getElsestat().getFirst().getExprents().isEmpty()
89+
&& !getElsestat().isLabeled()
90+
&& (getElsestat().getSuccessorEdges(STATEDGE_DIRECT_ALL).isEmpty()
91+
|| !getElsestat().getSuccessorEdges(STATEDGE_DIRECT_ALL).get(0).explicit)
92+
) {
93+
elseIf = true;
94+
buf.appendIndent(indent).append("} else ");
95+
96+
TextBuffer content = KExprProcessor.jmpWrapper(getElsestat(), indent, false);
97+
content.setStart(TextUtil.getIndentString(indent).length());
98+
buf.append(content);
99+
} else {
100+
TextBuffer content = KExprProcessor.jmpWrapper(getElsestat(), indent + 1, false);
101+
102+
if (content.length() > 0) {
103+
buf.appendIndent(indent).append("} else {").appendLineSeparator();
104+
buf.append(content);
105+
}
106+
}
107+
}
108+
109+
if (!elseIf) {
110+
buf.appendIndent(indent).append("}").appendLineSeparator();
111+
}
112+
113+
return buf;
114+
}
115+
}

plugins/kotlin/src/main/java/org/vineflower/kotlin/stat/KSequenceStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.jetbrains.java.decompiler.modules.decompiler.stats.SequenceStatement;
55
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
66
import org.jetbrains.java.decompiler.util.TextBuffer;
7+
import org.vineflower.kotlin.util.KExprProcessor;
78

89
public class KSequenceStatement extends SequenceStatement {
910
public KSequenceStatement(SequenceStatement statement) {
@@ -44,7 +45,7 @@ public TextBuffer toJava(int indent) {
4445
boolean notEmpty = false;
4546
for (int i = 0; i < stats.size(); i++) {
4647
Statement st = stats.get(i);
47-
TextBuffer str = ExprProcessor.jmpWrapper(st, indent, false);
48+
TextBuffer str = KExprProcessor.jmpWrapper(st, indent, false);
4849

4950
if (i > 0 && !str.containsOnlyWhitespaces() && notEmpty) {
5051
buf.appendLineSeparator();

plugins/kotlin/src/main/java/org/vineflower/kotlin/util/KExprProcessor.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.jetbrains.java.decompiler.modules.decompiler.stats.DummyExitStatement;
66
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
77
import org.jetbrains.java.decompiler.util.TextBuffer;
8+
import org.vineflower.kotlin.stat.KSequenceStatement;
89

910
import java.util.List;
1011

@@ -23,7 +24,11 @@ public static TextBuffer jmpWrapper(Statement stat, int indent, boolean isSwitch
2324
case StatEdge.TYPE_BREAK -> {
2425
ExprProcessor.addDeletedGotoInstructionMapping(stat, buf);
2526
if (!isSwitch || edge.labeled) {
26-
innerBuf.append("break");
27+
if (edge.closure instanceof KSequenceStatement) {
28+
innerBuf.append("return");
29+
} else {
30+
innerBuf.append("break");
31+
}
2732
}
2833
}
2934
case StatEdge.TYPE_CONTINUE -> {
@@ -34,6 +39,8 @@ public static TextBuffer jmpWrapper(Statement stat, int indent, boolean isSwitch
3439

3540
if (edge.labeled) {
3641
innerBuf.append("@label").append(edge.closure.id);
42+
} else if (edge.closure instanceof KSequenceStatement) {
43+
innerBuf.append("@run");
3744
}
3845

3946
if (!innerBuf.containsOnlyWhitespaces()) {

0 commit comments

Comments
 (0)