From eebd7e1d65c67c3c32a4510240ea1378a591b3f6 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Tue, 24 Sep 2024 22:20:27 -0500 Subject: [PATCH 01/11] start disaster --- .../SimpleTypeSingleIndex.java | 6 +++ .../proposal/CodecNameProposer.java | 6 ++- .../proposal/ConstantFieldNameProposer.java | 6 ++- .../ConstructorParamsNameProposer.java | 14 ++++--- .../DelegateParametersNameProposer.java | 11 ++--- .../proposal/EqualsNameProposer.java | 6 ++- .../proposal/GetterSetterNameProposer.java | 14 ++++--- .../proposal/LoggerNameProposer.java | 6 ++- .../proposal/MojangNameProposer.java | 8 ++-- .../enigma_plugin/proposal/NameProposer.java | 29 +++++++++---- .../proposal/NameProposerService.java | 26 +++++++----- .../proposal/RecordComponentNameProposer.java | 6 ++- .../proposal/SimpleTypeFieldNameProposer.java | 42 ++++++++++++++++++- .../enigma_plugin/NameProposalTest.java | 17 ++++++++ .../resources/simple_type_field_names.json5 | 8 ++++ 15 files changed, 155 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/index/simple_type_single/SimpleTypeSingleIndex.java b/src/main/java/org/quiltmc/enigma_plugin/index/simple_type_single/SimpleTypeSingleIndex.java index 6df759c..880350a 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/index/simple_type_single/SimpleTypeSingleIndex.java +++ b/src/main/java/org/quiltmc/enigma_plugin/index/simple_type_single/SimpleTypeSingleIndex.java @@ -54,6 +54,7 @@ */ public class SimpleTypeSingleIndex extends Index { private final Map parameters = new HashMap<>(); + private final Map> parameterFallbacks = new HashMap<>(); private final Map fields = new HashMap<>(); private final Map> fieldCache = new HashMap<>(); private SimpleTypeFieldNamesRegistry registry; @@ -104,6 +105,10 @@ public void dropCache() { return this.parameters.get(paramEntry); } + public @Nullable List getParamFallbacks(LocalVariableEntry paramEntry) { + return this.parameterFallbacks.get(paramEntry); + } + public Set getFields() { return this.fields.keySet(); } @@ -179,6 +184,7 @@ public void visitClassNode(ClassProvider provider, ClassNode node) { int index = param.index() + (isStatic ? 0 : 1); var paramEntry = new LocalVariableEntry(methodEntry, index); this.parameters.put(paramEntry, name); + this.parameterFallbacks.put(paramEntry, param.entry.fallback().stream().map(Name::local).toList()); } }); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java index fddd556..44b231b 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -24,14 +25,15 @@ import org.quiltmc.enigma_plugin.index.CodecIndex; import org.quiltmc.enigma_plugin.index.JarIndexer; +import java.util.List; import java.util.Map; public class CodecNameProposer extends NameProposer { public static final String ID = "codecs"; private final CodecIndex index; - public CodecNameProposer(JarIndexer index) { - super(ID); + public CodecNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(CodecIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java index cc39e5a..693a868 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -23,14 +24,15 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.constant_fields.ConstantFieldIndex; +import java.util.List; import java.util.Map; public class ConstantFieldNameProposer extends NameProposer { public static final String ID = "constant_fields"; private final ConstantFieldIndex fieldIndex; - public ConstantFieldNameProposer(JarIndexer index) { - super(ID); + public ConstantFieldNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.fieldIndex = index.getIndex(ConstantFieldIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java index a0a1be5..2d87b8e 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -25,14 +26,15 @@ import org.quiltmc.enigma_plugin.index.ConstructorParametersIndex; import org.quiltmc.enigma_plugin.index.JarIndexer; +import java.util.List; import java.util.Map; public class ConstructorParamsNameProposer extends NameProposer { public static final String ID = "constructor_params"; private final ConstructorParametersIndex index; - public ConstructorParamsNameProposer(JarIndexer index) { - super(ID); + public ConstructorParamsNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(ConstructorParametersIndex.class); } @@ -48,13 +50,13 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, parameter, newMapping); + this.insertDynamicProposal(mappings, remapper, parameter, newMapping); } } else if (obfEntry instanceof LocalVariableEntry parameter && this.index.isParameterLinked(parameter)) { FieldEntry linkedField = this.index.getLinkedField(parameter); if (!this.hasJarProposal(remapper, linkedField)) { - this.insertDynamicProposal(mappings, linkedField, newMapping); + this.insertDynamicProposal(mappings, remapper, linkedField, newMapping); } for (LocalVariableEntry param : this.index.getParametersForField(linkedField)) { @@ -63,7 +65,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry } if (param != parameter) { - this.insertDynamicProposal(mappings, param, newMapping); + this.insertDynamicProposal(mappings, remapper, param, newMapping); } } } else if (obfEntry == null) { @@ -76,7 +78,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry FieldEntry linkedField = this.index.getLinkedField(parameter); EntryMapping mapping = remapper.getMapping(linkedField); - this.insertDynamicProposal(mappings, parameter, mapping); + this.insertDynamicProposal(mappings, remapper, parameter, mapping); } } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java index edb024f..9af14d3 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -36,8 +37,8 @@ public class DelegateParametersNameProposer extends NameProposer { private static final List IGNORED_SOURCE_PLUGIN_IDS = Stream.of(ID, SimpleTypeFieldNameProposer.ID).map(NameProposer::getSourcePluginId).toList(); private final DelegateParametersIndex index; - public DelegateParametersNameProposer(JarIndexer index) { - super(ID); + public DelegateParametersNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(DelegateParametersIndex.class); } @@ -93,7 +94,7 @@ private void proposeNameUpwards(EntryRemapper remapper, Map, EntryMappi continue; } - this.insertDynamicProposal(mappings, link, name); + this.insertDynamicProposal(mappings, remapper, link, name); this.proposeNameUpwards(remapper, mappings, link, name, depth + 1); } } @@ -127,7 +128,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry var parameterNames = namesByMethod.get(method); for (var name : parameterNames.keySet()) { - this.insertDynamicProposal(mappings, parameterNames.get(name), name); + this.insertDynamicProposal(mappings, remapper, parameterNames.get(name), name); } } @@ -143,7 +144,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry } if (newMapping.targetName() == null) { - this.insertDynamicProposal(mappings, paramEntry, name); + this.insertDynamicProposal(mappings, remapper, paramEntry, name); } this.proposeNameUpwards(remapper, mappings, paramEntry, name); diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java index 9e18db9..e03f032 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; @@ -24,14 +25,15 @@ import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; +import java.util.List; import java.util.Map; public class EqualsNameProposer extends NameProposer { public static final String ID = "equals"; private static final MethodDescriptor EQUALS_DESCRIPTOR = new MethodDescriptor("(Ljava/lang/Object;)Z"); - public EqualsNameProposer() { - super(ID); + public EqualsNameProposer(@Nullable List proposerList) { + super(ID, proposerList); } @Override diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java index 91fc196..099e5ad 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -27,14 +28,15 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.util.Descriptors; +import java.util.List; import java.util.Map; public class GetterSetterNameProposer extends NameProposer { public static final String ID = "getter_setter"; private final GetterSetterIndex index; - public GetterSetterNameProposer(JarIndexer index) { - super(ID); + public GetterSetterNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(GetterSetterIndex.class); } @@ -73,7 +75,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, method, newName); + this.insertDynamicProposal(mappings, remapper, method, newName); } for (LocalVariableEntry parameter : this.index.getLinkedParameters()) { @@ -89,7 +91,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, parameter, newName); + this.insertDynamicProposal(mappings, remapper, parameter, newName); } return; @@ -105,9 +107,9 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry if (link instanceof MethodEntry method) { var newName = getMethodName(name, method); - this.insertDynamicProposal(mappings, method, newName); + this.insertDynamicProposal(mappings, remapper, method, newName); } else if (link instanceof LocalVariableEntry parameter) { - this.insertDynamicProposal(mappings, parameter, name); + this.insertDynamicProposal(mappings, remapper, parameter, name); } } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java index e5fe56c..40bbaa6 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -23,6 +24,7 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.LoggerIndex; +import java.util.List; import java.util.Map; /** @@ -32,8 +34,8 @@ public class LoggerNameProposer extends NameProposer { public static final String ID = "logger"; private final LoggerIndex index; - public LoggerNameProposer(JarIndexer index) { - super(ID); + public LoggerNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(LoggerIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java index 460d386..08dcc98 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; @@ -24,6 +25,7 @@ import org.quiltmc.enigma.api.translation.representation.entry.FieldEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; +import java.util.List; import java.util.Map; /** @@ -33,8 +35,8 @@ public class MojangNameProposer extends NameProposer { public static final String ID = "map_non_hashed"; - public MojangNameProposer() { - super(ID); + public MojangNameProposer(@Nullable List proposerList) { + super(ID, proposerList); } @Override @@ -50,7 +52,7 @@ public void insertProposedNames(JarIndex index, Map, EntryMapping> mapp for (MethodEntry method : entryIndex.getMethods()) { String name = method.getName(); - if (!name.startsWith("m_")) { + if (!name.startsWith("m_") && !method.isConstructor()) { this.insertProposal(mappings, method, name); } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java index e35f2e7..8ebac76 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java @@ -16,19 +16,25 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.source.TokenType; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; import org.quiltmc.enigma.api.translation.representation.entry.Entry; +import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma_plugin.QuiltEnigmaPlugin; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public abstract class NameProposer { private final String id; + @Nullable + private final List proposers = new ArrayList<>(); - public NameProposer(String id) { + public NameProposer(String id, @Nullable List proposerList) { this.id = id; } @@ -51,28 +57,35 @@ public void insertProposal(Map, EntryMapping> mappings, Entry entry, } public void insertProposal(Map, EntryMapping> mappings, Entry entry, String name) { - this.insertProposal(mappings, entry, name, TokenType.JAR_PROPOSED); + this.insertProposal(mappings, null, entry, name, TokenType.JAR_PROPOSED); } - public void insertDynamicProposal(Map, EntryMapping> mappings, Entry entry, EntryMapping mapping) { + public void insertDynamicProposal(Map, EntryMapping> mappings, EntryRemapper remapper, Entry entry, EntryMapping mapping) { if (mapping != null) { if (mapping.targetName() != null && !mapping.targetName().isEmpty()) { - this.insertDynamicProposal(mappings, entry, mapping.targetName()); + this.insertDynamicProposal(mappings, remapper, entry, mapping.targetName()); } else { - this.insertDynamicProposal(mappings, entry, (String) null); + this.insertDynamicProposal(mappings, remapper, entry, (String) null); } } } - public void insertDynamicProposal(Map, EntryMapping> mappings, Entry entry, String name) { - this.insertProposal(mappings, entry, name, TokenType.DYNAMIC_PROPOSED); + public void insertDynamicProposal(Map, EntryMapping> mappings, EntryRemapper remapper, Entry entry, String name) { + this.insertProposal(mappings, remapper, entry, name, TokenType.DYNAMIC_PROPOSED); } - private void insertProposal(Map, EntryMapping> mappings, Entry entry, String name, TokenType tokenType) { + private void insertProposal(Map, EntryMapping> mappings, @Nullable EntryRemapper remapper, Entry entry, String name, TokenType tokenType) { if (!mappings.containsKey(entry)) { if (name != null) { EntryMapping mapping = new EntryMapping(name, null, tokenType, this.getSourcePluginId()); mappings.put(entry, mapping); + + // god awful + if (tokenType == TokenType.DYNAMIC_PROPOSED && entry instanceof LocalVariableEntry param && !(this instanceof SimpleTypeFieldNameProposer)) { + this.proposers.stream().filter(nameProposer -> nameProposer instanceof SimpleTypeFieldNameProposer).findFirst().ifPresent(nameProposer -> { + ((SimpleTypeFieldNameProposer) nameProposer).fixConflicts(mappings, remapper, param, name); + }); + } } else { mappings.put(entry, null); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java index 30bef5d..80bb9cc 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java @@ -38,20 +38,24 @@ public class NameProposerService implements NameProposalService { private final List nameProposers = new ArrayList<>(); public NameProposerService(JarIndexer indexer, EnigmaServiceContext context) { - this.addIfEnabled(context, indexer, Arguments.DISABLE_RECORDS, RecordComponentNameProposer::new); - this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTANT_FIELDS, ConstantFieldNameProposer::new); - this.addIfEnabled(context, Arguments.DISABLE_EQUALS, EqualsNameProposer::new); - this.addIfEnabled(context, indexer, Arguments.DISABLE_LOGGER, LoggerNameProposer::new); - this.addIfEnabled(context, indexer, Arguments.DISABLE_CODECS, CodecNameProposer::new); - this.addIfNotDisabled(context, Arguments.DISABLE_MAP_NON_HASHED, MojangNameProposer::new); - + this.addIfEnabled(context, indexer, Arguments.DISABLE_RECORDS, (index) -> new RecordComponentNameProposer(index, this.nameProposers)); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTANT_FIELDS, (index) -> new ConstantFieldNameProposer(index, this.nameProposers)); + this.addIfEnabled(context, Arguments.DISABLE_EQUALS, () -> new EqualsNameProposer(this.nameProposers)); + this.addIfEnabled(context, indexer, Arguments.DISABLE_LOGGER, (index) -> new LoggerNameProposer(index, this.nameProposers)); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CODECS, (index) -> new CodecNameProposer(index, this.nameProposers)); + this.addIfNotDisabled(context, Arguments.DISABLE_MAP_NON_HASHED, () -> new MojangNameProposer(this.nameProposers)); + + SimpleTypeFieldNameProposer proposer; if (indexer.getIndex(SimpleTypeSingleIndex.class).isEnabled()) { - this.nameProposers.add(new SimpleTypeFieldNameProposer(indexer)); + proposer = new SimpleTypeFieldNameProposer(indexer); + this.nameProposers.add(proposer); + } else { + proposer = null; } - this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTRUCTOR_PARAMS, ConstructorParamsNameProposer::new); - this.addIfEnabled(context, indexer, Arguments.DISABLE_GETTER_SETTER, GetterSetterNameProposer::new); - this.addIfEnabled(context, indexer, Arguments.DISABLE_DELEGATE_PARAMS, DelegateParametersNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTRUCTOR_PARAMS, (index) -> new ConstructorParamsNameProposer(index, List.of(proposer))); + this.addIfEnabled(context, indexer, Arguments.DISABLE_GETTER_SETTER, (index) -> new GetterSetterNameProposer(index, this.nameProposers)); + this.addIfEnabled(context, indexer, Arguments.DISABLE_DELEGATE_PARAMS, (index) -> new DelegateParametersNameProposer(index, List.of(proposer))); } private void addIfEnabled(EnigmaServiceContext context, String name, Supplier factory) { diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java index ba736a0..d4cb917 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java @@ -16,6 +16,7 @@ package org.quiltmc.enigma_plugin.proposal; +import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.ClassEntry; @@ -25,14 +26,15 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.RecordIndex; +import java.util.List; import java.util.Map; public class RecordComponentNameProposer extends NameProposer { public static final String ID = "records"; private final RecordIndex index; - public RecordComponentNameProposer(JarIndexer index) { - super(ID); + public RecordComponentNameProposer(JarIndexer index, @Nullable List proposerList) { + super(ID, proposerList); this.index = index.getIndex(RecordIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java index fc1c103..9a94ac8 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java @@ -16,22 +16,27 @@ package org.quiltmc.enigma_plugin.proposal; +import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; +import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; import org.quiltmc.enigma.api.translation.representation.entry.Entry; import org.quiltmc.enigma.api.translation.representation.entry.FieldEntry; import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; +import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.simple_type_single.SimpleTypeSingleIndex; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; public class SimpleTypeFieldNameProposer extends NameProposer { public static final String ID = "simple_type_field_names"; private final SimpleTypeSingleIndex index; public SimpleTypeFieldNameProposer(JarIndexer index) { - super(ID); + super(ID, null); this.index = index.getIndex(SimpleTypeSingleIndex.class); } @@ -49,4 +54,39 @@ public void insertProposedNames(JarIndex index, Map, EntryMapping> mapp this.insertProposal(mappings, param, name); } } + + // todo never called + public void fixConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, LocalVariableEntry entry, String name) { + Optional conflict = getConflictingParam(remapper, entry, name); + + while (conflict.isPresent()) { + LocalVariableEntry conflictEntry = conflict.get(); + var fallbacks = this.index.getParamFallbacks(conflictEntry); + + for (String fallbackName : fallbacks) { + Optional newConflict = getConflictingParam(remapper, conflictEntry, fallbackName); + if (newConflict.isEmpty()) { + this.insertDynamicProposal(mappings, remapper, conflictEntry, fallbackName); + conflict = getConflictingParam(remapper, conflictEntry, name); + break; + } + } + + this.insertDynamicProposal(mappings, remapper, conflictEntry, (String) null); + } + } + + private Optional getConflictingParam(EntryRemapper remapper, LocalVariableEntry entry, String name) { + MethodEntry method = entry.getParent(); + var args = method.getParameterIterator(remapper.getJarIndex().getIndex(EntryIndex.class), remapper.getDeobfuscator()); + + while (args.hasNext()) { + LocalVariableEntry arg = args.next(); + if (arg.getIndex() != entry.getIndex() && arg.getName().equals(name)) { + return Optional.of(arg); + } + } + + return Optional.empty(); + } } diff --git a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java index 5b0dcbd..95c09af 100644 --- a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java +++ b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java @@ -34,9 +34,12 @@ import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; import org.quiltmc.enigma.util.validation.ValidationContext; +import org.quiltmc.enigma_plugin.index.JarIndexer; +import org.quiltmc.enigma_plugin.proposal.SimpleTypeFieldNameProposer; import java.io.IOException; import java.nio.file.Path; +import java.util.HashMap; public class NameProposalTest { private static final Path JAR = Path.of("build/obf/obf.jar"); @@ -289,6 +292,20 @@ public void testSimpleTypeSingleNames() { assertProposal("valueD", localVar(parent, 0)); } + + @Test + public void testSimpleTypeSingleNamesWithMapping() { + var classEntry = new ClassEntry("com/a/e"); + var owner = new ClassEntry(classEntry, "b"); + + var vc = new ValidationContext(null); + remapper.putMapping(vc, field(owner, "a", "Ljava/lang/String;"), new EntryMapping("id")); + + var constructor = method(owner, "", "(Ljava/lang/String;Ljava/lang/CharSequence;)V"); + assertDynamicProposal("id", localVar(constructor, 1)); + assertProposal("identifier", localVar(constructor, 2)); + } + @Test public void testDelegateParameterNames() { var classEntry = new ClassEntry("com/a/b"); diff --git a/src/testInputs/resources/simple_type_field_names.json5 b/src/testInputs/resources/simple_type_field_names.json5 index a403ada..826e5d3 100644 --- a/src/testInputs/resources/simple_type_field_names.json5 +++ b/src/testInputs/resources/simple_type_field_names.json5 @@ -3,6 +3,14 @@ "com/a/b/a": "config", + "java/lang/CharSequence": { + local_name: "id", + exclusive: true, + fallback: [ + "identifier" + ] + }, + // Position "com/a/b/b": "pos", // Pos "com/a/b/c": { // Position From 80999eb671ade532349ed1ba56afe9b6cb0f38bb Mon Sep 17 00:00:00 2001 From: ix0rai Date: Wed, 25 Sep 2024 12:14:08 -0500 Subject: [PATCH 02/11] prog --- .../org/quiltmc/enigma_plugin/NameProposalTest.java | 10 +++++++--- src/testInputs/java/com/example/GetterSetterTest.java | 5 +++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java index 95c09af..a2e068e 100644 --- a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java +++ b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java @@ -295,13 +295,17 @@ public void testSimpleTypeSingleNames() { @Test public void testSimpleTypeSingleNamesWithMapping() { - var classEntry = new ClassEntry("com/a/e"); - var owner = new ClassEntry(classEntry, "b"); + var owner = new ClassEntry("com/a/c"); + var constructor = method(owner, "", "(ILjava/lang/CharSequence;)V"); + + // param 2 is initially 'id' + assertProposal("id", localVar(constructor, 2)); var vc = new ValidationContext(null); + // fires dynamic proposal for the constructor parameter, creating a conflict + // conflict should then be automatically fixed by moving to the 'identifier' name remapper.putMapping(vc, field(owner, "a", "Ljava/lang/String;"), new EntryMapping("id")); - var constructor = method(owner, "", "(Ljava/lang/String;Ljava/lang/CharSequence;)V"); assertDynamicProposal("id", localVar(constructor, 1)); assertProposal("identifier", localVar(constructor, 2)); } diff --git a/src/testInputs/java/com/example/GetterSetterTest.java b/src/testInputs/java/com/example/GetterSetterTest.java index cade57c..fbade92 100644 --- a/src/testInputs/java/com/example/GetterSetterTest.java +++ b/src/testInputs/java/com/example/GetterSetterTest.java @@ -6,6 +6,11 @@ public class GetterSetterTest { public int x; public String y; + public GetterSetterTest(int x, String y) { + this.x = x; + this.y = y; + } + public int getX() { return this.x; } From e9492c0562e82095c7cf626ffd9de99a83b88fa3 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Wed, 25 Sep 2024 19:10:02 -0500 Subject: [PATCH 03/11] WORKING (awful edition) --- .../enigma_plugin/proposal/NameProposer.java | 1 + .../proposal/SimpleTypeFieldNameProposer.java | 5 ++--- .../enigma_plugin/NameProposalTest.java | 18 +++++++++--------- .../com/example/z_conflicts/ConflictTest.java | 11 +++++++++++ 4 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 src/testInputs/java/com/example/z_conflicts/ConflictTest.java diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java index 8ebac76..441adab 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java @@ -36,6 +36,7 @@ public abstract class NameProposer { public NameProposer(String id, @Nullable List proposerList) { this.id = id; + this.proposers.addAll(proposerList); } public String getSourcePluginId() { diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java index 9a94ac8..aec5d7d 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java @@ -27,16 +27,16 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.simple_type_single.SimpleTypeSingleIndex; +import java.util.ArrayList; import java.util.Map; import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; public class SimpleTypeFieldNameProposer extends NameProposer { public static final String ID = "simple_type_field_names"; private final SimpleTypeSingleIndex index; public SimpleTypeFieldNameProposer(JarIndexer index) { - super(ID, null); + super(ID, new ArrayList<>()); this.index = index.getIndex(SimpleTypeSingleIndex.class); } @@ -55,7 +55,6 @@ public void insertProposedNames(JarIndex index, Map, EntryMapping> mapp } } - // todo never called public void fixConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, LocalVariableEntry entry, String name) { Optional conflict = getConflictingParam(remapper, entry, name); diff --git a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java index a2e068e..417620d 100644 --- a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java +++ b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java @@ -34,12 +34,9 @@ import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; import org.quiltmc.enigma.util.validation.ValidationContext; -import org.quiltmc.enigma_plugin.index.JarIndexer; -import org.quiltmc.enigma_plugin.proposal.SimpleTypeFieldNameProposer; import java.io.IOException; import java.nio.file.Path; -import java.util.HashMap; public class NameProposalTest { private static final Path JAR = Path.of("build/obf/obf.jar"); @@ -294,20 +291,23 @@ public void testSimpleTypeSingleNames() { @Test - public void testSimpleTypeSingleNamesWithMapping() { - var owner = new ClassEntry("com/a/c"); + public void testSimpleTypeNameConflictFix() { + // tests the conflict fixer via introducing a conflict manually + + var owner = new ClassEntry("com/a/c/a"); var constructor = method(owner, "", "(ILjava/lang/CharSequence;)V"); // param 2 is initially 'id' assertProposal("id", localVar(constructor, 2)); - var vc = new ValidationContext(null); // fires dynamic proposal for the constructor parameter, creating a conflict - // conflict should then be automatically fixed by moving to the 'identifier' name - remapper.putMapping(vc, field(owner, "a", "Ljava/lang/String;"), new EntryMapping("id")); + // the conflict should then be automatically fixed by moving to the 'identifier' name + // note we bypass putMapping so that we can create a conflict + remapper.getMappings().insert(field(owner, "a", "I"), new EntryMapping("id")); + remapper.insertDynamicallyProposedMappings(field(owner, "a", "I"), EntryMapping.OBFUSCATED, new EntryMapping("id")); assertDynamicProposal("id", localVar(constructor, 1)); - assertProposal("identifier", localVar(constructor, 2)); + assertDynamicProposal("identifier", localVar(constructor, 2)); } @Test diff --git a/src/testInputs/java/com/example/z_conflicts/ConflictTest.java b/src/testInputs/java/com/example/z_conflicts/ConflictTest.java new file mode 100644 index 0000000..59159f7 --- /dev/null +++ b/src/testInputs/java/com/example/z_conflicts/ConflictTest.java @@ -0,0 +1,11 @@ +package com.example.z_conflicts; + +public class ConflictTest { + public int a; + public CharSequence b; + + public ConflictTest(int a, CharSequence b) { + this.a = a; + this.b = b; + } +} From a164fd8bdfcb034b3775b6a58fa08b20cd0c6c68 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Thu, 26 Sep 2024 16:58:37 -0500 Subject: [PATCH 04/11] move conflict fixing to a dedicated proposer --- .../org/quiltmc/enigma_plugin/Arguments.java | 1 + .../proposal/ConflictFixProposer.java | 85 +++++++++++++++++++ .../enigma_plugin/proposal/NameProposer.java | 12 +-- .../proposal/NameProposerService.java | 9 +- .../proposal/SimpleTypeFieldNameProposer.java | 38 --------- 5 files changed, 95 insertions(+), 50 deletions(-) create mode 100644 src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java diff --git a/src/main/java/org/quiltmc/enigma_plugin/Arguments.java b/src/main/java/org/quiltmc/enigma_plugin/Arguments.java index f696e1e..3454f76 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/Arguments.java +++ b/src/main/java/org/quiltmc/enigma_plugin/Arguments.java @@ -32,6 +32,7 @@ public class Arguments { public static final String DISABLE_CODECS = "disable_codecs"; public static final String DISABLE_MAP_NON_HASHED = "disable_map_non_hashed"; public static final String DISABLE_DELEGATE_PARAMS = "disable_delegate_params"; + public static final String DISABLE_CONFLICT_FIXER = "disable_conflict_fixer"; public static final String CUSTOM_CODECS = "custom_codecs"; public static final String SIMPLE_TYPE_FIELD_NAMES_PATH = "simple_type_field_names_path"; diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java new file mode 100644 index 0000000..055b817 --- /dev/null +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java @@ -0,0 +1,85 @@ +package org.quiltmc.enigma_plugin.proposal; + +import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; +import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; +import org.quiltmc.enigma.api.translation.mapping.EntryMapping; +import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; +import org.quiltmc.enigma.api.translation.representation.entry.Entry; +import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; +import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; +import org.quiltmc.enigma_plugin.index.JarIndexer; +import org.quiltmc.enigma_plugin.index.simple_type_single.SimpleTypeSingleIndex; + +import java.util.Map; +import java.util.Optional; + +public class ConflictFixProposer extends NameProposer { + public static final String ID = "conflict_fix"; + private final SimpleTypeSingleIndex index; + + public ConflictFixProposer(JarIndexer jarIndex) { + super(ID, null); + this.index = jarIndex.getIndex(SimpleTypeSingleIndex.class); + } + + @Override + public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, EntryMapping oldMapping, EntryMapping newMapping, Map, EntryMapping> mappings) { + for (Map.Entry, EntryMapping> entry : mappings.entrySet()) { + fixConflicts(mappings, remapper, entry.getKey(), entry.getValue()); + } + } + + private void fixConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, Entry entry, EntryMapping mapping) { + if (entry instanceof LocalVariableEntry param && mapping != null) { + this.fixParamConflicts(mappings, remapper, param, mapping); + } + } + + private void fixParamConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, LocalVariableEntry entry, EntryMapping mapping) { + String name = mapping.targetName(); + Optional conflict = getConflictingParam(remapper, entry, name); + + while (conflict.isPresent()) { + LocalVariableEntry conflictEntry = conflict.get(); + var fallbacks = this.index.getParamFallbacks(conflictEntry); + + boolean fixed = false; + + if (fallbacks != null) { + for (String fallbackName : fallbacks) { + Optional newConflict = getConflictingParam(remapper, conflictEntry, fallbackName); + if (newConflict.isEmpty()) { + this.insertDynamicProposal(mappings, remapper, conflictEntry, fallbackName); + conflict = getConflictingParam(remapper, conflictEntry, name); + fixed = true; + break; + } + } + } + + if (!fixed) { + this.insertDynamicProposal(mappings, remapper, conflictEntry, (String) null); + } + } + } + + private Optional getConflictingParam(EntryRemapper remapper, LocalVariableEntry entry, String name) { + MethodEntry method = entry.getParent(); + if (method != null) { + var args = method.getParameterIterator(remapper.getJarIndex().getIndex(EntryIndex.class), remapper.getDeobfuscator()); + + while (args.hasNext()) { + LocalVariableEntry arg = args.next(); + if (arg.getIndex() != entry.getIndex() && arg.getName().equals(name)) { + return Optional.of(arg); + } + } + } + + return Optional.empty(); + } + + @Override + public void insertProposedNames(JarIndex index, Map, EntryMapping> mappings) { + } +} diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java index 441adab..166c70e 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java @@ -22,7 +22,6 @@ import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; import org.quiltmc.enigma.api.translation.representation.entry.Entry; -import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma_plugin.QuiltEnigmaPlugin; import java.util.ArrayList; @@ -31,12 +30,10 @@ public abstract class NameProposer { private final String id; - @Nullable - private final List proposers = new ArrayList<>(); public NameProposer(String id, @Nullable List proposerList) { this.id = id; - this.proposers.addAll(proposerList); + //this.proposers.addAll(proposerList); } public String getSourcePluginId() { @@ -80,13 +77,6 @@ private void insertProposal(Map, EntryMapping> mappings, @Nullable Entr if (name != null) { EntryMapping mapping = new EntryMapping(name, null, tokenType, this.getSourcePluginId()); mappings.put(entry, mapping); - - // god awful - if (tokenType == TokenType.DYNAMIC_PROPOSED && entry instanceof LocalVariableEntry param && !(this instanceof SimpleTypeFieldNameProposer)) { - this.proposers.stream().filter(nameProposer -> nameProposer instanceof SimpleTypeFieldNameProposer).findFirst().ifPresent(nameProposer -> { - ((SimpleTypeFieldNameProposer) nameProposer).fixConflicts(mappings, remapper, param, name); - }); - } } else { mappings.put(entry, null); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java index 80bb9cc..af226ae 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java @@ -56,6 +56,9 @@ public NameProposerService(JarIndexer indexer, EnigmaServiceContext new ConstructorParamsNameProposer(index, List.of(proposer))); this.addIfEnabled(context, indexer, Arguments.DISABLE_GETTER_SETTER, (index) -> new GetterSetterNameProposer(index, this.nameProposers)); this.addIfEnabled(context, indexer, Arguments.DISABLE_DELEGATE_PARAMS, (index) -> new DelegateParametersNameProposer(index, List.of(proposer))); + + // conflict fixer must be last in order to get context from other dynamic proposers + this.addIfEnabled(context, indexer, Arguments.DISABLE_CONFLICT_FIXER, ConflictFixProposer::new); } private void addIfEnabled(EnigmaServiceContext context, String name, Supplier factory) { @@ -69,8 +72,12 @@ private void addIfEnabled(EnigmaServiceContext context, Jar } private void addIfNotDisabled(EnigmaServiceContext context, String name, Supplier factory) { + this.addIfNotDisabled(context, null, name, indexer -> factory.get()); + } + + private void addIfNotDisabled(EnigmaServiceContext context, JarIndexer indexer, String name, Function factory) { if (!Arguments.getBoolean(context, name, true)) { - this.nameProposers.add(factory.get()); + this.nameProposers.add(factory.apply(indexer)); } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java index aec5d7d..62d7ad7 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java @@ -16,20 +16,16 @@ package org.quiltmc.enigma_plugin.proposal; -import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; -import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; import org.quiltmc.enigma.api.translation.representation.entry.Entry; import org.quiltmc.enigma.api.translation.representation.entry.FieldEntry; import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; -import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.simple_type_single.SimpleTypeSingleIndex; import java.util.ArrayList; import java.util.Map; -import java.util.Optional; public class SimpleTypeFieldNameProposer extends NameProposer { public static final String ID = "simple_type_field_names"; @@ -54,38 +50,4 @@ public void insertProposedNames(JarIndex index, Map, EntryMapping> mapp this.insertProposal(mappings, param, name); } } - - public void fixConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, LocalVariableEntry entry, String name) { - Optional conflict = getConflictingParam(remapper, entry, name); - - while (conflict.isPresent()) { - LocalVariableEntry conflictEntry = conflict.get(); - var fallbacks = this.index.getParamFallbacks(conflictEntry); - - for (String fallbackName : fallbacks) { - Optional newConflict = getConflictingParam(remapper, conflictEntry, fallbackName); - if (newConflict.isEmpty()) { - this.insertDynamicProposal(mappings, remapper, conflictEntry, fallbackName); - conflict = getConflictingParam(remapper, conflictEntry, name); - break; - } - } - - this.insertDynamicProposal(mappings, remapper, conflictEntry, (String) null); - } - } - - private Optional getConflictingParam(EntryRemapper remapper, LocalVariableEntry entry, String name) { - MethodEntry method = entry.getParent(); - var args = method.getParameterIterator(remapper.getJarIndex().getIndex(EntryIndex.class), remapper.getDeobfuscator()); - - while (args.hasNext()) { - LocalVariableEntry arg = args.next(); - if (arg.getIndex() != entry.getIndex() && arg.getName().equals(name)) { - return Optional.of(arg); - } - } - - return Optional.empty(); - } } From f35f563526f2f86db470239789d890a2691d7b32 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Thu, 26 Sep 2024 17:03:08 -0500 Subject: [PATCH 05/11] why did i think this would be a 1 night fix --- .../proposal/CodecNameProposer.java | 6 ++--- .../proposal/ConflictFixProposer.java | 2 +- .../proposal/ConstantFieldNameProposer.java | 6 ++--- .../ConstructorParamsNameProposer.java | 6 ++--- .../DelegateParametersNameProposer.java | 5 ++-- .../proposal/EqualsNameProposer.java | 6 ++--- .../proposal/GetterSetterNameProposer.java | 6 ++--- .../proposal/LoggerNameProposer.java | 6 ++--- .../proposal/MojangNameProposer.java | 6 ++--- .../enigma_plugin/proposal/NameProposer.java | 5 +--- .../proposal/NameProposerService.java | 26 ++++++++----------- .../proposal/RecordComponentNameProposer.java | 6 ++--- .../proposal/SimpleTypeFieldNameProposer.java | 3 +-- .../com/example/z_conflicts/ConflictTest.java | 4 +-- 14 files changed, 34 insertions(+), 59 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java index 44b231b..fddd556 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/CodecNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -25,15 +24,14 @@ import org.quiltmc.enigma_plugin.index.CodecIndex; import org.quiltmc.enigma_plugin.index.JarIndexer; -import java.util.List; import java.util.Map; public class CodecNameProposer extends NameProposer { public static final String ID = "codecs"; private final CodecIndex index; - public CodecNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public CodecNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(CodecIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java index 055b817..5753888 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java @@ -18,7 +18,7 @@ public class ConflictFixProposer extends NameProposer { private final SimpleTypeSingleIndex index; public ConflictFixProposer(JarIndexer jarIndex) { - super(ID, null); + super(ID); this.index = jarIndex.getIndex(SimpleTypeSingleIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java index 693a868..cc39e5a 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstantFieldNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -24,15 +23,14 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.constant_fields.ConstantFieldIndex; -import java.util.List; import java.util.Map; public class ConstantFieldNameProposer extends NameProposer { public static final String ID = "constant_fields"; private final ConstantFieldIndex fieldIndex; - public ConstantFieldNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public ConstantFieldNameProposer(JarIndexer index) { + super(ID); this.fieldIndex = index.getIndex(ConstantFieldIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java index 2d87b8e..dbfef5b 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -26,15 +25,14 @@ import org.quiltmc.enigma_plugin.index.ConstructorParametersIndex; import org.quiltmc.enigma_plugin.index.JarIndexer; -import java.util.List; import java.util.Map; public class ConstructorParamsNameProposer extends NameProposer { public static final String ID = "constructor_params"; private final ConstructorParametersIndex index; - public ConstructorParamsNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public ConstructorParamsNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(ConstructorParametersIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java index 9af14d3..012fe72 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -37,8 +36,8 @@ public class DelegateParametersNameProposer extends NameProposer { private static final List IGNORED_SOURCE_PLUGIN_IDS = Stream.of(ID, SimpleTypeFieldNameProposer.ID).map(NameProposer::getSourcePluginId).toList(); private final DelegateParametersIndex index; - public DelegateParametersNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public DelegateParametersNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(DelegateParametersIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java index e03f032..9e18db9 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/EqualsNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; @@ -25,15 +24,14 @@ import org.quiltmc.enigma.api.translation.representation.entry.LocalVariableEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; -import java.util.List; import java.util.Map; public class EqualsNameProposer extends NameProposer { public static final String ID = "equals"; private static final MethodDescriptor EQUALS_DESCRIPTOR = new MethodDescriptor("(Ljava/lang/Object;)Z"); - public EqualsNameProposer(@Nullable List proposerList) { - super(ID, proposerList); + public EqualsNameProposer() { + super(ID); } @Override diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java index 099e5ad..af8bd01 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.mapping.EntryRemapper; @@ -28,15 +27,14 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.util.Descriptors; -import java.util.List; import java.util.Map; public class GetterSetterNameProposer extends NameProposer { public static final String ID = "getter_setter"; private final GetterSetterIndex index; - public GetterSetterNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public GetterSetterNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(GetterSetterIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java index 40bbaa6..e5fe56c 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/LoggerNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.Entry; @@ -24,7 +23,6 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.LoggerIndex; -import java.util.List; import java.util.Map; /** @@ -34,8 +32,8 @@ public class LoggerNameProposer extends NameProposer { public static final String ID = "logger"; private final LoggerIndex index; - public LoggerNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public LoggerNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(LoggerIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java index 08dcc98..9c63b18 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/MojangNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; @@ -25,7 +24,6 @@ import org.quiltmc.enigma.api.translation.representation.entry.FieldEntry; import org.quiltmc.enigma.api.translation.representation.entry.MethodEntry; -import java.util.List; import java.util.Map; /** @@ -35,8 +33,8 @@ public class MojangNameProposer extends NameProposer { public static final String ID = "map_non_hashed"; - public MojangNameProposer(@Nullable List proposerList) { - super(ID, proposerList); + public MojangNameProposer() { + super(ID); } @Override diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java index 166c70e..19d99ff 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java @@ -24,16 +24,13 @@ import org.quiltmc.enigma.api.translation.representation.entry.Entry; import org.quiltmc.enigma_plugin.QuiltEnigmaPlugin; -import java.util.ArrayList; -import java.util.List; import java.util.Map; public abstract class NameProposer { private final String id; - public NameProposer(String id, @Nullable List proposerList) { + public NameProposer(String id) { this.id = id; - //this.proposers.addAll(proposerList); } public String getSourcePluginId() { diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java index af226ae..a78a86d 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposerService.java @@ -38,24 +38,20 @@ public class NameProposerService implements NameProposalService { private final List nameProposers = new ArrayList<>(); public NameProposerService(JarIndexer indexer, EnigmaServiceContext context) { - this.addIfEnabled(context, indexer, Arguments.DISABLE_RECORDS, (index) -> new RecordComponentNameProposer(index, this.nameProposers)); - this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTANT_FIELDS, (index) -> new ConstantFieldNameProposer(index, this.nameProposers)); - this.addIfEnabled(context, Arguments.DISABLE_EQUALS, () -> new EqualsNameProposer(this.nameProposers)); - this.addIfEnabled(context, indexer, Arguments.DISABLE_LOGGER, (index) -> new LoggerNameProposer(index, this.nameProposers)); - this.addIfEnabled(context, indexer, Arguments.DISABLE_CODECS, (index) -> new CodecNameProposer(index, this.nameProposers)); - this.addIfNotDisabled(context, Arguments.DISABLE_MAP_NON_HASHED, () -> new MojangNameProposer(this.nameProposers)); - - SimpleTypeFieldNameProposer proposer; + this.addIfEnabled(context, indexer, Arguments.DISABLE_RECORDS, RecordComponentNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTANT_FIELDS, ConstantFieldNameProposer::new); + this.addIfEnabled(context, Arguments.DISABLE_EQUALS, EqualsNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_LOGGER, LoggerNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CODECS, CodecNameProposer::new); + this.addIfNotDisabled(context, Arguments.DISABLE_MAP_NON_HASHED, MojangNameProposer::new); + if (indexer.getIndex(SimpleTypeSingleIndex.class).isEnabled()) { - proposer = new SimpleTypeFieldNameProposer(indexer); - this.nameProposers.add(proposer); - } else { - proposer = null; + this.nameProposers.add(new SimpleTypeFieldNameProposer(indexer)); } - this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTRUCTOR_PARAMS, (index) -> new ConstructorParamsNameProposer(index, List.of(proposer))); - this.addIfEnabled(context, indexer, Arguments.DISABLE_GETTER_SETTER, (index) -> new GetterSetterNameProposer(index, this.nameProposers)); - this.addIfEnabled(context, indexer, Arguments.DISABLE_DELEGATE_PARAMS, (index) -> new DelegateParametersNameProposer(index, List.of(proposer))); + this.addIfEnabled(context, indexer, Arguments.DISABLE_CONSTRUCTOR_PARAMS, ConstructorParamsNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_GETTER_SETTER, GetterSetterNameProposer::new); + this.addIfEnabled(context, indexer, Arguments.DISABLE_DELEGATE_PARAMS, DelegateParametersNameProposer::new); // conflict fixer must be last in order to get context from other dynamic proposers this.addIfEnabled(context, indexer, Arguments.DISABLE_CONFLICT_FIXER, ConflictFixProposer::new); diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java index d4cb917..ba736a0 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/RecordComponentNameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; import org.quiltmc.enigma.api.translation.representation.entry.ClassEntry; @@ -26,15 +25,14 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.RecordIndex; -import java.util.List; import java.util.Map; public class RecordComponentNameProposer extends NameProposer { public static final String ID = "records"; private final RecordIndex index; - public RecordComponentNameProposer(JarIndexer index, @Nullable List proposerList) { - super(ID, proposerList); + public RecordComponentNameProposer(JarIndexer index) { + super(ID); this.index = index.getIndex(RecordIndex.class); } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java index 62d7ad7..fc1c103 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/SimpleTypeFieldNameProposer.java @@ -24,7 +24,6 @@ import org.quiltmc.enigma_plugin.index.JarIndexer; import org.quiltmc.enigma_plugin.index.simple_type_single.SimpleTypeSingleIndex; -import java.util.ArrayList; import java.util.Map; public class SimpleTypeFieldNameProposer extends NameProposer { @@ -32,7 +31,7 @@ public class SimpleTypeFieldNameProposer extends NameProposer { private final SimpleTypeSingleIndex index; public SimpleTypeFieldNameProposer(JarIndexer index) { - super(ID, new ArrayList<>()); + super(ID); this.index = index.getIndex(SimpleTypeSingleIndex.class); } diff --git a/src/testInputs/java/com/example/z_conflicts/ConflictTest.java b/src/testInputs/java/com/example/z_conflicts/ConflictTest.java index 59159f7..139cc81 100644 --- a/src/testInputs/java/com/example/z_conflicts/ConflictTest.java +++ b/src/testInputs/java/com/example/z_conflicts/ConflictTest.java @@ -1,8 +1,8 @@ package com.example.z_conflicts; public class ConflictTest { - public int a; - public CharSequence b; + public final int a; + public final CharSequence b; public ConflictTest(int a, CharSequence b) { this.a = a; From 53f31cbe1d41ad79356730b4f42e9aa95eeb983f Mon Sep 17 00:00:00 2001 From: ix0rai Date: Thu, 26 Sep 2024 17:05:57 -0500 Subject: [PATCH 06/11] remove now-unnecessary args --- .../proposal/ConflictFixProposer.java | 4 ++-- .../proposal/ConstructorParamsNameProposer.java | 8 ++++---- .../proposal/DelegateParametersNameProposer.java | 6 +++--- .../proposal/GetterSetterNameProposer.java | 8 ++++---- .../enigma_plugin/proposal/NameProposer.java | 15 +++++++-------- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java index 5753888..7a9468b 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java @@ -49,7 +49,7 @@ private void fixParamConflicts(Map, EntryMapping> mappings, EntryRemapp for (String fallbackName : fallbacks) { Optional newConflict = getConflictingParam(remapper, conflictEntry, fallbackName); if (newConflict.isEmpty()) { - this.insertDynamicProposal(mappings, remapper, conflictEntry, fallbackName); + this.insertDynamicProposal(mappings, conflictEntry, fallbackName); conflict = getConflictingParam(remapper, conflictEntry, name); fixed = true; break; @@ -58,7 +58,7 @@ private void fixParamConflicts(Map, EntryMapping> mappings, EntryRemapp } if (!fixed) { - this.insertDynamicProposal(mappings, remapper, conflictEntry, (String) null); + this.insertDynamicProposal(mappings, conflictEntry, (String) null); } } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java index dbfef5b..a0a1be5 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConstructorParamsNameProposer.java @@ -48,13 +48,13 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, remapper, parameter, newMapping); + this.insertDynamicProposal(mappings, parameter, newMapping); } } else if (obfEntry instanceof LocalVariableEntry parameter && this.index.isParameterLinked(parameter)) { FieldEntry linkedField = this.index.getLinkedField(parameter); if (!this.hasJarProposal(remapper, linkedField)) { - this.insertDynamicProposal(mappings, remapper, linkedField, newMapping); + this.insertDynamicProposal(mappings, linkedField, newMapping); } for (LocalVariableEntry param : this.index.getParametersForField(linkedField)) { @@ -63,7 +63,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry } if (param != parameter) { - this.insertDynamicProposal(mappings, remapper, param, newMapping); + this.insertDynamicProposal(mappings, param, newMapping); } } } else if (obfEntry == null) { @@ -76,7 +76,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry FieldEntry linkedField = this.index.getLinkedField(parameter); EntryMapping mapping = remapper.getMapping(linkedField); - this.insertDynamicProposal(mappings, remapper, parameter, mapping); + this.insertDynamicProposal(mappings, parameter, mapping); } } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java index 012fe72..edb024f 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/DelegateParametersNameProposer.java @@ -93,7 +93,7 @@ private void proposeNameUpwards(EntryRemapper remapper, Map, EntryMappi continue; } - this.insertDynamicProposal(mappings, remapper, link, name); + this.insertDynamicProposal(mappings, link, name); this.proposeNameUpwards(remapper, mappings, link, name, depth + 1); } } @@ -127,7 +127,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry var parameterNames = namesByMethod.get(method); for (var name : parameterNames.keySet()) { - this.insertDynamicProposal(mappings, remapper, parameterNames.get(name), name); + this.insertDynamicProposal(mappings, parameterNames.get(name), name); } } @@ -143,7 +143,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry } if (newMapping.targetName() == null) { - this.insertDynamicProposal(mappings, remapper, paramEntry, name); + this.insertDynamicProposal(mappings, paramEntry, name); } this.proposeNameUpwards(remapper, mappings, paramEntry, name); diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java index af8bd01..91fc196 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/GetterSetterNameProposer.java @@ -73,7 +73,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, remapper, method, newName); + this.insertDynamicProposal(mappings, method, newName); } for (LocalVariableEntry parameter : this.index.getLinkedParameters()) { @@ -89,7 +89,7 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry continue; } - this.insertDynamicProposal(mappings, remapper, parameter, newName); + this.insertDynamicProposal(mappings, parameter, newName); } return; @@ -105,9 +105,9 @@ public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, Entry if (link instanceof MethodEntry method) { var newName = getMethodName(name, method); - this.insertDynamicProposal(mappings, remapper, method, newName); + this.insertDynamicProposal(mappings, method, newName); } else if (link instanceof LocalVariableEntry parameter) { - this.insertDynamicProposal(mappings, remapper, parameter, name); + this.insertDynamicProposal(mappings, parameter, name); } } } diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java index 19d99ff..e35f2e7 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/NameProposer.java @@ -16,7 +16,6 @@ package org.quiltmc.enigma_plugin.proposal; -import org.jetbrains.annotations.Nullable; import org.quiltmc.enigma.api.analysis.index.jar.JarIndex; import org.quiltmc.enigma.api.source.TokenType; import org.quiltmc.enigma.api.translation.mapping.EntryMapping; @@ -52,24 +51,24 @@ public void insertProposal(Map, EntryMapping> mappings, Entry entry, } public void insertProposal(Map, EntryMapping> mappings, Entry entry, String name) { - this.insertProposal(mappings, null, entry, name, TokenType.JAR_PROPOSED); + this.insertProposal(mappings, entry, name, TokenType.JAR_PROPOSED); } - public void insertDynamicProposal(Map, EntryMapping> mappings, EntryRemapper remapper, Entry entry, EntryMapping mapping) { + public void insertDynamicProposal(Map, EntryMapping> mappings, Entry entry, EntryMapping mapping) { if (mapping != null) { if (mapping.targetName() != null && !mapping.targetName().isEmpty()) { - this.insertDynamicProposal(mappings, remapper, entry, mapping.targetName()); + this.insertDynamicProposal(mappings, entry, mapping.targetName()); } else { - this.insertDynamicProposal(mappings, remapper, entry, (String) null); + this.insertDynamicProposal(mappings, entry, (String) null); } } } - public void insertDynamicProposal(Map, EntryMapping> mappings, EntryRemapper remapper, Entry entry, String name) { - this.insertProposal(mappings, remapper, entry, name, TokenType.DYNAMIC_PROPOSED); + public void insertDynamicProposal(Map, EntryMapping> mappings, Entry entry, String name) { + this.insertProposal(mappings, entry, name, TokenType.DYNAMIC_PROPOSED); } - private void insertProposal(Map, EntryMapping> mappings, @Nullable EntryRemapper remapper, Entry entry, String name, TokenType tokenType) { + private void insertProposal(Map, EntryMapping> mappings, Entry entry, String name, TokenType tokenType) { if (!mappings.containsKey(entry)) { if (name != null) { EntryMapping mapping = new EntryMapping(name, null, tokenType, this.getSourcePluginId()); From f14ffc14f44dac4f54488e04f20de9a0d6f9b930 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Thu, 26 Sep 2024 17:14:04 -0500 Subject: [PATCH 07/11] Apply the lotion, I'll swim in the ocean There was a commotion, I'm sinking, I'm floating --- .../proposal/ConflictFixProposer.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java index 7a9468b..5857479 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java @@ -1,3 +1,19 @@ +/* + * Copyright 2024 QuiltMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.quiltmc.enigma_plugin.proposal; import org.quiltmc.enigma.api.analysis.index.jar.EntryIndex; From e2977e4a5221811b56ce2c4a3bef86615e0bfa47 Mon Sep 17 00:00:00 2001 From: ix0rai Date: Thu, 26 Sep 2024 17:50:58 -0500 Subject: [PATCH 08/11] i love my checkstyle --- .../enigma_plugin/proposal/ConflictFixProposer.java | 8 ++++---- .../java/org/quiltmc/enigma_plugin/NameProposalTest.java | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java index 5857479..eea11fe 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java +++ b/src/main/java/org/quiltmc/enigma_plugin/proposal/ConflictFixProposer.java @@ -41,7 +41,7 @@ public ConflictFixProposer(JarIndexer jarIndex) { @Override public void proposeDynamicNames(EntryRemapper remapper, Entry obfEntry, EntryMapping oldMapping, EntryMapping newMapping, Map, EntryMapping> mappings) { for (Map.Entry, EntryMapping> entry : mappings.entrySet()) { - fixConflicts(mappings, remapper, entry.getKey(), entry.getValue()); + this.fixConflicts(mappings, remapper, entry.getKey(), entry.getValue()); } } @@ -53,7 +53,7 @@ private void fixConflicts(Map, EntryMapping> mappings, EntryRemapper re private void fixParamConflicts(Map, EntryMapping> mappings, EntryRemapper remapper, LocalVariableEntry entry, EntryMapping mapping) { String name = mapping.targetName(); - Optional conflict = getConflictingParam(remapper, entry, name); + Optional conflict = this.getConflictingParam(remapper, entry, name); while (conflict.isPresent()) { LocalVariableEntry conflictEntry = conflict.get(); @@ -63,10 +63,10 @@ private void fixParamConflicts(Map, EntryMapping> mappings, EntryRemapp if (fallbacks != null) { for (String fallbackName : fallbacks) { - Optional newConflict = getConflictingParam(remapper, conflictEntry, fallbackName); + Optional newConflict = this.getConflictingParam(remapper, conflictEntry, fallbackName); if (newConflict.isEmpty()) { this.insertDynamicProposal(mappings, conflictEntry, fallbackName); - conflict = getConflictingParam(remapper, conflictEntry, name); + conflict = this.getConflictingParam(remapper, conflictEntry, name); fixed = true; break; } diff --git a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java index 417620d..48e7ddb 100644 --- a/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java +++ b/src/test/java/org/quiltmc/enigma_plugin/NameProposalTest.java @@ -289,7 +289,6 @@ public void testSimpleTypeSingleNames() { assertProposal("valueD", localVar(parent, 0)); } - @Test public void testSimpleTypeNameConflictFix() { // tests the conflict fixer via introducing a conflict manually From 56b282b366bc8fb8c5f51c42a1b75d3086f2ad74 Mon Sep 17 00:00:00 2001 From: IotaBread Date: Sun, 29 Sep 2024 16:43:51 -0300 Subject: [PATCH 09/11] Fix constant field name finding Follows asm commit [172221565c4347060d79285f183cdbca72344616](https://gitlab.ow2.org/asm/asm/-/commit/172221565c4347060d79285f183cdbca72344616) which changed behavior --- .../quiltmc/enigma_plugin/util/AsmUtil.java | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java index d1df2d5..2362be0 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java +++ b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java @@ -27,9 +27,13 @@ import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.ParameterNode; +import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.SourceValue; +import org.objectweb.asm.util.Textifier; +import org.objectweb.asm.util.TraceMethodVisitor; +import java.io.PrintWriter; import java.util.Optional; import java.util.function.Predicate; @@ -185,22 +189,26 @@ public static AbstractInsnNode searchInsnInStack(InsnList insns, AbstractInsnNod } } - if (!shallow && lastStackInsn != null && lastStackInsn.getOpcode() == NEW && lastStackInsn.getNext() != null && lastStackInsn.getNext().getOpcode() == DUP) { - // Find the last frame containing the DUP instruction - var dup = lastStackInsn.getNext(); - int searchFrameIndex = insns.indexOf(dup) + 1; + if (!shallow && lastStackInsn != null && lastStackInsn.getOpcode() == DUP && lastStackInsn.getPrevious() != null && lastStackInsn.getPrevious().getOpcode() == NEW) { + // Find the last frame containing two DUP instructions in the stack + // This used to search a single DUP following a NEW, but ASM commit 172221565c4347060d79285f183cdbca72344616 + // changed the behavior for DUPS to replace the previous value + // Stack before: ..., NEW ..., DUP; after: ..., DUP, DUP + int searchFrameIndex = insns.indexOf(lastStackInsn) + 1; var searchFrame = frames[searchFrameIndex]; while (searchFrame != null && searchFrameIndex <= frameIndex) { - boolean contains = false; + int count = 0; for (int j = 0; j < searchFrame.getStackSize(); j++) { - if (frame.getStack(j).insns.contains(dup)) { - contains = true; - break; + if (frame.getStack(j).insns.contains(lastStackInsn)) { + count++; + if (count == 2) { + break; + } } } - if (contains) { + if (count == 2) { searchFrameIndex++; if (searchFrameIndex < frames.length) { searchFrame = frames[searchFrameIndex]; @@ -208,7 +216,7 @@ public static AbstractInsnNode searchInsnInStack(InsnList insns, AbstractInsnNod searchFrame = null; } } else { - var insn = insns.get(searchFrameIndex - 1); // This was the last instruction with a frame with a dup + var insn = insns.get(searchFrameIndex - 1); // This was the last instruction with a frame with two dups if (insn != frameInsn) { return searchInsnInStack(insns, insn, frames, insnPredicate, false); } @@ -264,4 +272,47 @@ public static FieldInsnNode searchStaticFieldReferenceInStack(InsnList insns, Ab return null; } + + public static void printFrames(MethodNode method, Frame[] frames, PrintWriter printWriter) { + Textifier textifier = new Textifier(); + TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(textifier); + + printWriter.println(method.name + method.desc); + for (int i = 0; i < method.instructions.size(); ++i) { + StringBuilder stringBuilder = new StringBuilder(); + Frame frame = frames[i]; + if (frame == null) { + stringBuilder.append('?'); + } else { + for (int j = 0; j < frame.getLocals(); ++j) { + stringBuilder.append('[') + .append(frame.getLocal(j).insns.stream().map(insn -> method.instructions.indexOf(insn) + 100000) + .map(k -> String.valueOf(k).substring(1)) + .reduce((a, b) -> a + ", " + b).orElse("?")) + .append("] "); + } + stringBuilder.append(" : "); + for (int j = 0; j < frame.getStackSize(); ++j) { + stringBuilder.append('[') + .append(frame.getStack(j).insns.stream().map(insn -> method.instructions.indexOf(insn) + 100000) + .map(k -> String.valueOf(k).substring(1)) + .reduce((a, b) -> a + ", " + b).orElse("?")) + .append("] "); + } + } + while (stringBuilder.length() < method.maxStack + method.maxLocals + 1) { + stringBuilder.append(' '); + } + printWriter.print(Integer.toString(i + 100000).substring(1)); + + method.instructions.get(i).accept(traceMethodVisitor); + printWriter.print( + " " + stringBuilder + " : " + textifier.text.get(textifier.text.size() - 1)); + } + for (TryCatchBlockNode tryCatchBlock : method.tryCatchBlocks) { + tryCatchBlock.accept(traceMethodVisitor); + printWriter.print(" " + textifier.text.get(textifier.text.size() - 1)); + } + printWriter.println(); + } } From b181e0e843e599926717e304a4de8cd3130ba6d4 Mon Sep 17 00:00:00 2001 From: IotaBread Date: Sun, 29 Sep 2024 17:40:07 -0300 Subject: [PATCH 10/11] Remove an unused method --- .../quiltmc/enigma_plugin/util/AsmUtil.java | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java index 2362be0..3db8a56 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java +++ b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java @@ -272,47 +272,4 @@ public static FieldInsnNode searchStaticFieldReferenceInStack(InsnList insns, Ab return null; } - - public static void printFrames(MethodNode method, Frame[] frames, PrintWriter printWriter) { - Textifier textifier = new Textifier(); - TraceMethodVisitor traceMethodVisitor = new TraceMethodVisitor(textifier); - - printWriter.println(method.name + method.desc); - for (int i = 0; i < method.instructions.size(); ++i) { - StringBuilder stringBuilder = new StringBuilder(); - Frame frame = frames[i]; - if (frame == null) { - stringBuilder.append('?'); - } else { - for (int j = 0; j < frame.getLocals(); ++j) { - stringBuilder.append('[') - .append(frame.getLocal(j).insns.stream().map(insn -> method.instructions.indexOf(insn) + 100000) - .map(k -> String.valueOf(k).substring(1)) - .reduce((a, b) -> a + ", " + b).orElse("?")) - .append("] "); - } - stringBuilder.append(" : "); - for (int j = 0; j < frame.getStackSize(); ++j) { - stringBuilder.append('[') - .append(frame.getStack(j).insns.stream().map(insn -> method.instructions.indexOf(insn) + 100000) - .map(k -> String.valueOf(k).substring(1)) - .reduce((a, b) -> a + ", " + b).orElse("?")) - .append("] "); - } - } - while (stringBuilder.length() < method.maxStack + method.maxLocals + 1) { - stringBuilder.append(' '); - } - printWriter.print(Integer.toString(i + 100000).substring(1)); - - method.instructions.get(i).accept(traceMethodVisitor); - printWriter.print( - " " + stringBuilder + " : " + textifier.text.get(textifier.text.size() - 1)); - } - for (TryCatchBlockNode tryCatchBlock : method.tryCatchBlocks) { - tryCatchBlock.accept(traceMethodVisitor); - printWriter.print(" " + textifier.text.get(textifier.text.size() - 1)); - } - printWriter.println(); - } } From 01efa0caaa390313bd0d703a15d1cf38f831922c Mon Sep 17 00:00:00 2001 From: IotaBread Date: Sun, 29 Sep 2024 17:44:20 -0300 Subject: [PATCH 11/11] Remove unused imports --- src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java index 3db8a56..031a61d 100644 --- a/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java +++ b/src/main/java/org/quiltmc/enigma_plugin/util/AsmUtil.java @@ -27,13 +27,9 @@ import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.ParameterNode; -import org.objectweb.asm.tree.TryCatchBlockNode; import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.SourceValue; -import org.objectweb.asm.util.Textifier; -import org.objectweb.asm.util.TraceMethodVisitor; -import java.io.PrintWriter; import java.util.Optional; import java.util.function.Predicate;