Skip to content

Commit b210894

Browse files
committed
Anonymous object hack
1 parent 56c497c commit b210894

File tree

3 files changed

+418
-357
lines changed

3 files changed

+418
-357
lines changed

plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KNewExprent.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@ public int getPrecedence() {
4747
@Override
4848
public TextBuffer toJava(int indent) {
4949
ClassesProcessor.ClassNode node = DecompilerContext.getClassProcessor().getMapRootClasses().get(getNewType().value);
50+
if (node != null && new KotlinChooser().isLanguage(node.classStruct)) {
51+
KotlinMetadata ktData = node.classStruct.getAttribute(KotlinMetadata.KEY);
52+
if (ktData.metadata instanceof KotlinMetadata.FunctionReference) {
53+
Exprent receiver = getConstructor().getLstParameters().get(0);
54+
TextBuffer buf = KotlinWriter.stringifyReference(indent, node, bytecode, receiver);
55+
if (buf != null) {
56+
return buf;
57+
}
58+
}
59+
60+
if (node.type == ClassesProcessor.ClassNode.Type.LOCAL && ktData.metadata instanceof KotlinMetadata.Class) {
61+
// Work around the Java-targeted anonymous class verification
62+
node.type = ClassesProcessor.ClassNode.Type.ANONYMOUS;
63+
TextBuffer buf = new TextBuffer();
64+
buf.addBytecodeMapping(bytecode);
65+
new KotlinWriter().writeClass(node, buf, indent);
66+
return buf;
67+
}
68+
}
69+
5070
if (isLambda()) {
5171
MethodWrapper outerWrapper = DecompilerContext.getContextProperty(DecompilerContext.CURRENT_METHOD_WRAPPER);
5272
try {
@@ -148,19 +168,9 @@ public TextBuffer toJava(int indent) {
148168
}
149169
} else if (isAnonymous()) {
150170
TextBuffer buf = new TextBuffer();
171+
buf.addBytecodeMapping(bytecode);
151172
new KotlinWriter().writeClass(node, buf, indent);
152173
return buf;
153-
} else if (node != null && new KotlinChooser().isLanguage(node.classStruct)) {
154-
KotlinMetadata ktData = node.classStruct.getAttribute(KotlinMetadata.KEY);
155-
if (!(ktData.metadata instanceof KotlinMetadata.FunctionReference)) {
156-
return super.toJava(indent);
157-
}
158-
159-
Exprent receiver = getConstructor().getLstParameters().get(0);
160-
TextBuffer buf = KotlinWriter.stringifyReference(indent, node, bytecode, receiver);
161-
if (buf != null) {
162-
return buf;
163-
}
164174
}
165175

166176
return super.toJava(indent);

0 commit comments

Comments
 (0)