From 2eb7d2b83a397d4d276c882107fc50ddd7ce866a Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 16 Sep 2021 14:35:13 +0100 Subject: Improve record class detection (#428) Also generate a method mapping for the record entry, does not support the case of the method having a diffrent name from the field. If there is a component this is remapped via the field mapping.--- enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java | 6 ++++-- enigma/src/main/java/cuchaz/enigma/source/cfr/EnigmaDumper.java | 2 +- .../java/cuchaz/enigma/translation/mapping/EntryRemapper.java | 9 +++++---- .../cuchaz/enigma/translation/representation/AccessFlags.java | 4 ---- .../enigma/translation/representation/entry/ClassDefEntry.java | 4 ++++ 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java index 28b4043e..3b8ecbc5 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/util/GuiUtil.java @@ -20,6 +20,7 @@ import javax.swing.tree.TreePath; import com.formdev.flatlaf.extras.FlatSVGIcon; import com.google.common.collect.Lists; +import cuchaz.enigma.analysis.index.EntryIndex; import cuchaz.enigma.gui.Gui; import cuchaz.enigma.translation.representation.AccessFlags; import cuchaz.enigma.translation.representation.entry.ClassEntry; @@ -119,7 +120,8 @@ public class GuiUtil { } public static Icon getClassIcon(Gui gui, ClassEntry entry) { - AccessFlags access = gui.getController().project.getJarIndex().getEntryIndex().getClassAccess(entry); + EntryIndex entryIndex = gui.getController().project.getJarIndex().getEntryIndex(); + AccessFlags access = entryIndex.getClassAccess(entry); if (access != null) { if (access.isAnnotation()) { @@ -128,7 +130,7 @@ public class GuiUtil { return INTERFACE_ICON; } else if (access.isEnum()) { return ENUM_ICON; - } else if (access.isRecord()) { + } else if (entryIndex.getDefinition(entry).isRecord()) { return RECORD_ICON; } } diff --git a/enigma/src/main/java/cuchaz/enigma/source/cfr/EnigmaDumper.java b/enigma/src/main/java/cuchaz/enigma/source/cfr/EnigmaDumper.java index 4e8940ad..14fd1684 100644 --- a/enigma/src/main/java/cuchaz/enigma/source/cfr/EnigmaDumper.java +++ b/enigma/src/main/java/cuchaz/enigma/source/cfr/EnigmaDumper.java @@ -150,7 +150,7 @@ public class EnigmaDumper extends StringStreamDumper { String javaDoc = mapping.javadoc(); if (javaDoc != null) { - recordComponentDocs.add(String.format("@param %s %s", field.getFieldName(), javaDoc)); + recordComponentDocs.add(String.format("@param %s %s", mapping.targetName(), javaDoc)); } } } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java index 0977b742..0268834d 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/EntryRemapper.java @@ -88,9 +88,9 @@ public class EntryRemapper { } } - // A little bit of a hack to also map the getter method for record fields/components. + // A little bit of a hack to also map the getter method for record fields. private void mapRecordComponentGetter(ValidationContext vc, ClassEntry classEntry, FieldEntry fieldEntry, EntryMapping fieldMapping) { - if (!jarIndex.getEntryIndex().getClassAccess(classEntry).isRecord() || jarIndex.getEntryIndex().getFieldAccess(fieldEntry).isStatic()) { + if (!jarIndex.getEntryIndex().getDefinition(classEntry).isRecord() || jarIndex.getEntryIndex().getFieldAccess(fieldEntry).isStatic()) { return; } @@ -102,7 +102,7 @@ public class EntryRemapper { MethodEntry methodEntry = null; for (MethodEntry method : classMethods) { - // Find the matching record component getter via matching the names. My understanding is this is safe, failing this it may need to be a bit more intelligent + // Find the matching record component getter via matching the names. TODO: Support when the record field and method names do not match if (method.getName().equals(fieldEntry.getName()) && method.getDesc().toString().equals("()" + fieldEntry.getDesc())) { methodEntry = method; break; @@ -114,7 +114,8 @@ public class EntryRemapper { return; } - putMapping(vc, methodEntry, fieldMapping != null ? new EntryMapping(fieldMapping.targetName()) : null); + // Also remap the associated method, without the javadoc. + doPutMapping(vc, methodEntry, new EntryMapping(fieldMapping.targetName()), false); } @Nonnull 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 21e6ef4e..e8480a26 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/AccessFlags.java @@ -39,10 +39,6 @@ public class AccessFlags { return (flags & Opcodes.ACC_ENUM) != 0; } - public boolean isRecord() { - return (flags & Opcodes.ACC_RECORD) != 0; - } - public boolean isBridge() { return (flags & Opcodes.ACC_BRIDGE) != 0; } diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java index 237c93dc..ab5a422f 100644 --- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java +++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassDefEntry.java @@ -75,6 +75,10 @@ public class ClassDefEntry extends ClassEntry implements DefEntry { return interfaces; } + public boolean isRecord() { + return superClass.getName().equals("java/lang/Record"); + } + @Override public TranslateResult extendedTranslate(Translator translator, @Nonnull EntryMapping mapping) { Signature translatedSignature = translator.translate(signature); -- cgit v1.2.3