summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping
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/cuchaz/enigma/mapping
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/cuchaz/enigma/mapping')
-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
9 files changed, 96 insertions, 106 deletions
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) {