diff options
| author | 2015-02-08 23:10:26 -0500 | |
|---|---|---|
| committer | 2015-02-08 23:10:26 -0500 | |
| commit | 31a1a418b04cd3e7b06cb50cb8674a2c25079f6c (patch) | |
| tree | 5914fd0c3557250dc61382a571ea3a3cdb9d941d | |
| parent | Merge with 09538fb039f2e4e5e240cfb331be512ae8740fda (diff) | |
| download | enigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.tar.gz enigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.tar.xz enigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.zip | |
added types to fields
22 files changed, 156 insertions, 157 deletions
diff --git a/src/cuchaz/enigma/Deobfuscator.java b/src/cuchaz/enigma/Deobfuscator.java index 5f61686..818bfd4 100644 --- a/src/cuchaz/enigma/Deobfuscator.java +++ b/src/cuchaz/enigma/Deobfuscator.java | |||
| @@ -141,7 +141,7 @@ public class Deobfuscator { | |||
| 141 | 141 | ||
| 142 | // fields | 142 | // fields |
| 143 | for (FieldMapping fieldMapping : Lists.newArrayList(classMapping.fields())) { | 143 | for (FieldMapping fieldMapping : Lists.newArrayList(classMapping.fields())) { |
| 144 | FieldEntry fieldEntry = new FieldEntry(obfClassEntry, fieldMapping.getObfName()); | 144 | FieldEntry fieldEntry = new FieldEntry(obfClassEntry, fieldMapping.getObfName(), fieldMapping.getObfType()); |
| 145 | ClassEntry resolvedObfClassEntry = m_jarIndex.getTranslationIndex().resolveEntryClass(fieldEntry); | 145 | ClassEntry resolvedObfClassEntry = m_jarIndex.getTranslationIndex().resolveEntryClass(fieldEntry); |
| 146 | if (resolvedObfClassEntry != null && !resolvedObfClassEntry.equals(fieldEntry.getClassEntry())) { | 146 | if (resolvedObfClassEntry != null && !resolvedObfClassEntry.equals(fieldEntry.getClassEntry())) { |
| 147 | boolean wasMoved = renamer.moveFieldToObfClass(classMapping, fieldMapping, resolvedObfClassEntry); | 147 | boolean wasMoved = renamer.moveFieldToObfClass(classMapping, fieldMapping, resolvedObfClassEntry); |
| @@ -206,7 +206,7 @@ public class Deobfuscator { | |||
| 206 | 206 | ||
| 207 | // check the fields | 207 | // check the fields |
| 208 | for (FieldMapping fieldMapping : Lists.newArrayList(classMapping.fields())) { | 208 | for (FieldMapping fieldMapping : Lists.newArrayList(classMapping.fields())) { |
| 209 | FieldEntry fieldEntry = new FieldEntry(classEntry, fieldMapping.getObfName()); | 209 | FieldEntry fieldEntry = new FieldEntry(classEntry, fieldMapping.getObfName(), fieldMapping.getObfType()); |
| 210 | if (!m_jarIndex.containsObfField(fieldEntry)) { | 210 | if (!m_jarIndex.containsObfField(fieldEntry)) { |
| 211 | System.err.println("WARNING: unable to find field " + fieldEntry + ". dropping mapping."); | 211 | System.err.println("WARNING: unable to find field " + fieldEntry + ". dropping mapping."); |
| 212 | classMapping.removeFieldMapping(fieldMapping); | 212 | classMapping.removeFieldMapping(fieldMapping); |
diff --git a/src/cuchaz/enigma/analysis/EntryRenamer.java b/src/cuchaz/enigma/analysis/EntryRenamer.java index b54489c..2f27049 100644 --- a/src/cuchaz/enigma/analysis/EntryRenamer.java +++ b/src/cuchaz/enigma/analysis/EntryRenamer.java | |||
| @@ -21,10 +21,13 @@ import com.google.common.collect.Sets; | |||
| 21 | 21 | ||
| 22 | import cuchaz.enigma.mapping.ArgumentEntry; | 22 | import cuchaz.enigma.mapping.ArgumentEntry; |
| 23 | import cuchaz.enigma.mapping.ClassEntry; | 23 | import cuchaz.enigma.mapping.ClassEntry; |
| 24 | import cuchaz.enigma.mapping.ClassNameReplacer; | ||
| 24 | import cuchaz.enigma.mapping.ConstructorEntry; | 25 | import cuchaz.enigma.mapping.ConstructorEntry; |
| 25 | import cuchaz.enigma.mapping.Entry; | 26 | import cuchaz.enigma.mapping.Entry; |
| 26 | import cuchaz.enigma.mapping.FieldEntry; | 27 | import cuchaz.enigma.mapping.FieldEntry; |
| 27 | import cuchaz.enigma.mapping.MethodEntry; | 28 | import cuchaz.enigma.mapping.MethodEntry; |
| 29 | import cuchaz.enigma.mapping.Signature; | ||
| 30 | import cuchaz.enigma.mapping.Type; | ||
| 28 | 31 | ||
| 29 | public class EntryRenamer { | 32 | public class EntryRenamer { |
| 30 | 33 | ||
| @@ -127,7 +130,7 @@ public class EntryRenamer { | |||
| 127 | } | 130 | } |
| 128 | 131 | ||
| 129 | @SuppressWarnings("unchecked") | 132 | @SuppressWarnings("unchecked") |
| 130 | public static <T> T renameClassesInThing(Map<String,String> renames, T thing) { | 133 | public static <T> T renameClassesInThing(final Map<String,String> renames, T thing) { |
| 131 | if (thing instanceof String) { | 134 | if (thing instanceof String) { |
| 132 | String stringEntry = (String)thing; | 135 | String stringEntry = (String)thing; |
| 133 | if (renames.containsKey(stringEntry)) { | 136 | if (renames.containsKey(stringEntry)) { |
| @@ -138,19 +141,23 @@ public class EntryRenamer { | |||
| 138 | return (T)new ClassEntry(renameClassesInThing(renames, classEntry.getClassName())); | 141 | return (T)new ClassEntry(renameClassesInThing(renames, classEntry.getClassName())); |
| 139 | } else if (thing instanceof FieldEntry) { | 142 | } else if (thing instanceof FieldEntry) { |
| 140 | FieldEntry fieldEntry = (FieldEntry)thing; | 143 | FieldEntry fieldEntry = (FieldEntry)thing; |
| 141 | return (T)new FieldEntry(renameClassesInThing(renames, fieldEntry.getClassEntry()), fieldEntry.getName()); | 144 | return (T)new FieldEntry( |
| 145 | renameClassesInThing(renames, fieldEntry.getClassEntry()), | ||
| 146 | fieldEntry.getName(), | ||
| 147 | renameClassesInThing(renames, fieldEntry.getType()) | ||
| 148 | ); | ||
| 142 | } else if (thing instanceof ConstructorEntry) { | 149 | } else if (thing instanceof ConstructorEntry) { |
| 143 | ConstructorEntry constructorEntry = (ConstructorEntry)thing; | 150 | ConstructorEntry constructorEntry = (ConstructorEntry)thing; |
| 144 | return (T)new ConstructorEntry( | 151 | return (T)new ConstructorEntry( |
| 145 | renameClassesInThing(renames, constructorEntry.getClassEntry()), | 152 | renameClassesInThing(renames, constructorEntry.getClassEntry()), |
| 146 | constructorEntry.getSignature() | 153 | renameClassesInThing(renames, constructorEntry.getSignature()) |
| 147 | ); | 154 | ); |
| 148 | } else if (thing instanceof MethodEntry) { | 155 | } else if (thing instanceof MethodEntry) { |
| 149 | MethodEntry methodEntry = (MethodEntry)thing; | 156 | MethodEntry methodEntry = (MethodEntry)thing; |
| 150 | return (T)new MethodEntry( | 157 | return (T)new MethodEntry( |
| 151 | renameClassesInThing(renames, methodEntry.getClassEntry()), | 158 | renameClassesInThing(renames, methodEntry.getClassEntry()), |
| 152 | methodEntry.getName(), | 159 | methodEntry.getName(), |
| 153 | methodEntry.getSignature() | 160 | renameClassesInThing(renames, methodEntry.getSignature()) |
| 154 | ); | 161 | ); |
| 155 | } else if (thing instanceof ArgumentEntry) { | 162 | } else if (thing instanceof ArgumentEntry) { |
| 156 | ArgumentEntry argumentEntry = (ArgumentEntry)thing; | 163 | ArgumentEntry argumentEntry = (ArgumentEntry)thing; |
| @@ -164,6 +171,20 @@ public class EntryRenamer { | |||
| 164 | reference.entry = renameClassesInThing(renames, reference.entry); | 171 | reference.entry = renameClassesInThing(renames, reference.entry); |
| 165 | reference.context = renameClassesInThing(renames, reference.context); | 172 | reference.context = renameClassesInThing(renames, reference.context); |
| 166 | return thing; | 173 | return thing; |
| 174 | } else if (thing instanceof Signature) { | ||
| 175 | return (T)new Signature((Signature)thing, new ClassNameReplacer() { | ||
| 176 | @Override | ||
| 177 | public String replace(String className) { | ||
| 178 | return renameClassesInThing(renames, className); | ||
| 179 | } | ||
| 180 | }); | ||
| 181 | } else if (thing instanceof Type) { | ||
| 182 | return (T)new Type((Type)thing, new ClassNameReplacer() { | ||
| 183 | @Override | ||
| 184 | public String replace(String className) { | ||
| 185 | return renameClassesInThing(renames, className); | ||
| 186 | } | ||
| 187 | }); | ||
| 167 | } | 188 | } |
| 168 | 189 | ||
| 169 | return thing; | 190 | return thing; |
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index 3aac8bd..f54beda 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -57,7 +57,6 @@ public class JarIndex { | |||
| 57 | private TranslationIndex m_translationIndex; | 57 | private TranslationIndex m_translationIndex; |
| 58 | private Multimap<String,String> m_interfaces; | 58 | private Multimap<String,String> m_interfaces; |
| 59 | private Map<Entry,Access> m_access; | 59 | private Map<Entry,Access> m_access; |
| 60 | private Map<FieldEntry,ClassEntry> m_fieldClasses; // TODO: this will become obsolete! | ||
| 61 | private Multimap<String,MethodEntry> m_methodImplementations; | 60 | private Multimap<String,MethodEntry> m_methodImplementations; |
| 62 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; | 61 | private Multimap<BehaviorEntry,EntryReference<BehaviorEntry,BehaviorEntry>> m_behaviorReferences; |
| 63 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; | 62 | private Multimap<FieldEntry,EntryReference<FieldEntry,BehaviorEntry>> m_fieldReferences; |
| @@ -70,7 +69,6 @@ public class JarIndex { | |||
| 70 | m_translationIndex = new TranslationIndex(); | 69 | m_translationIndex = new TranslationIndex(); |
| 71 | m_interfaces = HashMultimap.create(); | 70 | m_interfaces = HashMultimap.create(); |
| 72 | m_access = Maps.newHashMap(); | 71 | m_access = Maps.newHashMap(); |
| 73 | m_fieldClasses = Maps.newHashMap(); | ||
| 74 | m_methodImplementations = HashMultimap.create(); | 72 | m_methodImplementations = HashMultimap.create(); |
| 75 | m_behaviorReferences = HashMultimap.create(); | 73 | m_behaviorReferences = HashMultimap.create(); |
| 76 | m_fieldReferences = HashMultimap.create(); | 74 | m_fieldReferences = HashMultimap.create(); |
| @@ -114,9 +112,6 @@ public class JarIndex { | |||
| 114 | } | 112 | } |
| 115 | m_interfaces.put(className, interfaceName); | 113 | m_interfaces.put(className, interfaceName); |
| 116 | } | 114 | } |
| 117 | for (CtField field : c.getDeclaredFields()) { | ||
| 118 | indexField(field); | ||
| 119 | } | ||
| 120 | for (CtBehavior behavior : c.getDeclaredBehaviors()) { | 115 | for (CtBehavior behavior : c.getDeclaredBehaviors()) { |
| 121 | indexBehavior(behavior); | 116 | indexBehavior(behavior); |
| 122 | } | 117 | } |
| @@ -169,18 +164,6 @@ public class JarIndex { | |||
| 169 | } | 164 | } |
| 170 | } | 165 | } |
| 171 | 166 | ||
| 172 | private void indexField(CtField field) { | ||
| 173 | // get the field entry | ||
| 174 | String className = Descriptor.toJvmName(field.getDeclaringClass().getName()); | ||
| 175 | FieldEntry fieldEntry = new FieldEntry(new ClassEntry(className), field.getName()); | ||
| 176 | |||
| 177 | // is the field a class type? | ||
| 178 | if (field.getSignature().startsWith("L")) { | ||
| 179 | ClassEntry fieldTypeEntry = new ClassEntry(field.getSignature().substring(1, field.getSignature().length() - 1)); | ||
| 180 | m_fieldClasses.put(fieldEntry, fieldTypeEntry); | ||
| 181 | } | ||
| 182 | } | ||
| 183 | |||
| 184 | private void indexBehavior(CtBehavior behavior) { | 167 | private void indexBehavior(CtBehavior behavior) { |
| 185 | // get the behavior entry | 168 | // get the behavior entry |
| 186 | final BehaviorEntry behaviorEntry = BehaviorEntryFactory.create(behavior); | 169 | final BehaviorEntry behaviorEntry = BehaviorEntryFactory.create(behavior); |
| @@ -222,7 +205,7 @@ public class JarIndex { | |||
| 222 | FieldEntry calledFieldEntry = JavassistUtil.getFieldEntry(call); | 205 | FieldEntry calledFieldEntry = JavassistUtil.getFieldEntry(call); |
| 223 | ClassEntry resolvedClassEntry = m_translationIndex.resolveEntryClass(calledFieldEntry); | 206 | ClassEntry resolvedClassEntry = m_translationIndex.resolveEntryClass(calledFieldEntry); |
| 224 | if (resolvedClassEntry != null && !resolvedClassEntry.equals(calledFieldEntry.getClassEntry())) { | 207 | if (resolvedClassEntry != null && !resolvedClassEntry.equals(calledFieldEntry.getClassEntry())) { |
| 225 | calledFieldEntry = new FieldEntry(resolvedClassEntry, call.getFieldName()); | 208 | calledFieldEntry = new FieldEntry(calledFieldEntry, resolvedClassEntry); |
| 226 | } | 209 | } |
| 227 | EntryReference<FieldEntry,BehaviorEntry> reference = new EntryReference<FieldEntry,BehaviorEntry>( | 210 | EntryReference<FieldEntry,BehaviorEntry> reference = new EntryReference<FieldEntry,BehaviorEntry>( |
| 228 | calledFieldEntry, | 211 | calledFieldEntry, |
| @@ -448,8 +431,7 @@ public class JarIndex { | |||
| 448 | // does the caller use this type? | 431 | // does the caller use this type? |
| 449 | BehaviorEntry caller = references.iterator().next().context; | 432 | BehaviorEntry caller = references.iterator().next().context; |
| 450 | for (FieldEntry fieldEntry : getReferencedFields(caller)) { | 433 | for (FieldEntry fieldEntry : getReferencedFields(caller)) { |
| 451 | ClassEntry fieldClass = getFieldClass(fieldEntry); | 434 | if (fieldEntry.getType().hasClass() && fieldEntry.getType().getClassEntry().equals(innerClassEntry)) { |
| 452 | if (fieldClass != null && fieldClass.equals(innerClassEntry)) { | ||
| 453 | // caller references this type, so it can't be anonymous | 435 | // caller references this type, so it can't be anonymous |
| 454 | return null; | 436 | return null; |
| 455 | } | 437 | } |
| @@ -475,10 +457,6 @@ public class JarIndex { | |||
| 475 | return m_access.get(entry); | 457 | return m_access.get(entry); |
| 476 | } | 458 | } |
| 477 | 459 | ||
| 478 | public ClassEntry getFieldClass(FieldEntry fieldEntry) { | ||
| 479 | return m_fieldClasses.get(fieldEntry); | ||
| 480 | } | ||
| 481 | |||
| 482 | public ClassInheritanceTreeNode getClassInheritance(Translator deobfuscatingTranslator, ClassEntry obfClassEntry) { | 460 | public ClassInheritanceTreeNode getClassInheritance(Translator deobfuscatingTranslator, ClassEntry obfClassEntry) { |
| 483 | 461 | ||
| 484 | // get the root node | 462 | // get the root node |
diff --git a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java index 4155128..f15a724 100644 --- a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java +++ b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java | |||
| @@ -36,6 +36,7 @@ import cuchaz.enigma.mapping.ConstructorEntry; | |||
| 36 | import cuchaz.enigma.mapping.FieldEntry; | 36 | import cuchaz.enigma.mapping.FieldEntry; |
| 37 | import cuchaz.enigma.mapping.MethodEntry; | 37 | import cuchaz.enigma.mapping.MethodEntry; |
| 38 | import cuchaz.enigma.mapping.Signature; | 38 | import cuchaz.enigma.mapping.Signature; |
| 39 | import cuchaz.enigma.mapping.Type; | ||
| 39 | 40 | ||
| 40 | public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { | 41 | public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { |
| 41 | 42 | ||
| @@ -100,7 +101,7 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { | |||
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName()); | 103 | ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName()); |
| 103 | FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName()); | 104 | FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName(), new Type(ref.getSignature())); |
| 104 | index.addReference(node.getMemberNameToken(), fieldEntry, m_behaviorEntry); | 105 | index.addReference(node.getMemberNameToken(), fieldEntry, m_behaviorEntry); |
| 105 | } | 106 | } |
| 106 | 107 | ||
| @@ -140,7 +141,7 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { | |||
| 140 | MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE); | 141 | MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE); |
| 141 | if (ref != null) { | 142 | if (ref != null) { |
| 142 | ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName()); | 143 | ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName()); |
| 143 | FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName()); | 144 | FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName(), new Type(ref.getSignature())); |
| 144 | index.addReference(node.getIdentifierToken(), fieldEntry, m_behaviorEntry); | 145 | index.addReference(node.getIdentifierToken(), fieldEntry, m_behaviorEntry); |
| 145 | } | 146 | } |
| 146 | 147 | ||
diff --git a/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java index 7222035..e2ff300 100644 --- a/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java +++ b/src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java | |||
| @@ -31,6 +31,7 @@ import cuchaz.enigma.mapping.ClassEntry; | |||
| 31 | import cuchaz.enigma.mapping.ConstructorEntry; | 31 | import cuchaz.enigma.mapping.ConstructorEntry; |
| 32 | import cuchaz.enigma.mapping.FieldEntry; | 32 | import cuchaz.enigma.mapping.FieldEntry; |
| 33 | import cuchaz.enigma.mapping.Signature; | 33 | import cuchaz.enigma.mapping.Signature; |
| 34 | import cuchaz.enigma.mapping.Type; | ||
| 34 | 35 | ||
| 35 | public class SourceIndexClassVisitor extends SourceIndexVisitor { | 36 | public class SourceIndexClassVisitor extends SourceIndexVisitor { |
| 36 | 37 | ||
| @@ -94,7 +95,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { | |||
| 94 | public Void visitFieldDeclaration(FieldDeclaration node, SourceIndex index) { | 95 | public Void visitFieldDeclaration(FieldDeclaration node, SourceIndex index) { |
| 95 | FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); | 96 | FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); |
| 96 | ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); | 97 | ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); |
| 97 | FieldEntry fieldEntry = new FieldEntry(classEntry, def.getName()); | 98 | FieldEntry fieldEntry = new FieldEntry(classEntry, def.getName(), new Type(def.getSignature())); |
| 98 | assert (node.getVariables().size() == 1); | 99 | assert (node.getVariables().size() == 1); |
| 99 | VariableInitializer variable = node.getVariables().firstOrNullObject(); | 100 | VariableInitializer variable = node.getVariables().firstOrNullObject(); |
| 100 | index.addDeclaration(variable.getNameToken(), fieldEntry); | 101 | index.addDeclaration(variable.getNameToken(), fieldEntry); |
| @@ -107,7 +108,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { | |||
| 107 | // treat enum declarations as field declarations | 108 | // treat enum declarations as field declarations |
| 108 | FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); | 109 | FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); |
| 109 | ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); | 110 | ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); |
| 110 | FieldEntry fieldEntry = new FieldEntry(classEntry, def.getName()); | 111 | FieldEntry fieldEntry = new FieldEntry(classEntry, def.getName(), new Type(def.getSignature())); |
| 111 | index.addDeclaration(node.getNameToken(), fieldEntry); | 112 | index.addDeclaration(node.getNameToken(), fieldEntry); |
| 112 | 113 | ||
| 113 | return recurse(node, index); | 114 | return recurse(node, index); |
diff --git a/src/cuchaz/enigma/bytecode/ClassTranslator.java b/src/cuchaz/enigma/bytecode/ClassTranslator.java index afd3a77..4dba0d8 100644 --- a/src/cuchaz/enigma/bytecode/ClassTranslator.java +++ b/src/cuchaz/enigma/bytecode/ClassTranslator.java | |||
| @@ -55,7 +55,8 @@ public class ClassTranslator { | |||
| 55 | // translate the name | 55 | // translate the name |
| 56 | FieldEntry entry = new FieldEntry( | 56 | FieldEntry entry = new FieldEntry( |
| 57 | new ClassEntry(Descriptor.toJvmName(constants.getFieldrefClassName(i))), | 57 | new ClassEntry(Descriptor.toJvmName(constants.getFieldrefClassName(i))), |
| 58 | constants.getFieldrefName(i) | 58 | constants.getFieldrefName(i), |
| 59 | new Type(constants.getFieldrefType(i)) | ||
| 59 | ); | 60 | ); |
| 60 | FieldEntry translatedEntry = m_translator.translateEntry(entry); | 61 | FieldEntry translatedEntry = m_translator.translateEntry(entry); |
| 61 | 62 | ||
| @@ -94,7 +95,7 @@ public class ClassTranslator { | |||
| 94 | for (CtField field : c.getDeclaredFields()) { | 95 | for (CtField field : c.getDeclaredFields()) { |
| 95 | 96 | ||
| 96 | // translate the name | 97 | // translate the name |
| 97 | FieldEntry entry = new FieldEntry(classEntry, field.getName()); | 98 | FieldEntry entry = JavassistUtil.getFieldEntry(field); |
| 98 | String translatedName = m_translator.translate(entry); | 99 | String translatedName = m_translator.translate(entry); |
| 99 | if (translatedName != null) { | 100 | if (translatedName != null) { |
| 100 | field.setName(translatedName); | 101 | field.setName(translatedName); |
diff --git a/src/cuchaz/enigma/convert/ClassIdentity.java b/src/cuchaz/enigma/convert/ClassIdentity.java index 1be6123..bb729a3 100644 --- a/src/cuchaz/enigma/convert/ClassIdentity.java +++ b/src/cuchaz/enigma/convert/ClassIdentity.java | |||
| @@ -116,7 +116,7 @@ public class ClassIdentity { | |||
| 116 | m_references = HashMultiset.create(); | 116 | m_references = HashMultiset.create(); |
| 117 | if (useReferences) { | 117 | if (useReferences) { |
| 118 | for (CtField field : c.getDeclaredFields()) { | 118 | for (CtField field : c.getDeclaredFields()) { |
| 119 | FieldEntry fieldEntry = new FieldEntry(m_classEntry, field.getName()); | 119 | FieldEntry fieldEntry = JavassistUtil.getFieldEntry(field); |
| 120 | for (EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences(fieldEntry)) { | 120 | for (EntryReference<FieldEntry,BehaviorEntry> reference : index.getFieldReferences(fieldEntry)) { |
| 121 | addReference(reference); | 121 | addReference(reference); |
| 122 | } | 122 | } |
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java index ca39c42..187ef5b 100644 --- a/src/cuchaz/enigma/gui/Gui.java +++ b/src/cuchaz/enigma/gui/Gui.java | |||
| @@ -874,6 +874,7 @@ public class Gui { | |||
| 874 | private void showFieldEntry(FieldEntry entry) { | 874 | private void showFieldEntry(FieldEntry entry) { |
| 875 | addNameValue(m_infoPanel, "Field", entry.getName()); | 875 | addNameValue(m_infoPanel, "Field", entry.getName()); |
| 876 | addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); | 876 | addNameValue(m_infoPanel, "Class", entry.getClassEntry().getName()); |
| 877 | addNameValue(m_infoPanel, "Type", entry.getType().toString()); | ||
| 877 | } | 878 | } |
| 878 | 879 | ||
| 879 | private void showMethodEntry(MethodEntry entry) { | 880 | private void showMethodEntry(MethodEntry entry) { |
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index e2c3d56..7133265 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java | |||
| @@ -152,78 +152,92 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> { | |||
| 152 | return m_fieldsByObf.values(); | 152 | return m_fieldsByObf.values(); |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | public boolean containsObfField(String obfName) { | 155 | public boolean containsObfField(String obfName, Type obfType) { |
| 156 | return m_fieldsByObf.containsKey(obfName); | 156 | return m_fieldsByObf.containsKey(getFieldKey(obfName, obfType)); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | public boolean containsDeobfField(String deobfName) { | 159 | public boolean containsDeobfField(String deobfName, Type deobfType) { |
| 160 | return m_fieldsByDeobf.containsKey(deobfName); | 160 | return m_fieldsByDeobf.containsKey(getFieldKey(deobfName, deobfType)); |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | public void addFieldMapping(FieldMapping fieldMapping) { | 163 | public void addFieldMapping(FieldMapping fieldMapping) { |
| 164 | if (m_fieldsByObf.containsKey(fieldMapping.getObfName())) { | 164 | String obfKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()); |
| 165 | throw new Error("Already have mapping for " + m_obfName + "." + fieldMapping.getObfName()); | 165 | if (m_fieldsByObf.containsKey(obfKey)) { |
| 166 | throw new Error("Already have mapping for " + m_obfName + "." + obfKey); | ||
| 166 | } | 167 | } |
| 167 | if (m_fieldsByDeobf.containsKey(fieldMapping.getDeobfName())) { | 168 | String deobfKey = getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType()); |
| 168 | throw new Error("Already have mapping for " + m_deobfName + "." + fieldMapping.getDeobfName()); | 169 | if (m_fieldsByDeobf.containsKey(deobfKey)) { |
| 170 | throw new Error("Already have mapping for " + m_deobfName + "." + deobfKey); | ||
| 169 | } | 171 | } |
| 170 | boolean obfWasAdded = m_fieldsByObf.put(fieldMapping.getObfName(), fieldMapping) == null; | 172 | boolean obfWasAdded = m_fieldsByObf.put(obfKey, fieldMapping) == null; |
| 171 | assert (obfWasAdded); | 173 | assert (obfWasAdded); |
| 172 | boolean deobfWasAdded = m_fieldsByDeobf.put(fieldMapping.getDeobfName(), fieldMapping) == null; | 174 | boolean deobfWasAdded = m_fieldsByDeobf.put(deobfKey, fieldMapping) == null; |
| 173 | assert (deobfWasAdded); | 175 | assert (deobfWasAdded); |
| 174 | assert (m_fieldsByObf.size() == m_fieldsByDeobf.size()); | 176 | assert (m_fieldsByObf.size() == m_fieldsByDeobf.size()); |
| 175 | } | 177 | } |
| 176 | 178 | ||
| 177 | public void removeFieldMapping(FieldMapping fieldMapping) { | 179 | public void removeFieldMapping(FieldMapping fieldMapping) { |
| 178 | boolean obfWasRemoved = m_fieldsByObf.remove(fieldMapping.getObfName()) != null; | 180 | boolean obfWasRemoved = m_fieldsByObf.remove(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType())) != null; |
| 179 | assert (obfWasRemoved); | 181 | assert (obfWasRemoved); |
| 180 | if (fieldMapping.getDeobfName() != null) { | 182 | if (fieldMapping.getDeobfName() != null) { |
| 181 | boolean deobfWasRemoved = m_fieldsByDeobf.remove(fieldMapping.getDeobfName()) != null; | 183 | boolean deobfWasRemoved = m_fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType())) != null; |
| 182 | assert (deobfWasRemoved); | 184 | assert (deobfWasRemoved); |
| 183 | } | 185 | } |
| 184 | } | 186 | } |
| 185 | 187 | ||
| 186 | public FieldMapping getFieldByObf(String obfName) { | 188 | public FieldMapping getFieldByObf(String obfName, Type obfType) { |
| 187 | return m_fieldsByObf.get(obfName); | 189 | return m_fieldsByObf.get(getFieldKey(obfName, obfType)); |
| 188 | } | 190 | } |
| 189 | 191 | ||
| 190 | public FieldMapping getFieldByDeobf(String deobfName) { | 192 | public FieldMapping getFieldByDeobf(String deobfName, Type obfType) { |
| 191 | return m_fieldsByDeobf.get(deobfName); | 193 | return m_fieldsByDeobf.get(getFieldKey(deobfName, obfType)); |
| 192 | } | 194 | } |
| 193 | 195 | ||
| 194 | public String getObfFieldName(String deobfName) { | 196 | public String getObfFieldName(String deobfName, Type obfType) { |
| 195 | FieldMapping fieldMapping = m_fieldsByDeobf.get(deobfName); | 197 | FieldMapping fieldMapping = m_fieldsByDeobf.get(getFieldKey(deobfName, obfType)); |
| 196 | if (fieldMapping != null) { | 198 | if (fieldMapping != null) { |
| 197 | return fieldMapping.getObfName(); | 199 | return fieldMapping.getObfName(); |
| 198 | } | 200 | } |
| 199 | return null; | 201 | return null; |
| 200 | } | 202 | } |
| 201 | 203 | ||
| 202 | public String getDeobfFieldName(String obfName) { | 204 | public String getDeobfFieldName(String obfName, Type obfType) { |
| 203 | FieldMapping fieldMapping = m_fieldsByObf.get(obfName); | 205 | FieldMapping fieldMapping = m_fieldsByObf.get(getFieldKey(obfName, obfType)); |
| 204 | if (fieldMapping != null) { | 206 | if (fieldMapping != null) { |
| 205 | return fieldMapping.getDeobfName(); | 207 | return fieldMapping.getDeobfName(); |
| 206 | } | 208 | } |
| 207 | return null; | 209 | return null; |
| 208 | } | 210 | } |
| 209 | 211 | ||
| 210 | public void setFieldName(String obfName, String deobfName) { | 212 | private String getFieldKey(String name, Type type) { |
| 211 | FieldMapping fieldMapping = m_fieldsByObf.get(obfName); | 213 | if (name == null) { |
| 214 | throw new IllegalArgumentException("name cannot be null!"); | ||
| 215 | } | ||
| 216 | if (type == null) { | ||
| 217 | throw new IllegalArgumentException("type cannot be null!"); | ||
| 218 | } | ||
| 219 | return name + ":" + type; | ||
| 220 | } | ||
| 221 | |||
| 222 | |||
| 223 | public void setFieldName(String obfName, Type obfType, String deobfName) { | ||
| 224 | FieldMapping fieldMapping = m_fieldsByObf.get(getFieldKey(obfName, obfType)); | ||
| 212 | if (fieldMapping == null) { | 225 | if (fieldMapping == null) { |
| 213 | fieldMapping = new FieldMapping(obfName, deobfName); | 226 | fieldMapping = new FieldMapping(obfName, obfType, deobfName); |
| 214 | boolean obfWasAdded = m_fieldsByObf.put(obfName, fieldMapping) == null; | 227 | boolean obfWasAdded = m_fieldsByObf.put(getFieldKey(obfName, obfType), fieldMapping) == null; |
| 215 | assert (obfWasAdded); | 228 | assert (obfWasAdded); |
| 216 | } else { | 229 | } else { |
| 217 | boolean wasRemoved = m_fieldsByDeobf.remove(fieldMapping.getDeobfName()) != null; | 230 | boolean wasRemoved = m_fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), obfType)) != null; |
| 218 | assert (wasRemoved); | 231 | assert (wasRemoved); |
| 219 | } | 232 | } |
| 220 | fieldMapping.setDeobfName(deobfName); | 233 | fieldMapping.setDeobfName(deobfName); |
| 221 | if (deobfName != null) { | 234 | if (deobfName != null) { |
| 222 | boolean wasAdded = m_fieldsByDeobf.put(deobfName, fieldMapping) == null; | 235 | boolean wasAdded = m_fieldsByDeobf.put(getFieldKey(deobfName, obfType), fieldMapping) == null; |
| 223 | assert (wasAdded); | 236 | assert (wasAdded); |
| 224 | } | 237 | } |
| 225 | } | 238 | } |
| 226 | 239 | ||
| 240 | |||
| 227 | //// METHODS //////// | 241 | //// METHODS //////// |
| 228 | 242 | ||
| 229 | public Iterable<MethodMapping> methods() { | 243 | public Iterable<MethodMapping> methods() { |
| @@ -235,8 +249,8 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> { | |||
| 235 | return m_methodsByObf.containsKey(getMethodKey(obfName, obfSignature)); | 249 | return m_methodsByObf.containsKey(getMethodKey(obfName, obfSignature)); |
| 236 | } | 250 | } |
| 237 | 251 | ||
| 238 | public boolean containsDeobfMethod(String deobfName, Signature deobfSignature) { | 252 | public boolean containsDeobfMethod(String deobfName, Signature obfSignature) { |
| 239 | return m_methodsByDeobf.containsKey(getMethodKey(deobfName, deobfSignature)); | 253 | return m_methodsByDeobf.containsKey(getMethodKey(deobfName, obfSignature)); |
| 240 | } | 254 | } |
| 241 | 255 | ||
| 242 | public void addMethodMapping(MethodMapping methodMapping) { | 256 | public void addMethodMapping(MethodMapping methodMapping) { |
| @@ -266,12 +280,12 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> { | |||
| 266 | } | 280 | } |
| 267 | } | 281 | } |
| 268 | 282 | ||
| 269 | public MethodMapping getMethodByObf(String obfName, Signature signature) { | 283 | public MethodMapping getMethodByObf(String obfName, Signature obfSignature) { |
| 270 | return m_methodsByObf.get(getMethodKey(obfName, signature)); | 284 | return m_methodsByObf.get(getMethodKey(obfName, obfSignature)); |
| 271 | } | 285 | } |
| 272 | 286 | ||
| 273 | public MethodMapping getMethodByDeobf(String deobfName, Signature signature) { | 287 | public MethodMapping getMethodByDeobf(String deobfName, Signature obfSignature) { |
| 274 | return m_methodsByDeobf.get(getMethodKey(deobfName, signature)); | 288 | return m_methodsByDeobf.get(getMethodKey(deobfName, obfSignature)); |
| 275 | } | 289 | } |
| 276 | 290 | ||
| 277 | private String getMethodKey(String name, Signature signature) { | 291 | private String getMethodKey(String name, Signature signature) { |
diff --git a/src/cuchaz/enigma/mapping/FieldEntry.java b/src/cuchaz/enigma/mapping/FieldEntry.java index 6cc9eb7..7517254 100644 --- a/src/cuchaz/enigma/mapping/FieldEntry.java +++ b/src/cuchaz/enigma/mapping/FieldEntry.java | |||
| @@ -20,28 +20,33 @@ public class FieldEntry implements Entry, Serializable { | |||
| 20 | 20 | ||
| 21 | private ClassEntry m_classEntry; | 21 | private ClassEntry m_classEntry; |
| 22 | private String m_name; | 22 | private String m_name; |
| 23 | private Type m_type; | ||
| 23 | 24 | ||
| 24 | // NOTE: this argument order is important for the MethodReader/MethodWriter | 25 | // NOTE: this argument order is important for the MethodReader/MethodWriter |
| 25 | public FieldEntry(ClassEntry classEntry, String name) { | 26 | public FieldEntry(ClassEntry classEntry, String name, Type type) { |
| 26 | if (classEntry == null) { | 27 | if (classEntry == null) { |
| 27 | throw new IllegalArgumentException("Class cannot be null!"); | 28 | throw new IllegalArgumentException("Class cannot be null!"); |
| 28 | } | 29 | } |
| 29 | if (name == null) { | 30 | if (name == null) { |
| 30 | throw new IllegalArgumentException("Field name cannot be null!"); | 31 | throw new IllegalArgumentException("Field name cannot be null!"); |
| 31 | } | 32 | } |
| 33 | if (type == null) { | ||
| 34 | throw new IllegalArgumentException("Field type cannot be null!"); | ||
| 35 | } | ||
| 32 | 36 | ||
| 33 | m_classEntry = classEntry; | 37 | m_classEntry = classEntry; |
| 34 | m_name = name; | 38 | m_name = name; |
| 39 | m_type = type; | ||
| 35 | } | 40 | } |
| 36 | 41 | ||
| 37 | public FieldEntry(FieldEntry other) { | 42 | public FieldEntry(FieldEntry other) { |
| 38 | m_classEntry = new ClassEntry(other.m_classEntry); | 43 | this(other, new ClassEntry(other.m_classEntry)); |
| 39 | m_name = other.m_name; | ||
| 40 | } | 44 | } |
| 41 | 45 | ||
| 42 | public FieldEntry(FieldEntry other, String newClassName) { | 46 | public FieldEntry(FieldEntry other, ClassEntry newClassEntry) { |
| 43 | m_classEntry = new ClassEntry(newClassName); | 47 | m_classEntry = newClassEntry; |
| 44 | m_name = other.m_name; | 48 | m_name = other.m_name; |
| 49 | m_type = other.m_type; | ||
| 45 | } | 50 | } |
| 46 | 51 | ||
| 47 | @Override | 52 | @Override |
| @@ -59,14 +64,18 @@ public class FieldEntry implements Entry, Serializable { | |||
| 59 | return m_classEntry.getName(); | 64 | return m_classEntry.getName(); |
| 60 | } | 65 | } |
| 61 | 66 | ||
| 67 | public Type getType() { | ||
| 68 | return m_type; | ||
| 69 | } | ||
| 70 | |||
| 62 | @Override | 71 | @Override |
| 63 | public FieldEntry cloneToNewClass(ClassEntry classEntry) { | 72 | public FieldEntry cloneToNewClass(ClassEntry classEntry) { |
| 64 | return new FieldEntry(this, classEntry.getName()); | 73 | return new FieldEntry(this, classEntry); |
| 65 | } | 74 | } |
| 66 | 75 | ||
| 67 | @Override | 76 | @Override |
| 68 | public int hashCode() { | 77 | public int hashCode() { |
| 69 | return Util.combineHashesOrdered(m_classEntry, m_name); | 78 | return Util.combineHashesOrdered(m_classEntry, m_name, m_type); |
| 70 | } | 79 | } |
| 71 | 80 | ||
| 72 | @Override | 81 | @Override |
| @@ -78,11 +87,13 @@ public class FieldEntry implements Entry, Serializable { | |||
| 78 | } | 87 | } |
| 79 | 88 | ||
| 80 | public boolean equals(FieldEntry other) { | 89 | public boolean equals(FieldEntry other) { |
| 81 | return m_classEntry.equals(other.m_classEntry) && m_name.equals(other.m_name); | 90 | return m_classEntry.equals(other.m_classEntry) |
| 91 | && m_name.equals(other.m_name) | ||
| 92 | && m_type.equals(other.m_type); | ||
| 82 | } | 93 | } |
| 83 | 94 | ||
| 84 | @Override | 95 | @Override |
| 85 | public String toString() { | 96 | public String toString() { |
| 86 | return m_classEntry.getName() + "." + m_name; | 97 | return m_classEntry.getName() + "." + m_name + ":" + m_type; |
| 87 | } | 98 | } |
| 88 | } | 99 | } |
diff --git a/src/cuchaz/enigma/mapping/FieldMapping.java b/src/cuchaz/enigma/mapping/FieldMapping.java index 5f5c270..14b20dd 100644 --- a/src/cuchaz/enigma/mapping/FieldMapping.java +++ b/src/cuchaz/enigma/mapping/FieldMapping.java | |||
| @@ -18,10 +18,12 @@ public class FieldMapping implements Serializable, Comparable<FieldMapping> { | |||
| 18 | 18 | ||
| 19 | private String m_obfName; | 19 | private String m_obfName; |
| 20 | private String m_deobfName; | 20 | private String m_deobfName; |
| 21 | private Type m_obfType; | ||
| 21 | 22 | ||
| 22 | public FieldMapping(String obfName, String deobfName) { | 23 | public FieldMapping(String obfName, Type obfType, String deobfName) { |
| 23 | m_obfName = obfName; | 24 | m_obfName = obfName; |
| 24 | m_deobfName = NameValidator.validateFieldName(deobfName); | 25 | m_deobfName = NameValidator.validateFieldName(deobfName); |
| 26 | m_obfType = obfType; | ||
| 25 | } | 27 | } |
| 26 | 28 | ||
| 27 | public String getObfName() { | 29 | public String getObfName() { |
| @@ -36,8 +38,12 @@ public class FieldMapping implements Serializable, Comparable<FieldMapping> { | |||
| 36 | m_deobfName = NameValidator.validateFieldName(val); | 38 | m_deobfName = NameValidator.validateFieldName(val); |
| 37 | } | 39 | } |
| 38 | 40 | ||
| 41 | public Type getObfType() { | ||
| 42 | return m_obfType; | ||
| 43 | } | ||
| 44 | |||
| 39 | @Override | 45 | @Override |
| 40 | public int compareTo(FieldMapping other) { | 46 | public int compareTo(FieldMapping other) { |
| 41 | return m_obfName.compareTo(other.m_obfName); | 47 | return (m_obfName + m_obfType).compareTo(other.m_obfName + other.m_obfType); |
| 42 | } | 48 | } |
| 43 | } | 49 | } |
diff --git a/src/cuchaz/enigma/mapping/JavassistUtil.java b/src/cuchaz/enigma/mapping/JavassistUtil.java index 0c446c4..0d6ce6a 100644 --- a/src/cuchaz/enigma/mapping/JavassistUtil.java +++ b/src/cuchaz/enigma/mapping/JavassistUtil.java | |||
| @@ -70,14 +70,16 @@ public class JavassistUtil { | |||
| 70 | public static FieldEntry getFieldEntry(CtField field) { | 70 | public static FieldEntry getFieldEntry(CtField field) { |
| 71 | return new FieldEntry( | 71 | return new FieldEntry( |
| 72 | getClassEntry(field.getDeclaringClass()), | 72 | getClassEntry(field.getDeclaringClass()), |
| 73 | field.getName() | 73 | field.getName(), |
| 74 | new Type(field.getFieldInfo().getDescriptor()) | ||
| 74 | ); | 75 | ); |
| 75 | } | 76 | } |
| 76 | 77 | ||
| 77 | public static FieldEntry getFieldEntry(FieldAccess call) { | 78 | public static FieldEntry getFieldEntry(FieldAccess call) { |
| 78 | return new FieldEntry( | 79 | return new FieldEntry( |
| 79 | new ClassEntry(Descriptor.toJvmName(call.getClassName())), | 80 | new ClassEntry(Descriptor.toJvmName(call.getClassName())), |
| 80 | call.getFieldName() | 81 | call.getFieldName(), |
| 82 | new Type(call.getSignature()) | ||
| 81 | ); | 83 | ); |
| 82 | } | 84 | } |
| 83 | } | 85 | } |
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 57d8001..675fdf1 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -162,10 +162,10 @@ public class Mappings implements Serializable { | |||
| 162 | return m_classesByDeobf.containsKey(deobfName); | 162 | return m_classesByDeobf.containsKey(deobfName); |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName) { | 165 | public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName, Type obfType) { |
| 166 | ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); | 166 | ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); |
| 167 | if (classMapping != null) { | 167 | if (classMapping != null) { |
| 168 | return classMapping.containsDeobfField(deobfName); | 168 | return classMapping.containsDeobfField(deobfName, obfType); |
| 169 | } | 169 | } |
| 170 | return false; | 170 | return false; |
| 171 | } | 171 | } |
diff --git a/src/cuchaz/enigma/mapping/MappingsReader.java b/src/cuchaz/enigma/mapping/MappingsReader.java index adf460e..1e7b6e3 100644 --- a/src/cuchaz/enigma/mapping/MappingsReader.java +++ b/src/cuchaz/enigma/mapping/MappingsReader.java | |||
| @@ -17,8 +17,6 @@ import java.util.Deque; | |||
| 17 | 17 | ||
| 18 | import com.google.common.collect.Queues; | 18 | import com.google.common.collect.Queues; |
| 19 | 19 | ||
| 20 | import cuchaz.enigma.Constants; | ||
| 21 | |||
| 22 | public class MappingsReader { | 20 | public class MappingsReader { |
| 23 | 21 | ||
| 24 | public Mappings read(Reader in) throws IOException, MappingParseException { | 22 | public Mappings read(Reader in) throws IOException, MappingParseException { |
| @@ -114,62 +112,21 @@ public class MappingsReader { | |||
| 114 | 112 | ||
| 115 | private ClassMapping readClass(String[] parts, boolean makeSimple) { | 113 | private ClassMapping readClass(String[] parts, boolean makeSimple) { |
| 116 | if (parts.length == 2) { | 114 | if (parts.length == 2) { |
| 117 | String obfName = processName(parts[1], makeSimple); | 115 | return new ClassMapping(parts[1]); |
| 118 | return new ClassMapping(obfName); | ||
| 119 | } else { | 116 | } else { |
| 120 | String obfName = processName(parts[1], makeSimple); | 117 | return new ClassMapping(parts[1], parts[2]); |
| 121 | String deobfName = processName(parts[2], makeSimple); | ||
| 122 | return new ClassMapping(obfName, deobfName); | ||
| 123 | } | 118 | } |
| 124 | } | 119 | } |
| 125 | 120 | ||
| 126 | private String processName(String name, boolean makeSimple) { | ||
| 127 | if (makeSimple) { | ||
| 128 | return new ClassEntry(name).getSimpleName(); | ||
| 129 | } else { | ||
| 130 | return moveClassOutOfDefaultPackage(name, Constants.NonePackage); | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 134 | private String moveClassOutOfDefaultPackage(String className, String newPackageName) { | ||
| 135 | ClassEntry classEntry = new ClassEntry(className); | ||
| 136 | if (classEntry.isInDefaultPackage()) { | ||
| 137 | return newPackageName + "/" + classEntry.getName(); | ||
| 138 | } | ||
| 139 | return className; | ||
| 140 | } | ||
| 141 | |||
| 142 | private FieldMapping readField(String[] parts) { | 121 | private FieldMapping readField(String[] parts) { |
| 143 | return new FieldMapping(parts[1], parts[2]); | 122 | return new FieldMapping(parts[1], new Type(parts[3]), parts[2]); |
| 144 | } | 123 | } |
| 145 | 124 | ||
| 146 | private MethodMapping readMethod(String[] parts) { | 125 | private MethodMapping readMethod(String[] parts) { |
| 147 | if (parts.length == 3) { | 126 | if (parts.length == 3) { |
| 148 | String obfName = parts[1]; | 127 | return new MethodMapping(parts[1], new Signature(parts[2])); |
| 149 | Signature obfSignature = moveSignatureOutOfDefaultPackage(new Signature(parts[2]), Constants.NonePackage); | ||
| 150 | return new MethodMapping(obfName, obfSignature); | ||
| 151 | } else { | 128 | } else { |
| 152 | String obfName = parts[1]; | 129 | return new MethodMapping(parts[1], new Signature(parts[3]), parts[2]); |
| 153 | String deobfName = parts[2]; | ||
| 154 | Signature obfSignature = moveSignatureOutOfDefaultPackage(new Signature(parts[3]), Constants.NonePackage); | ||
| 155 | if (obfName.equals(deobfName)) { | ||
| 156 | return new MethodMapping(obfName, obfSignature); | ||
| 157 | } else { | ||
| 158 | return new MethodMapping(obfName, obfSignature, deobfName); | ||
| 159 | } | ||
| 160 | } | 130 | } |
| 161 | } | 131 | } |
| 162 | |||
| 163 | private Signature moveSignatureOutOfDefaultPackage(Signature signature, final String newPackageName) { | ||
| 164 | return new Signature(signature, new ClassNameReplacer() { | ||
| 165 | @Override | ||
| 166 | public String replace(String className) { | ||
| 167 | ClassEntry classEntry = new ClassEntry(className); | ||
| 168 | if (classEntry.isInDefaultPackage()) { | ||
| 169 | return newPackageName + "/" + className; | ||
| 170 | } | ||
| 171 | return null; | ||
| 172 | } | ||
| 173 | }); | ||
| 174 | } | ||
| 175 | } | 132 | } |
diff --git a/src/cuchaz/enigma/mapping/MappingsRenamer.java b/src/cuchaz/enigma/mapping/MappingsRenamer.java index 0a41c2b..095e5e9 100644 --- a/src/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/cuchaz/enigma/mapping/MappingsRenamer.java | |||
| @@ -76,23 +76,23 @@ public class MappingsRenamer { | |||
| 76 | 76 | ||
| 77 | public void setFieldName(FieldEntry obf, String deobfName) { | 77 | public void setFieldName(FieldEntry obf, String deobfName) { |
| 78 | deobfName = NameValidator.validateFieldName(deobfName); | 78 | deobfName = NameValidator.validateFieldName(deobfName); |
| 79 | FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName); | 79 | FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType()); |
| 80 | if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName) || m_index.containsObfField(targetEntry)) { | 80 | if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName, obf.getType()) || m_index.containsObfField(targetEntry)) { |
| 81 | throw new IllegalNameException(deobfName, "There is already a field with that name"); | 81 | throw new IllegalNameException(deobfName, "There is already a field with that name"); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); | 84 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); |
| 85 | classMapping.setFieldName(obf.getName(), deobfName); | 85 | classMapping.setFieldName(obf.getName(), obf.getType(), deobfName); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | public void removeFieldMapping(FieldEntry obf) { | 88 | public void removeFieldMapping(FieldEntry obf) { |
| 89 | ClassMapping classMapping = getClassMappingOrInnerClassMapping(obf.getClassEntry()); | 89 | ClassMapping classMapping = getClassMappingOrInnerClassMapping(obf.getClassEntry()); |
| 90 | classMapping.setFieldName(obf.getName(), null); | 90 | classMapping.setFieldName(obf.getName(), obf.getType(), null); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | public void markFieldAsDeobfuscated(FieldEntry obf) { | 93 | public void markFieldAsDeobfuscated(FieldEntry obf) { |
| 94 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); | 94 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); |
| 95 | classMapping.setFieldName(obf.getName(), obf.getName()); | 95 | classMapping.setFieldName(obf.getName(), obf.getType(), obf.getName()); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | public void setMethodTreeName(MethodEntry obf, String deobfName) { | 98 | public void setMethodTreeName(MethodEntry obf, String deobfName) { |
| @@ -171,8 +171,8 @@ public class MappingsRenamer { | |||
| 171 | public boolean moveFieldToObfClass(ClassMapping classMapping, FieldMapping fieldMapping, ClassEntry obfClass) { | 171 | public boolean moveFieldToObfClass(ClassMapping classMapping, FieldMapping fieldMapping, ClassEntry obfClass) { |
| 172 | classMapping.removeFieldMapping(fieldMapping); | 172 | classMapping.removeFieldMapping(fieldMapping); |
| 173 | ClassMapping targetClassMapping = getOrCreateClassMapping(obfClass); | 173 | ClassMapping targetClassMapping = getOrCreateClassMapping(obfClass); |
| 174 | if (!targetClassMapping.containsObfField(fieldMapping.getObfName())) { | 174 | if (!targetClassMapping.containsObfField(fieldMapping.getObfName(), fieldMapping.getObfType())) { |
| 175 | if (!targetClassMapping.containsDeobfField(fieldMapping.getDeobfName())) { | 175 | if (!targetClassMapping.containsDeobfField(fieldMapping.getDeobfName(), fieldMapping.getObfType())) { |
| 176 | targetClassMapping.addFieldMapping(fieldMapping); | 176 | targetClassMapping.addFieldMapping(fieldMapping); |
| 177 | return true; | 177 | return true; |
| 178 | } else { | 178 | } else { |
diff --git a/src/cuchaz/enigma/mapping/MappingsWriter.java b/src/cuchaz/enigma/mapping/MappingsWriter.java index 5ac409f..c7c2cc0 100644 --- a/src/cuchaz/enigma/mapping/MappingsWriter.java +++ b/src/cuchaz/enigma/mapping/MappingsWriter.java | |||
| @@ -50,7 +50,7 @@ public class MappingsWriter { | |||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | private void write(PrintWriter out, FieldMapping fieldMapping, int depth) throws IOException { | 52 | private void write(PrintWriter out, FieldMapping fieldMapping, int depth) throws IOException { |
| 53 | out.format("%sFIELD %s %s\n", getIndent(depth), fieldMapping.getObfName(), fieldMapping.getDeobfName()); | 53 | out.format("%sFIELD %s %s %s\n", getIndent(depth), fieldMapping.getObfName(), fieldMapping.getDeobfName(), fieldMapping.getObfType().toString()); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | private void write(PrintWriter out, MethodMapping methodMapping, int depth) throws IOException { | 56 | private void write(PrintWriter out, MethodMapping methodMapping, int depth) throws IOException { |
diff --git a/src/cuchaz/enigma/mapping/Translator.java b/src/cuchaz/enigma/mapping/Translator.java index 5eba18c..759dddf 100644 --- a/src/cuchaz/enigma/mapping/Translator.java +++ b/src/cuchaz/enigma/mapping/Translator.java | |||
| @@ -112,8 +112,8 @@ public class Translator { | |||
| 112 | 112 | ||
| 113 | // look for the field | 113 | // look for the field |
| 114 | String translatedName = m_direction.choose( | 114 | String translatedName = m_direction.choose( |
| 115 | classMapping.getDeobfFieldName(in.getName()), | 115 | classMapping.getDeobfFieldName(in.getName(), in.getType()), |
| 116 | classMapping.getObfFieldName(in.getName()) | 116 | classMapping.getObfFieldName(in.getName(), translateType(in.getType())) |
| 117 | ); | 117 | ); |
| 118 | if (translatedName != null) { | 118 | if (translatedName != null) { |
| 119 | return translatedName; | 119 | return translatedName; |
| @@ -128,7 +128,7 @@ public class Translator { | |||
| 128 | if (name == null) { | 128 | if (name == null) { |
| 129 | name = in.getName(); | 129 | name = in.getName(); |
| 130 | } | 130 | } |
| 131 | return new FieldEntry(translateEntry(in.getClassEntry()), name); | 131 | return new FieldEntry(translateEntry(in.getClassEntry()), name, translateType(in.getType())); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | public String translate(MethodEntry in) { | 134 | public String translate(MethodEntry in) { |
diff --git a/test/cuchaz/enigma/EntryFactory.java b/test/cuchaz/enigma/EntryFactory.java index fa90779..8c94bdf 100644 --- a/test/cuchaz/enigma/EntryFactory.java +++ b/test/cuchaz/enigma/EntryFactory.java | |||
| @@ -18,6 +18,7 @@ import cuchaz.enigma.mapping.ConstructorEntry; | |||
| 18 | import cuchaz.enigma.mapping.FieldEntry; | 18 | import cuchaz.enigma.mapping.FieldEntry; |
| 19 | import cuchaz.enigma.mapping.MethodEntry; | 19 | import cuchaz.enigma.mapping.MethodEntry; |
| 20 | import cuchaz.enigma.mapping.Signature; | 20 | import cuchaz.enigma.mapping.Signature; |
| 21 | import cuchaz.enigma.mapping.Type; | ||
| 21 | 22 | ||
| 22 | public class EntryFactory { | 23 | public class EntryFactory { |
| 23 | 24 | ||
| @@ -25,12 +26,12 @@ public class EntryFactory { | |||
| 25 | return new ClassEntry(name); | 26 | return new ClassEntry(name); |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | public static FieldEntry newField(String className, String fieldName) { | 29 | public static FieldEntry newField(String className, String fieldName, String fieldType) { |
| 29 | return newField(newClass(className), fieldName); | 30 | return newField(newClass(className), fieldName, fieldType); |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | public static FieldEntry newField(ClassEntry classEntry, String fieldName) { | 33 | public static FieldEntry newField(ClassEntry classEntry, String fieldName, String fieldType) { |
| 33 | return new FieldEntry(classEntry, fieldName); | 34 | return new FieldEntry(classEntry, fieldName, new Type(fieldType)); |
| 34 | } | 35 | } |
| 35 | 36 | ||
| 36 | public static MethodEntry newMethod(String className, String methodName, String methodSignature) { | 37 | public static MethodEntry newMethod(String className, String methodName, String methodSignature) { |
diff --git a/test/cuchaz/enigma/TestJarIndexInheritanceTree.java b/test/cuchaz/enigma/TestJarIndexInheritanceTree.java index 1d6e5a5..349d33b 100644 --- a/test/cuchaz/enigma/TestJarIndexInheritanceTree.java +++ b/test/cuchaz/enigma/TestJarIndexInheritanceTree.java | |||
| @@ -37,8 +37,8 @@ public class TestJarIndexInheritanceTree { | |||
| 37 | private ClassEntry m_subClassA = newClass("none/b"); | 37 | private ClassEntry m_subClassA = newClass("none/b"); |
| 38 | private ClassEntry m_subClassAA = newClass("none/d"); | 38 | private ClassEntry m_subClassAA = newClass("none/d"); |
| 39 | private ClassEntry m_subClassB = newClass("none/c"); | 39 | private ClassEntry m_subClassB = newClass("none/c"); |
| 40 | private FieldEntry m_nameField = new FieldEntry(m_baseClass, "a"); | 40 | private FieldEntry m_nameField = newField(m_baseClass, "a", "Ljava/lang/String;"); |
| 41 | private FieldEntry m_numThingsField = new FieldEntry(m_subClassB, "a"); | 41 | private FieldEntry m_numThingsField = newField(m_subClassB, "a", "I"); |
| 42 | 42 | ||
| 43 | public TestJarIndexInheritanceTree() | 43 | public TestJarIndexInheritanceTree() |
| 44 | throws Exception { | 44 | throws Exception { |
diff --git a/test/cuchaz/enigma/TestJarIndexLoneClass.java b/test/cuchaz/enigma/TestJarIndexLoneClass.java index c6a9e55..c0ac8d7 100644 --- a/test/cuchaz/enigma/TestJarIndexLoneClass.java +++ b/test/cuchaz/enigma/TestJarIndexLoneClass.java | |||
| @@ -64,9 +64,10 @@ public class TestJarIndexLoneClass { | |||
| 64 | 64 | ||
| 65 | @Test | 65 | @Test |
| 66 | public void access() { | 66 | public void access() { |
| 67 | assertThat(m_index.getAccess(newField("none/a", "a")), is(Access.Private)); | 67 | assertThat(m_index.getAccess(newField("none/a", "a", "Ljava/lang/String;")), is(Access.Private)); |
| 68 | assertThat(m_index.getAccess(newMethod("none/a", "a", "()Ljava/lang/String;")), is(Access.Public)); | 68 | assertThat(m_index.getAccess(newMethod("none/a", "a", "()Ljava/lang/String;")), is(Access.Public)); |
| 69 | assertThat(m_index.getAccess(newField("none/a", "b")), is(nullValue())); | 69 | assertThat(m_index.getAccess(newField("none/a", "b", "Ljava/lang/String;")), is(nullValue())); |
| 70 | assertThat(m_index.getAccess(newField("none/a", "a", "LFoo;")), is(nullValue())); | ||
| 70 | } | 71 | } |
| 71 | 72 | ||
| 72 | @Test | 73 | @Test |
| @@ -110,7 +111,7 @@ public class TestJarIndexLoneClass { | |||
| 110 | @Test | 111 | @Test |
| 111 | @SuppressWarnings("unchecked") | 112 | @SuppressWarnings("unchecked") |
| 112 | public void fieldReferences() { | 113 | public void fieldReferences() { |
| 113 | FieldEntry source = newField("none/a", "a"); | 114 | FieldEntry source = newField("none/a", "a", "Ljava/lang/String;"); |
| 114 | Collection<EntryReference<FieldEntry,BehaviorEntry>> references = m_index.getFieldReferences(source); | 115 | Collection<EntryReference<FieldEntry,BehaviorEntry>> references = m_index.getFieldReferences(source); |
| 115 | assertThat(references, containsInAnyOrder( | 116 | assertThat(references, containsInAnyOrder( |
| 116 | newFieldReferenceByConstructor(source, "none/a", "(Ljava/lang/String;)V"), | 117 | newFieldReferenceByConstructor(source, "none/a", "(Ljava/lang/String;)V"), |
| @@ -157,8 +158,9 @@ public class TestJarIndexLoneClass { | |||
| 157 | public void contains() { | 158 | public void contains() { |
| 158 | assertThat(m_index.containsObfClass(newClass("none/a")), is(true)); | 159 | assertThat(m_index.containsObfClass(newClass("none/a")), is(true)); |
| 159 | assertThat(m_index.containsObfClass(newClass("none/b")), is(false)); | 160 | assertThat(m_index.containsObfClass(newClass("none/b")), is(false)); |
| 160 | assertThat(m_index.containsObfField(newField("none/a", "a")), is(true)); | 161 | assertThat(m_index.containsObfField(newField("none/a", "a", "Ljava/lang/String;")), is(true)); |
| 161 | assertThat(m_index.containsObfField(newField("none/a", "b")), is(false)); | 162 | assertThat(m_index.containsObfField(newField("none/a", "b", "Ljava/lang/String;")), is(false)); |
| 163 | assertThat(m_index.containsObfField(newField("none/a", "a", "LFoo;")), is(false)); | ||
| 162 | assertThat(m_index.containsObfBehavior(newMethod("none/a", "a", "()Ljava/lang/String;")), is(true)); | 164 | assertThat(m_index.containsObfBehavior(newMethod("none/a", "a", "()Ljava/lang/String;")), is(true)); |
| 163 | assertThat(m_index.containsObfBehavior(newMethod("none/a", "b", "()Ljava/lang/String;")), is(false)); | 165 | assertThat(m_index.containsObfBehavior(newMethod("none/a", "b", "()Ljava/lang/String;")), is(false)); |
| 164 | } | 166 | } |
diff --git a/test/cuchaz/enigma/TestTranslator.java b/test/cuchaz/enigma/TestTranslator.java index 290f6f0..f91c585 100644 --- a/test/cuchaz/enigma/TestTranslator.java +++ b/test/cuchaz/enigma/TestTranslator.java | |||
| @@ -35,5 +35,8 @@ public class TestTranslator { | |||
| 35 | throws Exception { | 35 | throws Exception { |
| 36 | Translator translator = m_deobfuscator.getTranslator(TranslationDirection.Deobfuscating); | 36 | Translator translator = m_deobfuscator.getTranslator(TranslationDirection.Deobfuscating); |
| 37 | assertThat(translator.translateEntry(newClass("none/a")), is(newClass("deobf/A"))); | 37 | assertThat(translator.translateEntry(newClass("none/a")), is(newClass("deobf/A"))); |
| 38 | assertThat(translator.translateEntry(newField("none/a", "a", "I")), is(newField("deobf/A", "one", "I"))); | ||
| 39 | assertThat(translator.translateEntry(newField("none/a", "a", "F")), is(newField("deobf/A", "two", "F"))); | ||
| 40 | assertThat(translator.translateEntry(newField("none/a", "a", "Ljava/lang/String;")), is(newField("deobf/A", "three", "Ljava/lang/String;"))); | ||
| 38 | } | 41 | } |
| 39 | } | 42 | } |
diff --git a/test/cuchaz/enigma/resources/translation.mappings b/test/cuchaz/enigma/resources/translation.mappings index 70755bf..c71493e 100644 --- a/test/cuchaz/enigma/resources/translation.mappings +++ b/test/cuchaz/enigma/resources/translation.mappings | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | CLASS none/a deobf/A | 1 | CLASS none/a deobf/A |
| 2 | FIELD a one | 2 | FIELD a one I |
| 3 | FIELD b two | 3 | FIELD a two F |
| 4 | FIELD c three \ No newline at end of file | 4 | FIELD a three Ljava/lang/String; \ No newline at end of file |