From 37cafdb5a837cbe29e4cc9a34737e24f496bc94f Mon Sep 17 00:00:00 2001 From: Runemoro Date: Fri, 22 Nov 2019 15:40:50 -0500 Subject: Correctly decompile bridges, and add command to add bridges to mappings (#180) --- .../command/MapSpecializedMethodsCommand.java | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java (limited to 'src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java') diff --git a/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java b/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java new file mode 100644 index 0000000..7696f0f --- /dev/null +++ b/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java @@ -0,0 +1,67 @@ +package cuchaz.enigma.command; + +import cuchaz.enigma.ProgressListener; +import cuchaz.enigma.analysis.ClassCache; +import cuchaz.enigma.analysis.index.BridgeMethodIndex; +import cuchaz.enigma.analysis.index.JarIndex; +import cuchaz.enigma.throwables.MappingParseException; +import cuchaz.enigma.translation.MappingTranslator; +import cuchaz.enigma.translation.Translator; +import cuchaz.enigma.translation.mapping.*; +import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; +import cuchaz.enigma.translation.mapping.tree.HashEntryTree; +import cuchaz.enigma.translation.representation.entry.MethodEntry; +import cuchaz.enigma.utils.Utils; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; + +public class MapSpecializedMethodsCommand extends Command { + public MapSpecializedMethodsCommand() { + super("map-specialized-methods"); + } + + @Override + public String getUsage() { + return " "; + } + + @Override + public boolean isValidArgument(int length) { + return length == 5; + } + + @Override + public void run(String... args) throws IOException, MappingParseException { + MappingSaveParameters saveParameters = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF); + EntryTree source = MappingCommandsUtil.read(args[1], Paths.get(args[2]), saveParameters); + EntryTree result = new HashEntryTree<>(); + Path jar = Paths.get(args[0]); + ClassCache classCache = ClassCache.of(jar); + JarIndex jarIndex = classCache.index(ProgressListener.none()); + BridgeMethodIndex bridgeMethodIndex = jarIndex.getBridgeMethodIndex(); + Translator translator = new MappingTranslator(source, jarIndex.getEntryResolver()); + + // Copy all non-specialized methods + for (EntryTreeNode node : source) { + if (!(node.getEntry() instanceof MethodEntry) || !bridgeMethodIndex.isSpecializedMethod((MethodEntry) node.getEntry())) { + result.insert(node.getEntry(), node.getValue()); + } + } + + // Add correct mappings for specialized methods + for (Map.Entry entry : bridgeMethodIndex.getBridgeToSpecialized().entrySet()) { + MethodEntry bridge = entry.getKey(); + MethodEntry specialized = entry.getValue(); + String name = translator.translate(bridge).getName(); + result.insert(specialized, new EntryMapping(name)); + } + + Path output = Paths.get(args[4]); + Utils.delete(output); + MappingCommandsUtil.write(result, args[3], output, saveParameters); + } +} -- cgit v1.2.3