summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar jeff2015-02-08 23:10:26 -0500
committerGravatar jeff2015-02-08 23:10:26 -0500
commit31a1a418b04cd3e7b06cb50cb8674a2c25079f6c (patch)
tree5914fd0c3557250dc61382a571ea3a3cdb9d941d /src
parentMerge with 09538fb039f2e4e5e240cfb331be512ae8740fda (diff)
downloadenigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.tar.gz
enigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.tar.xz
enigma-fork-31a1a418b04cd3e7b06cb50cb8674a2c25079f6c.zip
added types to fields
Diffstat (limited to 'src')
-rw-r--r--src/cuchaz/enigma/Deobfuscator.java4
-rw-r--r--src/cuchaz/enigma/analysis/EntryRenamer.java29
-rw-r--r--src/cuchaz/enigma/analysis/JarIndex.java26
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java5
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndexClassVisitor.java5
-rw-r--r--src/cuchaz/enigma/bytecode/ClassTranslator.java5
-rw-r--r--src/cuchaz/enigma/convert/ClassIdentity.java2
-rw-r--r--src/cuchaz/enigma/gui/Gui.java1
-rw-r--r--src/cuchaz/enigma/mapping/ClassMapping.java78
-rw-r--r--src/cuchaz/enigma/mapping/FieldEntry.java29
-rw-r--r--src/cuchaz/enigma/mapping/FieldMapping.java10
-rw-r--r--src/cuchaz/enigma/mapping/JavassistUtil.java6
-rw-r--r--src/cuchaz/enigma/mapping/Mappings.java4
-rw-r--r--src/cuchaz/enigma/mapping/MappingsReader.java53
-rw-r--r--src/cuchaz/enigma/mapping/MappingsRenamer.java14
-rw-r--r--src/cuchaz/enigma/mapping/MappingsWriter.java2
-rw-r--r--src/cuchaz/enigma/mapping/Translator.java6
17 files changed, 136 insertions, 143 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
22import cuchaz.enigma.mapping.ArgumentEntry; 22import cuchaz.enigma.mapping.ArgumentEntry;
23import cuchaz.enigma.mapping.ClassEntry; 23import cuchaz.enigma.mapping.ClassEntry;
24import cuchaz.enigma.mapping.ClassNameReplacer;
24import cuchaz.enigma.mapping.ConstructorEntry; 25import cuchaz.enigma.mapping.ConstructorEntry;
25import cuchaz.enigma.mapping.Entry; 26import cuchaz.enigma.mapping.Entry;
26import cuchaz.enigma.mapping.FieldEntry; 27import cuchaz.enigma.mapping.FieldEntry;
27import cuchaz.enigma.mapping.MethodEntry; 28import cuchaz.enigma.mapping.MethodEntry;
29import cuchaz.enigma.mapping.Signature;
30import cuchaz.enigma.mapping.Type;
28 31
29public class EntryRenamer { 32public 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;
36import cuchaz.enigma.mapping.FieldEntry; 36import cuchaz.enigma.mapping.FieldEntry;
37import cuchaz.enigma.mapping.MethodEntry; 37import cuchaz.enigma.mapping.MethodEntry;
38import cuchaz.enigma.mapping.Signature; 38import cuchaz.enigma.mapping.Signature;
39import cuchaz.enigma.mapping.Type;
39 40
40public class SourceIndexBehaviorVisitor extends SourceIndexVisitor { 41public 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;
31import cuchaz.enigma.mapping.ConstructorEntry; 31import cuchaz.enigma.mapping.ConstructorEntry;
32import cuchaz.enigma.mapping.FieldEntry; 32import cuchaz.enigma.mapping.FieldEntry;
33import cuchaz.enigma.mapping.Signature; 33import cuchaz.enigma.mapping.Signature;
34import cuchaz.enigma.mapping.Type;
34 35
35public class SourceIndexClassVisitor extends SourceIndexVisitor { 36public 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
18import com.google.common.collect.Queues; 18import com.google.common.collect.Queues;
19 19
20import cuchaz.enigma.Constants;
21
22public class MappingsReader { 20public 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) {