From 68aaf143193201ecf71ced2ae6cd9eca7a0225a1 Mon Sep 17 00:00:00 2001 From: Juuxel Date: Tue, 15 Dec 2020 23:28:05 +0200 Subject: Add interface/enum/annotation icons and modifier displays - Adds icons in the sidebar and structure panel for interfaces, enums and annotations. - Adds some modifiers (final, default, abstract, static) to the structure panel. --- .../cuchaz/enigma/analysis/StructureTreeNode.java | 33 ++++++++++++++++++++++ .../translation/representation/AccessFlags.java | 8 ++++++ 2 files changed, 41 insertions(+) (limited to 'enigma/src/main/java') diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java index f310aa7..ac3a381 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java @@ -4,10 +4,12 @@ import cuchaz.enigma.EnigmaProject; import cuchaz.enigma.api.service.NameProposalService; import cuchaz.enigma.translation.TranslateResult; import cuchaz.enigma.translation.mapping.EntryRemapper; +import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.TypeDescriptor; import cuchaz.enigma.translation.representation.entry.*; import javax.swing.tree.DefaultMutableTreeNode; +import java.util.ArrayList; import java.util.List; public class StructureTreeNode extends DefaultMutableTreeNode { @@ -90,6 +92,37 @@ public class StructureTreeNode extends DefaultMutableTreeNode { return result; } + public String toHtml() { + List modifiers = new ArrayList<>(); + + if (this.entry instanceof DefEntry) { + AccessFlags access = ((DefEntry) this.entry).getAccess(); + boolean isInterfaceMethod = false; + + if (this.entry instanceof MethodEntry && this.entry.getParent() instanceof ClassDefEntry) { + isInterfaceMethod = ((ClassDefEntry) this.entry.getParent()).getAccess().isInterface(); + } + + if (access.isStatic() && !access.isEnum()) { + // Static member, but not an enum constant + modifiers.add("static"); + } else if (isInterfaceMethod && !access.isAbstract()) { + // Non-static default interface method + modifiers.add("default"); + } + + if (access.isAbstract() && !access.isInterface() && !isInterfaceMethod) { + // Abstract, but not an interface or an interface method (they're always abstract) + modifiers.add("abstract"); + } else if (access.isFinal() && !access.isEnum()) { + // Final, but not an enum or an enum constant (they're always final) + modifiers.add("final"); + } + } + + return "" + String.join(" ", modifiers) + " " + toString(); + } + private String parseArgs(List args) { if (args.size() > 0) { String result = "("; diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java index b280eef..e8480a2 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java @@ -51,6 +51,14 @@ public class AccessFlags { return (flags & Opcodes.ACC_INTERFACE) != 0; } + public boolean isAbstract() { + return (flags & Opcodes.ACC_ABSTRACT) != 0; + } + + public boolean isAnnotation() { + return (flags & Opcodes.ACC_ANNOTATION) != 0; + } + public AccessFlags setPrivate() { this.setVisibility(Opcodes.ACC_PRIVATE); return this; -- cgit v1.2.3 From 591453edd88cae642ed18b4e71e35b94db093259 Mon Sep 17 00:00:00 2001 From: Juuxel Date: Sat, 23 Jan 2021 17:23:34 +0200 Subject: Exclude abstract modifier from enum classes --- enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'enigma/src/main/java') diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java b/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java index ac3a381..8782b8f 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/StructureTreeNode.java @@ -111,8 +111,8 @@ public class StructureTreeNode extends DefaultMutableTreeNode { modifiers.add("default"); } - if (access.isAbstract() && !access.isInterface() && !isInterfaceMethod) { - // Abstract, but not an interface or an interface method (they're always abstract) + if (access.isAbstract() && !access.isInterface() && !isInterfaceMethod && !access.isEnum()) { + // Abstract, but not an interface, an interface method or an enum class (abstract is the default or meaningless) modifiers.add("abstract"); } else if (access.isFinal() && !access.isEnum()) { // Final, but not an enum or an enum constant (they're always final) -- cgit v1.2.3