diff options
| author | 2015-03-08 20:48:30 -0400 | |
|---|---|---|
| committer | 2015-03-08 20:48:30 -0400 | |
| commit | 4ceb8d490058e48df666bf7227ce020e60928be5 (patch) | |
| tree | bdfb432cd1d61dc4914b8591468193dcd7e7421c /src/cuchaz/enigma/mapping | |
| parent | lots of small tweaks and improvements (diff) | |
| download | enigma-fork-4ceb8d490058e48df666bf7227ce020e60928be5.tar.gz enigma-fork-4ceb8d490058e48df666bf7227ce020e60928be5.tar.xz enigma-fork-4ceb8d490058e48df666bf7227ce020e60928be5.zip | |
more tweaks, improvements, and bug fixes
Diffstat (limited to 'src/cuchaz/enigma/mapping')
| -rw-r--r-- | src/cuchaz/enigma/mapping/ArgumentMapping.java | 5 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassMapping.java | 11 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/FieldMapping.java | 26 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MethodMapping.java | 16 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Signature.java | 5 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Type.java | 13 |
6 files changed, 74 insertions, 2 deletions
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<ArgumentMapping | |||
| 25 | m_name = NameValidator.validateArgumentName(name); | 25 | m_name = NameValidator.validateArgumentName(name); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | public ArgumentMapping(ArgumentMapping other) { | ||
| 29 | m_index = other.m_index; | ||
| 30 | m_name = other.m_name; | ||
| 31 | } | ||
| 32 | |||
| 28 | public int getIndex() { | 33 | public int getIndex() { |
| 29 | return m_index; | 34 | return m_index; |
| 30 | } | 35 | } |
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index 3610e33..43605e5 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java | |||
| @@ -393,6 +393,17 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> { | |||
| 393 | } | 393 | } |
| 394 | } | 394 | } |
| 395 | 395 | ||
| 396 | // rename field types | ||
| 397 | for (FieldMapping fieldMapping : new ArrayList<FieldMapping>(m_fieldsByObf.values())) { | ||
| 398 | String oldFieldKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()); | ||
| 399 | if (fieldMapping.renameObfClass(oldObfClassName, newObfClassName)) { | ||
| 400 | boolean wasRemoved = m_fieldsByObf.remove(oldFieldKey) != null; | ||
| 401 | assert (wasRemoved); | ||
| 402 | boolean wasAdded = m_fieldsByObf.put(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()), fieldMapping) == null; | ||
| 403 | assert (wasAdded); | ||
| 404 | } | ||
| 405 | } | ||
| 406 | |||
| 396 | // rename method signatures | 407 | // rename method signatures |
| 397 | for (MethodMapping methodMapping : new ArrayList<MethodMapping>(m_methodsByObf.values())) { | 408 | for (MethodMapping methodMapping : new ArrayList<MethodMapping>(m_methodsByObf.values())) { |
| 398 | String oldMethodKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()); | 409 | 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<FieldMapping> { | |||
| 26 | m_obfType = obfType; | 26 | m_obfType = obfType; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | public FieldMapping(FieldMapping other, ClassNameReplacer obfClassNameReplacer) { | ||
| 30 | m_obfName = other.m_obfName; | ||
| 31 | m_deobfName = other.m_deobfName; | ||
| 32 | m_obfType = new Type(other.m_obfType, obfClassNameReplacer); | ||
| 33 | } | ||
| 34 | |||
| 29 | public String getObfName() { | 35 | public String getObfName() { |
| 30 | return m_obfName; | 36 | return m_obfName; |
| 31 | } | 37 | } |
| @@ -46,4 +52,24 @@ public class FieldMapping implements Serializable, Comparable<FieldMapping> { | |||
| 46 | public int compareTo(FieldMapping other) { | 52 | public int compareTo(FieldMapping other) { |
| 47 | return (m_obfName + m_obfType).compareTo(other.m_obfName + other.m_obfType); | 53 | return (m_obfName + m_obfType).compareTo(other.m_obfName + other.m_obfType); |
| 48 | } | 54 | } |
| 55 | |||
| 56 | public boolean renameObfClass(final String oldObfClassName, final String newObfClassName) { | ||
| 57 | |||
| 58 | // rename obf classes in the type | ||
| 59 | Type newType = new Type(m_obfType, new ClassNameReplacer() { | ||
| 60 | @Override | ||
| 61 | public String replace(String className) { | ||
| 62 | if (className.equals(oldObfClassName)) { | ||
| 63 | return newObfClassName; | ||
| 64 | } | ||
| 65 | return null; | ||
| 66 | } | ||
| 67 | }); | ||
| 68 | |||
| 69 | if (!newType.equals(m_obfType)) { | ||
| 70 | m_obfType = newType; | ||
| 71 | return true; | ||
| 72 | } | ||
| 73 | return false; | ||
| 74 | } | ||
| 49 | } | 75 | } |
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; | |||
| 12 | 12 | ||
| 13 | import java.io.Serializable; | 13 | import java.io.Serializable; |
| 14 | import java.util.Map; | 14 | import java.util.Map; |
| 15 | import java.util.TreeMap; | 15 | import java.util.Map.Entry; |
| 16 | |||
| 17 | import com.google.common.collect.Maps; | ||
| 16 | 18 | ||
| 17 | public class MethodMapping implements Serializable, Comparable<MethodMapping> { | 19 | public class MethodMapping implements Serializable, Comparable<MethodMapping> { |
| 18 | 20 | ||
| @@ -37,9 +39,19 @@ public class MethodMapping implements Serializable, Comparable<MethodMapping> { | |||
| 37 | m_obfName = obfName; | 39 | m_obfName = obfName; |
| 38 | m_deobfName = NameValidator.validateMethodName(deobfName); | 40 | m_deobfName = NameValidator.validateMethodName(deobfName); |
| 39 | m_obfSignature = obfSignature; | 41 | m_obfSignature = obfSignature; |
| 40 | m_arguments = new TreeMap<Integer,ArgumentMapping>(); | 42 | m_arguments = Maps.newTreeMap(); |
| 41 | } | 43 | } |
| 42 | 44 | ||
| 45 | public MethodMapping(MethodMapping other, ClassNameReplacer obfClassNameReplacer) { | ||
| 46 | m_obfName = other.m_obfName; | ||
| 47 | m_deobfName = other.m_deobfName; | ||
| 48 | m_obfSignature = new Signature(other.m_obfSignature, obfClassNameReplacer); | ||
| 49 | m_arguments = Maps.newTreeMap(); | ||
| 50 | for (Entry<Integer,ArgumentMapping> entry : other.m_arguments.entrySet()) { | ||
| 51 | m_arguments.put(entry.getKey(), new ArgumentMapping(entry.getValue())); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 43 | public String getObfName() { | 55 | public String getObfName() { |
| 44 | return m_obfName; | 56 | return m_obfName; |
| 45 | } | 57 | } |
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 { | |||
| 39 | } | 39 | } |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | public Signature(Signature other) { | ||
| 43 | m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); | ||
| 44 | m_returnType = new Type(other.m_returnType); | ||
| 45 | } | ||
| 46 | |||
| 42 | public Signature(Signature other, ClassNameReplacer replacer) { | 47 | public Signature(Signature other, ClassNameReplacer replacer) { |
| 43 | m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); | 48 | m_argumentTypes = Lists.newArrayList(other.m_argumentTypes); |
| 44 | for (int i=0; i<m_argumentTypes.size(); i++) { | 49 | for (int i=0; i<m_argumentTypes.size(); i++) { |
diff --git a/src/cuchaz/enigma/mapping/Type.java b/src/cuchaz/enigma/mapping/Type.java index d8c073e..72118b0 100644 --- a/src/cuchaz/enigma/mapping/Type.java +++ b/src/cuchaz/enigma/mapping/Type.java | |||
| @@ -68,6 +68,11 @@ public class Type implements Serializable { | |||
| 68 | if (c == 'L') { | 68 | if (c == 'L') { |
| 69 | return readClass(in); | 69 | return readClass(in); |
| 70 | } | 70 | } |
| 71 | |||
| 72 | // then check for templates | ||
| 73 | if (c == 'T') { | ||
| 74 | return readClass(in); | ||
| 75 | } | ||
| 71 | 76 | ||
| 72 | // then check for arrays | 77 | // then check for arrays |
| 73 | int dim = countArrayDimension(in); | 78 | int dim = countArrayDimension(in); |
| @@ -85,6 +90,10 @@ public class Type implements Serializable { | |||
| 85 | m_name = name; | 90 | m_name = name; |
| 86 | } | 91 | } |
| 87 | 92 | ||
| 93 | public Type(Type other) { | ||
| 94 | m_name = other.m_name; | ||
| 95 | } | ||
| 96 | |||
| 88 | public Type(ClassEntry classEntry) { | 97 | public Type(ClassEntry classEntry) { |
| 89 | m_name = "L" + classEntry.getClassName() + ";"; | 98 | m_name = "L" + classEntry.getClassName() + ";"; |
| 90 | } | 99 | } |
| @@ -128,6 +137,10 @@ public class Type implements Serializable { | |||
| 128 | return m_name.charAt(0) == 'L' && m_name.charAt(m_name.length() - 1) == ';'; | 137 | return m_name.charAt(0) == 'L' && m_name.charAt(m_name.length() - 1) == ';'; |
| 129 | } | 138 | } |
| 130 | 139 | ||
| 140 | public boolean isTemplate() { | ||
| 141 | return m_name.charAt(0) == 'T' && m_name.charAt(m_name.length() - 1) == ';'; | ||
| 142 | } | ||
| 143 | |||
| 131 | public ClassEntry getClassEntry() { | 144 | public ClassEntry getClassEntry() { |
| 132 | if (isClass()) { | 145 | if (isClass()) { |
| 133 | String name = m_name.substring(1, m_name.length() - 1); | 146 | String name = m_name.substring(1, m_name.length() - 1); |