From 0a67556e85a26bcbc17bbb8ccba1fdc97e893469 Mon Sep 17 00:00:00 2001 From: asiekierka Date: Thu, 18 Aug 2016 14:51:48 +0200 Subject: add proper propagation of argument names --- src/main/java/cuchaz/enigma/Deobfuscator.java | 2 +- .../java/cuchaz/enigma/mapping/ArgumentEntry.java | 6 ++++++ .../java/cuchaz/enigma/mapping/MappingsRenamer.java | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index b2f361e9..4bd9414d 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -463,7 +463,7 @@ public class Deobfuscator { } else if (obfEntry instanceof ConstructorEntry) { throw new IllegalArgumentException("Cannot rename constructors"); } else if (obfEntry instanceof ArgumentEntry) { - this.renamer.setArgumentName((ArgumentEntry) obfEntry, newName); + this.renamer.setArgumentTreeName((ArgumentEntry) obfEntry, newName); } else { throw new Error("Unknown entry type: " + obfEntry.getClass().getName()); } diff --git a/src/main/java/cuchaz/enigma/mapping/ArgumentEntry.java b/src/main/java/cuchaz/enigma/mapping/ArgumentEntry.java index 741849a9..662516da 100644 --- a/src/main/java/cuchaz/enigma/mapping/ArgumentEntry.java +++ b/src/main/java/cuchaz/enigma/mapping/ArgumentEntry.java @@ -46,6 +46,12 @@ public class ArgumentEntry implements Entry { this.name = other.name; } + public ArgumentEntry(ArgumentEntry other, BehaviorEntry entry) { + this.behaviorEntry = entry; + this.index = other.index; + this.name = other.name; + } + public BehaviorEntry getBehaviorEntry() { return this.behaviorEntry; } diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index 80028137..5d23dc0b 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java @@ -148,6 +148,27 @@ public class MappingsRenamer { classMapping.setMethodName(obf.getName(), obf.getSignature(), obf.getName()); } + public void setArgumentTreeName(ArgumentEntry obf, String deobfName) { + if (!(obf.getBehaviorEntry() instanceof MethodEntry)) { + setArgumentName(obf, deobfName); + return; + } + + MethodEntry obfMethod = (MethodEntry) obf.getBehaviorEntry(); + + Set implementations = m_index.getRelatedMethodImplementations(obfMethod); + for (MethodEntry entry : implementations) { + // NOTE: don't need to check arguments for name collisions with names determined by Procyon + if (m_mappings.containsArgument(entry, deobfName)) { + throw new IllegalNameException(deobfName, "There is already an argument with that name"); + } + } + + for (MethodEntry entry : implementations) { + setArgumentName(new ArgumentEntry(obf, entry), deobfName); + } + } + public void setArgumentName(ArgumentEntry obf, String deobfName) { deobfName = NameValidator.validateArgumentName(deobfName); // NOTE: don't need to check arguments for name collisions with names determined by Procyon -- cgit v1.2.3