Skip to content

Commit c0ca89a

Browse files
committed
Refactor struct attributes, optimize attribute construction
1 parent 793b687 commit c0ca89a

File tree

15 files changed

+88
-86
lines changed

15 files changed

+88
-86
lines changed

plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinChooser.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.jetbrains.java.decompiler.util.Key;
1717
import org.vineflower.kotlin.metadata.BitEncoding;
1818
import org.vineflower.kotlin.metadata.MetadataNameResolver;
19-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
19+
import org.vineflower.kotlin.metadata.KotlinMetadata;
2020

2121
import java.io.ByteArrayInputStream;
2222

@@ -54,7 +54,7 @@ public boolean isLanguage(StructClass cl) {
5454
}
5555

5656
public static void parseMetadataFor(StructClass cl) {
57-
if (cl.getAttribute(StructKotlinMetadataAttribute.KEY) != null) {
57+
if (cl.getAttribute(KotlinMetadata.KEY) != null) {
5858
return;
5959
}
6060

@@ -111,24 +111,24 @@ public static void parseMetadataFor(StructClass cl) {
111111
resolver = null;
112112
}
113113

114-
StructKotlinMetadataAttribute.Metadata metadata;
114+
KotlinMetadata.Metadata metadata;
115115
if (k == 1) { // Class file
116116
ProtoBuf.Class pcl = ProtoBuf.Class.parseFrom(input, EXTENSIONS);
117-
metadata = new StructKotlinMetadataAttribute.Class(cl, pcl);
117+
metadata = new KotlinMetadata.Class(cl, pcl);
118118
} else if (k == 2) { // File facade
119119
ProtoBuf.Package pcl = ProtoBuf.Package.parseFrom(input, EXTENSIONS);
120-
metadata = new StructKotlinMetadataAttribute.File(cl, pcl);
120+
metadata = new KotlinMetadata.File(cl, pcl);
121121
} else if (k == 3) { // Synthetic class
122122
ProtoBuf.Function func = ProtoBuf.Function.parseFrom(input, EXTENSIONS);
123-
metadata = new StructKotlinMetadataAttribute.SyntheticClass(cl, func);
123+
metadata = new KotlinMetadata.SyntheticClass(cl, func);
124124
} else if (k == 5) { // Multi-file facade
125125
ProtoBuf.Package pcl = ProtoBuf.Package.parseFrom(input, EXTENSIONS);
126-
metadata = new StructKotlinMetadataAttribute.MultifileClass(cl, pcl);
126+
metadata = new KotlinMetadata.MultifileClass(cl, pcl);
127127
} else {
128128
return;
129129
}
130130

131-
cl.getAttributes().put(StructKotlinMetadataAttribute.KEY.name, new StructKotlinMetadataAttribute(metadata, resolver));
131+
cl.getAttributes().put(KotlinMetadata.KEY, new KotlinMetadata(metadata, resolver));
132132
} catch (Exception e) {
133133
DecompilerContext.getLogger().writeMessage("Failed to parse metadata for class " + cl.qualifiedName, IFernflowerLogger.Severity.WARN, e);
134134
}

plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinPlugin.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.vineflower.kotlin;
22

33
import org.jetbrains.annotations.Nullable;
4-
import org.jetbrains.java.decompiler.api.ClassAttributeRegistry;
54
import org.jetbrains.java.decompiler.api.plugin.Plugin;
65
import org.jetbrains.java.decompiler.api.plugin.LanguageSpec;
76
import org.jetbrains.java.decompiler.api.plugin.PluginOptions;
@@ -12,7 +11,6 @@
1211
import org.jetbrains.java.decompiler.modules.decompiler.*;
1312
import org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper;
1413
import org.jetbrains.java.decompiler.util.Pair;
15-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
1614
import org.vineflower.kotlin.pass.*;
1715

1816
public class KotlinPlugin implements Plugin {

plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinWriter.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.jetbrains.java.decompiler.util.TextUtil;
4040
import org.jetbrains.java.decompiler.util.collections.VBStyleCollection;
4141
import org.vineflower.kotlin.expr.KAnnotationExprent;
42-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
42+
import org.vineflower.kotlin.metadata.KotlinMetadata;
4343
import org.vineflower.kotlin.struct.*;
4444
import org.vineflower.kotlin.util.KTypes;
4545
import org.vineflower.kotlin.util.KUtils;
@@ -154,8 +154,8 @@ private boolean invokeProcessors(TextBuffer buffer, ClassNode node) {
154154
}
155155

156156
public void writeClassHeader(StructClass cl, TextBuffer buffer, ImportCollector importCollector) {
157-
StructKotlinMetadataAttribute ktData = cl.getAttribute(StructKotlinMetadataAttribute.KEY);
158-
if (ktData != null && ktData.metadata instanceof StructKotlinMetadataAttribute.File) {
157+
KotlinMetadata ktData = cl.getAttribute(KotlinMetadata.KEY);
158+
if (ktData != null && ktData.metadata instanceof KotlinMetadata.File) {
159159
for (Key<?> key : ANNOTATION_ATTRIBUTES) {
160160
StructAnnotationAttribute attr = cl.getAttribute((Key<StructAnnotationAttribute>) key);
161161
if (attr != null) {
@@ -187,7 +187,7 @@ public void writeClassHeader(StructClass cl, TextBuffer buffer, ImportCollector
187187
KotlinImportCollector kotlinImportCollector = new KotlinImportCollector(importCollector);
188188
kotlinImportCollector.writeImports(buffer, true);
189189

190-
if (ktData != null && ktData.metadata instanceof StructKotlinMetadataAttribute.Class cls) {
190+
if (ktData != null && ktData.metadata instanceof KotlinMetadata.Class cls) {
191191
if (cls.proto().getTypeAliasCount() > 0) {
192192
List<ProtoBuf.TypeAlias> typeAliases = cls.proto().getTypeAliasList();
193193
for (ProtoBuf.TypeAlias typeAlias : typeAliases) {
@@ -221,15 +221,15 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
221221
ConstantPool pool = cl.getPool();
222222

223223
KotlinChooser.parseMetadataFor(cl);
224-
StructKotlinMetadataAttribute ktData = cl.getAttribute(StructKotlinMetadataAttribute.KEY);
224+
KotlinMetadata ktData = cl.getAttribute(KotlinMetadata.KEY);
225225

226226
DecompilerContext.getLogger().startWriteClass(cl.qualifiedName);
227227

228228
int kotlinFlags;
229229
if (ktData == null) {
230230
appendComment(buffer, "Class flags could not be determined", indent);
231231
kotlinFlags = 0;
232-
} else if (ktData.metadata instanceof StructKotlinMetadataAttribute.Class cls) {
232+
} else if (ktData.metadata instanceof KotlinMetadata.Class cls) {
233233
kotlinFlags = cls.proto().getFlags();
234234
} else {
235235
kotlinFlags = 0;
@@ -255,13 +255,13 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
255255
return;
256256
}
257257

258-
if (ktData != null && ktData.metadata instanceof StructKotlinMetadataAttribute.File) {
258+
if (ktData != null && ktData.metadata instanceof KotlinMetadata.File) {
259259
writeKotlinFile(node, buffer, indent, ktData);
260260
return;
261261
}
262262

263263
Optional<ClassNode> companion;
264-
if (ktData != null && ktData.metadata instanceof StructKotlinMetadataAttribute.Class cls && cls.proto().hasCompanionObjectName()) {
264+
if (ktData != null && ktData.metadata instanceof KotlinMetadata.Class cls && cls.proto().hasCompanionObjectName()) {
265265
String name = ktData.nameResolver.resolve(cls.proto().getCompanionObjectName());
266266
companion = node.nested.stream()
267267
.filter(n -> n.simpleName.equals(name))
@@ -309,7 +309,7 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
309309
ClassNode companionNode = companion.get();
310310
KotlinChooser.parseMetadataFor(companionNode.classStruct);
311311

312-
StructKotlinMetadataAttribute companionKtData = companionNode.classStruct.getAttribute(StructKotlinMetadataAttribute.KEY);
312+
KotlinMetadata companionKtData = companionNode.classStruct.getAttribute(KotlinMetadata.KEY);
313313
if (companionKtData != null) {
314314
if (companionKtData.getProperties() != null) {
315315
fieldsToIgnore.addAll(companionKtData.getProperties().associatedFields());
@@ -504,7 +504,7 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
504504
}
505505
}
506506

507-
private void writeKotlinFile(ClassNode node, TextBuffer buffer, int indent, StructKotlinMetadataAttribute ktData) {
507+
private void writeKotlinFile(ClassNode node, TextBuffer buffer, int indent, KotlinMetadata ktData) {
508508
ClassWrapper wrapper = node.getWrapper();
509509
StructClass cl = wrapper.getClassStruct();
510510

@@ -547,7 +547,7 @@ private void writeKotlinFile(ClassNode node, TextBuffer buffer, int indent, Stru
547547
}
548548

549549
Set<StructField> fieldsToSkip = Optional.ofNullable(ktData)
550-
.map(StructKotlinMetadataAttribute::getProperties)
550+
.map(KotlinMetadata::getProperties)
551551
.map(KProperty.Data::associatedFields)
552552
.orElse(Set.of());
553553

@@ -600,7 +600,7 @@ private void writeKotlinFile(ClassNode node, TextBuffer buffer, int indent, Stru
600600
}
601601

602602
//TODO update this to use Kotlin's metadata
603-
private void writeAnnotationDefinition(ClassNode node, TextBuffer buffer, int indent, StructKotlinMetadataAttribute ktData) {
603+
private void writeAnnotationDefinition(ClassNode node, TextBuffer buffer, int indent, KotlinMetadata ktData) {
604604
ClassWrapper wrapper = node.getWrapper();
605605
StructClass cl = wrapper.getClassStruct();
606606

@@ -724,7 +724,7 @@ private void writeAnnotationDefinition(ClassNode node, TextBuffer buffer, int in
724724
buffer.appendLineSeparator();
725725
}
726726

727-
private void writeClassDefinition(ClassNode node, TextBuffer buffer, int indent, StructKotlinMetadataAttribute ktData, int kotlinFlags) {
727+
private void writeClassDefinition(ClassNode node, TextBuffer buffer, int indent, KotlinMetadata ktData, int kotlinFlags) {
728728
if (node.type == ClassNode.Type.ANONYMOUS) {
729729
buffer.append(" {").appendLineSeparator();
730730
return;
@@ -827,7 +827,7 @@ private void writeClassDefinition(ClassNode node, TextBuffer buffer, int indent,
827827

828828
boolean appendedColon = false;
829829
boolean wroteSupertype = Optional.ofNullable(ktData)
830-
.map(StructKotlinMetadataAttribute::getConstructors)
830+
.map(KotlinMetadata::getConstructors)
831831
.map(KConstructor.Data::primary)
832832
.map(constructor -> constructor.writePrimaryConstructor(wrapper, buffer, indent))
833833
.orElse(false);
@@ -902,8 +902,8 @@ public void writeField(ClassWrapper wrapper, StructClass cl, StructField fd, Tex
902902
}
903903
appendAnnotations(buffer, indent, fd, TypeAnnotation.FIELD);
904904

905-
StructKotlinMetadataAttribute classData = cl.getAttribute(StructKotlinMetadataAttribute.KEY);
906-
boolean isInFile = classData != null && classData.metadata instanceof StructKotlinMetadataAttribute.File;
905+
KotlinMetadata classData = cl.getAttribute(KotlinMetadata.KEY);
906+
boolean isInFile = classData != null && classData.metadata instanceof KotlinMetadata.File;
907907
appendJvmAnnotations(buffer, indent, fd, isInterface, isInFile, cl.getPool(), TypeAnnotation.FIELD);
908908

909909
buffer.appendIndent(indent);
@@ -1062,8 +1062,8 @@ public boolean writeMethod(ClassNode node, StructMethod mt, int methodIndex, Tex
10621062

10631063
appendAnnotations(buffer, indent, mt, TypeAnnotation.METHOD_RETURN_TYPE);
10641064

1065-
StructKotlinMetadataAttribute classData = node.classStruct.getAttribute(StructKotlinMetadataAttribute.KEY);
1066-
boolean isInFile = classData != null && classData.metadata instanceof StructKotlinMetadataAttribute.File;
1065+
KotlinMetadata classData = node.classStruct.getAttribute(KotlinMetadata.KEY);
1066+
boolean isInFile = classData != null && classData.metadata instanceof KotlinMetadata.File;
10671067
appendJvmAnnotations(buffer, indent, mt, isInterface, isInFile, cl.getPool(), TypeAnnotation.METHOD_RETURN_TYPE);
10681068

10691069
buffer.appendIndent(indent);

plugins/kotlin/src/main/java/org/vineflower/kotlin/metadata/StructKotlinMetadataAttribute.java renamed to plugins/kotlin/src/main/java/org/vineflower/kotlin/metadata/KotlinMetadata.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.jetbrains.annotations.Nullable;
55
import org.jetbrains.java.decompiler.struct.StructClass;
66
import org.jetbrains.java.decompiler.struct.StructMethod;
7-
import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute;
87
import org.jetbrains.java.decompiler.util.Key;
98
import org.vineflower.kt.metadata.ProtoBuf;
109
import org.vineflower.kotlin.struct.KConstructor;
@@ -14,7 +13,7 @@
1413
import java.util.List;
1514
import java.util.Map;
1615

17-
public class StructKotlinMetadataAttribute extends StructGeneralAttribute {
16+
public class KotlinMetadata {
1817
public sealed interface Metadata {
1918
@NotNull StructClass classStruct();
2019
}
@@ -31,7 +30,7 @@ public record MultifileClass(@NotNull StructClass classStruct, @NotNull ProtoBuf
3130
private Map<StructMethod, KFunction> functions;
3231
private KConstructor.Data constructorData;
3332

34-
public StructKotlinMetadataAttribute(@NotNull Metadata metadata, @Nullable MetadataNameResolver nameResolver) {
33+
public KotlinMetadata(@NotNull Metadata metadata, @Nullable MetadataNameResolver nameResolver) {
3534
this.metadata = metadata;
3635
this.nameResolver = nameResolver;
3736
}
@@ -97,5 +96,5 @@ public StructKotlinMetadataAttribute(@NotNull Metadata metadata, @Nullable Metad
9796
return constructorData;
9897
}
9998

100-
public static final Key<StructKotlinMetadataAttribute> KEY = Key.of("kotlin-metadata-attribute");
99+
public static final Key<KotlinMetadata> KEY = Key.of("kotlin-metadata-attribute");
101100
}

plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KContract.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
import org.jetbrains.java.decompiler.main.DecompilerContext;
88
import org.jetbrains.java.decompiler.util.TextBuffer;
99
import org.vineflower.kotlin.KotlinWriter;
10-
import org.vineflower.kotlin.metadata.MetadataNameResolver;
11-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
10+
import org.vineflower.kotlin.metadata.KotlinMetadata;
1211

1312
import java.util.List;
1413
import java.util.stream.Collectors;
@@ -22,7 +21,7 @@ private KContract(@NotNull List<KEffect> effects) {
2221
this.effects = effects;
2322
}
2423

25-
public static KContract from(ProtoBuf.Contract proto, List<KParameter> params, StructKotlinMetadataAttribute ktData) {
24+
public static KContract from(ProtoBuf.Contract proto, List<KParameter> params, KotlinMetadata ktData) {
2625
return new KContract(proto.getEffectList().stream().map(it -> KEffect.from(it, params, ktData)).collect(Collectors.toList()));
2726
}
2827

@@ -57,7 +56,7 @@ private KEffect(
5756
this.kind = kind;
5857
}
5958

60-
static KEffect from(ProtoBuf.Effect proto, List<KParameter> params, StructKotlinMetadataAttribute ktData) {
59+
static KEffect from(ProtoBuf.Effect proto, List<KParameter> params, KotlinMetadata ktData) {
6160
ProtoBuf.Effect.EffectType type = proto.hasEffectType() ? proto.getEffectType() : null;
6261
List<KExpression> expressions = proto.getEffectConstructorArgumentList().stream().map(it -> KExpression.from(it, params, ktData)).collect(Collectors.toList());
6362
KExpression conditionalConclusion = proto.hasConclusionOfConditionalEffect() ? KExpression.from(proto.getConclusionOfConditionalEffect(), params, ktData) : null;
@@ -121,7 +120,7 @@ public record KExpression(
121120
// Placeholder type for receiver type
122121
private static final KParameter THIS_TYPE = new KParameter(0, "this", KType.NOTHING, null, 0);
123122

124-
static KExpression from(ProtoBuf.Expression proto, List<KParameter> params, StructKotlinMetadataAttribute ktData) {
123+
static KExpression from(ProtoBuf.Expression proto, List<KParameter> params, KotlinMetadata ktData) {
125124
int flags = proto.getFlags();
126125
KParameter valueParameterReference = null;
127126
if (proto.hasValueParameterReference()) {

plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KFunction.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.vineflower.kotlin.KotlinOptions;
2121
import org.vineflower.kotlin.KotlinWriter;
2222
import org.vineflower.kotlin.metadata.MetadataNameResolver;
23-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
23+
import org.vineflower.kotlin.metadata.KotlinMetadata;
2424
import org.vineflower.kotlin.util.KUtils;
2525

2626
import java.util.HashMap;
@@ -44,7 +44,7 @@ public record KFunction(
4444
StructClass classStruct,
4545
StructMethod methodStruct
4646
) implements Flags {
47-
public static @NotNull Map<StructMethod, KFunction> parse(StructClass classStruct, StructKotlinMetadataAttribute ktData, @NotNull MetadataNameResolver resolver, List<ProtoBuf.Function> protoFunctions) {
47+
public static @NotNull Map<StructMethod, KFunction> parse(StructClass classStruct, KotlinMetadata ktData, @NotNull MetadataNameResolver resolver, List<ProtoBuf.Function> protoFunctions) {
4848
Map<StructMethod, KFunction> functions = new HashMap<>(protoFunctions.size(), 1f);
4949

5050
for (ProtoBuf.Function function : protoFunctions) {
@@ -169,8 +169,8 @@ public record KFunction(
169169
public TextBuffer stringify(ClassWrapper wrapper, int indent) {
170170
TextBuffer buf = new TextBuffer();
171171
KotlinWriter.appendAnnotations(buf, indent, methodStruct, TypeAnnotation.METHOD_RETURN_TYPE);
172-
StructKotlinMetadataAttribute classData = classStruct.getAttribute(StructKotlinMetadataAttribute.KEY);
173-
boolean isInFile = classData != null && classData.metadata instanceof StructKotlinMetadataAttribute.File;
172+
KotlinMetadata classData = classStruct.getAttribute(KotlinMetadata.KEY);
173+
boolean isInFile = classData != null && classData.metadata instanceof KotlinMetadata.File;
174174
KotlinWriter.appendJvmAnnotations(buf, indent, methodStruct, false, isInFile, classStruct.getPool(), TypeAnnotation.METHOD_RETURN_TYPE);
175175

176176
String methodKey = InterpreterUtil.makeUniqueKey(methodStruct.getName(), methodStruct.getDescriptor());

plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KType.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.jetbrains.java.decompiler.struct.gen.VarType;
77
import org.jetbrains.java.decompiler.util.TextBuffer;
88
import org.vineflower.kotlin.metadata.MetadataNameResolver;
9-
import org.vineflower.kotlin.metadata.StructKotlinMetadataAttribute;
9+
import org.vineflower.kotlin.metadata.KotlinMetadata;
1010
import org.vineflower.kotlin.util.KTypes;
1111

1212
import java.util.Objects;
@@ -80,15 +80,15 @@ public static KType from(ProtoBuf.Type type, MetadataNameResolver nameResolver)
8080
return new KType(varType, kotlinType, isNullable, typeArguments, typeParameterName, typeAliasName);
8181
}
8282

83-
public static KType from(int tableIndex, StructKotlinMetadataAttribute ktData) {
83+
public static KType from(int tableIndex, KotlinMetadata ktData) {
8484
ProtoBuf.TypeTable table;
85-
if (ktData.metadata instanceof StructKotlinMetadataAttribute.Class cls) {
85+
if (ktData.metadata instanceof KotlinMetadata.Class cls) {
8686
table = cls.proto().getTypeTable();
87-
} else if (ktData.metadata instanceof StructKotlinMetadataAttribute.SyntheticClass cls) {
87+
} else if (ktData.metadata instanceof KotlinMetadata.SyntheticClass cls) {
8888
table = cls.proto().getTypeTable();
89-
} else if (ktData.metadata instanceof StructKotlinMetadataAttribute.File cls) {
89+
} else if (ktData.metadata instanceof KotlinMetadata.File cls) {
9090
table = cls.proto().getTypeTable();
91-
} else if (ktData.metadata instanceof StructKotlinMetadataAttribute.MultifileClass cls) {
91+
} else if (ktData.metadata instanceof KotlinMetadata.MultifileClass cls) {
9292
table = cls.proto().getTypeTable();
9393
} else {
9494
throw new IllegalStateException("Impossible metadata value");

src/org/jetbrains/java/decompiler/api/ClassAttributeRegistry.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jetbrains.java.decompiler.api;
22

3+
import org.jetbrains.annotations.Nullable;
34
import org.jetbrains.java.decompiler.util.Key;
45
import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute;
56

@@ -14,8 +15,8 @@ public static <T extends StructGeneralAttribute> void register(Key<T> key, Suppl
1415
REGISTRY.put(key, supplier);
1516
}
1617

17-
public static <T extends StructGeneralAttribute> T get(Key<T> key) {
18-
return (T) REGISTRY.get(key).get();
18+
public static <T extends StructGeneralAttribute> @Nullable Supplier<T> get(Key<T> key) {
19+
return (Supplier<T>) REGISTRY.get(key);
1920
}
2021

2122
public static Map<Key<? extends StructGeneralAttribute>, Supplier<? extends StructGeneralAttribute>> getRegistry() {

0 commit comments

Comments
 (0)