From 4ceb8d490058e48df666bf7227ce020e60928be5 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 8 Mar 2015 20:48:30 -0400 Subject: more tweaks, improvements, and bug fixes --- src/cuchaz/enigma/mapping/ArgumentMapping.java | 5 +++++ src/cuchaz/enigma/mapping/ClassMapping.java | 11 +++++++++++ src/cuchaz/enigma/mapping/FieldMapping.java | 26 ++++++++++++++++++++++++++ src/cuchaz/enigma/mapping/MethodMapping.java | 16 ++++++++++++++-- src/cuchaz/enigma/mapping/Signature.java | 5 +++++ src/cuchaz/enigma/mapping/Type.java | 13 +++++++++++++ 6 files changed, 74 insertions(+), 2 deletions(-) (limited to 'src/cuchaz/enigma/mapping') diff --git a/src/cuchaz/enigma/mapping/ArgumentMapping.java b/src/cuchaz/enigma/mapping/ArgumentMapping.java index f4d8e77..9f366a0 100644 --- a/src/cuchaz/enigma/mapping/ArgumentMapping.java +++ b/src/cuchaz/enigma/mapping/ArgumentMapping.java @@ -25,6 +25,11 @@ public class ArgumentMapping implements Serializable, Comparable { } } + // rename field types + for (FieldMapping fieldMapping : new ArrayList(m_fieldsByObf.values())) { + String oldFieldKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()); + if (fieldMapping.renameObfClass(oldObfClassName, newObfClassName)) { + boolean wasRemoved = m_fieldsByObf.remove(oldFieldKey) != null; + assert (wasRemoved); + boolean wasAdded = m_fieldsByObf.put(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()), fieldMapping) == null; + assert (wasAdded); + } + } + // rename method signatures for (MethodMapping methodMapping : new ArrayList(m_methodsByObf.values())) { String oldMethodKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()); diff --git a/src/cuchaz/enigma/mapping/FieldMapping.java b/src/cuchaz/enigma/mapping/FieldMapping.java index 14b20dd..55b0a19 100644 --- a/src/cuchaz/enigma/mapping/FieldMapping.java +++ b/src/cuchaz/enigma/mapping/FieldMapping.java @@ -26,6 +26,12 @@ public class FieldMapping implements Serializable, Comparable { m_obfType = obfType; } + public FieldMapping(FieldMapping other, ClassNameReplacer obfClassNameReplacer) { + m_obfName = other.m_obfName; + m_deobfName = other.m_deobfName; + m_obfType = new Type(other.m_obfType, obfClassNameReplacer); + } + public String getObfName() { return m_obfName; } @@ -46,4 +52,24 @@ public class FieldMapping implements Serializable, Comparable { public int compareTo(FieldMapping other) { return (m_obfName + m_obfType).compareTo(other.m_obfName + other.m_obfType); } + + public boolean renameObfClass(final String oldObfClassName, final String newObfClassName) { + + // rename obf classes in the type + Type newType = new Type(m_obfType, new ClassNameReplacer() { + @Override + public String replace(String className) { + if (className.equals(oldObfClassName)) { + return newObfClassName; + } + return null; + } + }); + + if (!newType.equals(m_obfType)) { + m_obfType = newType; + return true; + } + return false; + } } diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java index 1704428..bf8a94f 100644 --- a/src/cuchaz/enigma/mapping/MethodMapping.java +++ b/src/cuchaz/enigma/mapping/MethodMapping.java @@ -12,7 +12,9 @@ package cuchaz.enigma.mapping; import java.io.Serializable; import java.util.Map; -import java.util.TreeMap; +import java.util.Map.Entry; + +import com.google.common.collect.Maps; public class MethodMapping implements Serializable, Comparable { @@ -37,9 +39,19 @@ public class MethodMapping implements Serializable, Comparable { m_obfName = obfName; m_deobfName = NameValidator.validateMethodName(deobfName); m_obfSignature = obfSignature; - m_arguments = new TreeMap(); + m_arguments = Maps.newTreeMap(); } + public MethodMapping(MethodMapping other, ClassNameReplacer obfClassNameReplacer) { + m_obfName = other.m_obfName; + m_deobfName = other.m_deobfName; + m_obfSignature = new Signature(other.m_obfSignature, obfClassNameReplacer); + m_arguments = Maps.newTreeMap(); + for (Entry entry : other.m_arguments.entrySet()) { + m_arguments.put(entry.getKey(), new ArgumentMapping(entry.getValue())); + } + } + public String getObfName() { return m_obfName; } diff --git a/src/cuchaz/enigma/mapping/Signature.java b/src/cuchaz/enigma/mapping/Signature.java index 273a77b..ea83e40 100644 --- a/src/cuchaz/enigma/mapping/Signature.java +++ b/src/cuchaz/enigma/mapping/Signature.java @@ -39,6 +39,11 @@ public class Signature implements Serializable { } } + public Signature(Signature other) { + m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); + m_returnType = new Type(other.m_returnType); + } + public Signature(Signature other, ClassNameReplacer replacer) { m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); for (int i=0; i