summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
diff options
context:
space:
mode:
authorGravatar Thog2017-03-07 21:24:39 +0100
committerGravatar Thog2017-03-07 21:30:02 +0100
commitb4aaff683d78ab92b83f3a7257c33b8e27d1affa (patch)
treef23c9bb0927d83cc7302881266b7df8fd37959c7 /src/main/java/cuchaz/enigma/mapping/ClassMapping.java
parentAvoid crash of the matcher when the obf name is invalid (set a deob it using ... (diff)
downloadenigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.tar.gz
enigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.tar.xz
enigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.zip
Drop unix case style and implement hashCode when equals is overrided
Also update Guava to version 21
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/ClassMapping.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/ClassMapping.java250
1 files changed, 123 insertions, 127 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
index 8f89388..a261c91 100644
--- a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java
@@ -20,19 +20,19 @@ import cuchaz.enigma.throwables.MappingConflict;
20// FIXME: Enigma doesn't support inner classes of inner class????! 20// FIXME: Enigma doesn't support inner classes of inner class????!
21public class ClassMapping implements Comparable<ClassMapping> { 21public class ClassMapping implements Comparable<ClassMapping> {
22 22
23 private String m_obfFullName; 23 private String obfFullName;
24 private String m_obfSimpleName; 24 private String obfSimpleName;
25 private String m_deobfName; 25 private String deobfName;
26 private String m_previousDeobfName; 26 private String previousDeobfName;
27 private Map<String, ClassMapping> m_innerClassesByObfSimple; 27 private Map<String, ClassMapping> innerClassesByObfSimple;
28 private Map<String, ClassMapping> m_innerClassesByObfFull; 28 private Map<String, ClassMapping> innerClassesByObfFull;
29 private Map<String, ClassMapping> m_innerClassesByDeobf; 29 private Map<String, ClassMapping> innerClassesByDeobf;
30 private Map<String, FieldMapping> m_fieldsByObf; 30 private Map<String, FieldMapping> fieldsByObf;
31 private Map<String, FieldMapping> m_fieldsByDeobf; 31 private Map<String, FieldMapping> fieldsByDeobf;
32 private Map<String, MethodMapping> m_methodsByObf; 32 private Map<String, MethodMapping> methodsByObf;
33 private Map<String, MethodMapping> m_methodsByDeobf; 33 private Map<String, MethodMapping> methodsByDeobf;
34 private boolean isDirty; 34 private boolean isDirty;
35 private Mappings.EntryModifier modifier; 35 private Mappings.EntryModifier modifier;
36 36
37 public ClassMapping(String obfFullName) 37 public ClassMapping(String obfFullName)
38 { 38 {
@@ -46,85 +46,85 @@ public class ClassMapping implements Comparable<ClassMapping> {
46 46
47 public ClassMapping(String obfFullName, String deobfName, Mappings.EntryModifier modifier) 47 public ClassMapping(String obfFullName, String deobfName, Mappings.EntryModifier modifier)
48 { 48 {
49 m_obfFullName = obfFullName; 49 this.obfFullName = obfFullName;
50 ClassEntry classEntry = new ClassEntry(obfFullName); 50 ClassEntry classEntry = new ClassEntry(obfFullName);
51 m_obfSimpleName = classEntry.isInnerClass() ? classEntry.getInnermostClassName() : classEntry.getSimpleName(); 51 obfSimpleName = classEntry.isInnerClass() ? classEntry.getInnermostClassName() : classEntry.getSimpleName();
52 m_previousDeobfName = null; 52 previousDeobfName = null;
53 m_deobfName = NameValidator.validateClassName(deobfName, false); 53 this.deobfName = NameValidator.validateClassName(deobfName, false);
54 m_innerClassesByObfSimple = Maps.newHashMap(); 54 innerClassesByObfSimple = Maps.newHashMap();
55 m_innerClassesByObfFull = Maps.newHashMap(); 55 innerClassesByObfFull = Maps.newHashMap();
56 m_innerClassesByDeobf = Maps.newHashMap(); 56 innerClassesByDeobf = Maps.newHashMap();
57 m_fieldsByObf = Maps.newHashMap(); 57 fieldsByObf = Maps.newHashMap();
58 m_fieldsByDeobf = Maps.newHashMap(); 58 fieldsByDeobf = Maps.newHashMap();
59 m_methodsByObf = Maps.newHashMap(); 59 methodsByObf = Maps.newHashMap();
60 m_methodsByDeobf = Maps.newHashMap(); 60 methodsByDeobf = Maps.newHashMap();
61 isDirty = true; 61 isDirty = true;
62 this.modifier = modifier; 62 this.modifier = modifier;
63 } 63 }
64 64
65 public String getObfFullName() { 65 public String getObfFullName() {
66 return m_obfFullName; 66 return obfFullName;
67 } 67 }
68 68
69 public String getObfSimpleName() { 69 public String getObfSimpleName() {
70 return m_obfSimpleName; 70 return obfSimpleName;
71 } 71 }
72 72
73 public String getPreviousDeobfName() { 73 public String getPreviousDeobfName() {
74 return m_previousDeobfName; 74 return previousDeobfName;
75 } 75 }
76 76
77 public String getDeobfName() { 77 public String getDeobfName() {
78 return m_deobfName; 78 return deobfName;
79 } 79 }
80 80
81 public void setDeobfName(String val) { 81 public void setDeobfName(String val) {
82 m_previousDeobfName = m_deobfName; 82 previousDeobfName = deobfName;
83 m_deobfName = NameValidator.validateClassName(val, false); 83 deobfName = NameValidator.validateClassName(val, false);
84 this.isDirty = true; 84 this.isDirty = true;
85 } 85 }
86 86
87 //// INNER CLASSES //////// 87 //// INNER CLASSES ////////
88 88
89 public Iterable<ClassMapping> innerClasses() { 89 public Iterable<ClassMapping> innerClasses() {
90 assert (m_innerClassesByObfSimple.size() >= m_innerClassesByDeobf.size()); 90 assert (innerClassesByObfSimple.size() >= innerClassesByDeobf.size());
91 return m_innerClassesByObfSimple.values(); 91 return innerClassesByObfSimple.values();
92 } 92 }
93 93
94 public void addInnerClassMapping(ClassMapping classMapping) throws MappingConflict { 94 public void addInnerClassMapping(ClassMapping classMapping) throws MappingConflict {
95 // FIXME: dirty hack, that can get into issues, but it's a temp fix! 95 // FIXME: dirty hack, that can get into issues, but it's a temp fix!
96 if (this.m_innerClassesByObfFull.containsKey(classMapping.getObfSimpleName())) { 96 if (this.innerClassesByObfFull.containsKey(classMapping.getObfSimpleName())) {
97 throw new MappingConflict("classes", classMapping.getObfSimpleName(), this.m_innerClassesByObfSimple.get(classMapping.getObfSimpleName()).getObfSimpleName()); 97 throw new MappingConflict("classes", classMapping.getObfSimpleName(), this.innerClassesByObfSimple.get(classMapping.getObfSimpleName()).getObfSimpleName());
98 } 98 }
99 m_innerClassesByObfFull.put(classMapping.getObfFullName(), classMapping); 99 innerClassesByObfFull.put(classMapping.getObfFullName(), classMapping);
100 m_innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping); 100 innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping);
101 101
102 if (classMapping.getDeobfName() != null) { 102 if (classMapping.getDeobfName() != null) {
103 if (this.m_innerClassesByDeobf.containsKey(classMapping.getDeobfName())) { 103 if (this.innerClassesByDeobf.containsKey(classMapping.getDeobfName())) {
104 throw new MappingConflict("classes", classMapping.getDeobfName(), this.m_innerClassesByDeobf.get(classMapping.getDeobfName()).getDeobfName()); 104 throw new MappingConflict("classes", classMapping.getDeobfName(), this.innerClassesByDeobf.get(classMapping.getDeobfName()).getDeobfName());
105 } 105 }
106 m_innerClassesByDeobf.put(classMapping.getDeobfName(), classMapping); 106 innerClassesByDeobf.put(classMapping.getDeobfName(), classMapping);
107 } 107 }
108 this.isDirty = true; 108 this.isDirty = true;
109 } 109 }
110 110
111 public void removeInnerClassMapping(ClassMapping classMapping) { 111 public void removeInnerClassMapping(ClassMapping classMapping) {
112 m_innerClassesByObfFull.remove(classMapping.getObfFullName()); 112 innerClassesByObfFull.remove(classMapping.getObfFullName());
113 boolean obfWasRemoved = m_innerClassesByObfSimple.remove(classMapping.getObfSimpleName()) != null; 113 boolean obfWasRemoved = innerClassesByObfSimple.remove(classMapping.getObfSimpleName()) != null;
114 assert (obfWasRemoved); 114 assert (obfWasRemoved);
115 if (classMapping.getDeobfName() != null) { 115 if (classMapping.getDeobfName() != null) {
116 boolean deobfWasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null; 116 boolean deobfWasRemoved = innerClassesByDeobf.remove(classMapping.getDeobfName()) != null;
117 assert (deobfWasRemoved); 117 assert (deobfWasRemoved);
118 } 118 }
119 this.isDirty = true; 119 this.isDirty = true;
120 } 120 }
121 121
122 public ClassMapping getOrCreateInnerClass(ClassEntry obfInnerClass) { 122 public ClassMapping getOrCreateInnerClass(ClassEntry obfInnerClass) {
123 ClassMapping classMapping = m_innerClassesByObfSimple.get(obfInnerClass.getInnermostClassName()); 123 ClassMapping classMapping = innerClassesByObfSimple.get(obfInnerClass.getInnermostClassName());
124 if (classMapping == null) { 124 if (classMapping == null) {
125 classMapping = new ClassMapping(obfInnerClass.getName()); 125 classMapping = new ClassMapping(obfInnerClass.getName());
126 m_innerClassesByObfFull.put(classMapping.getObfFullName(), classMapping); 126 innerClassesByObfFull.put(classMapping.getObfFullName(), classMapping);
127 boolean wasAdded = m_innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping) == null; 127 boolean wasAdded = innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping) == null;
128 assert (wasAdded); 128 assert (wasAdded);
129 this.isDirty = true; 129 this.isDirty = true;
130 } 130 }
@@ -133,12 +133,12 @@ public class ClassMapping implements Comparable<ClassMapping> {
133 133
134 public ClassMapping getInnerClassByObfSimple(String obfSimpleName) { 134 public ClassMapping getInnerClassByObfSimple(String obfSimpleName) {
135 assert (isSimpleClassName(obfSimpleName)); 135 assert (isSimpleClassName(obfSimpleName));
136 return m_innerClassesByObfSimple.get(obfSimpleName); 136 return innerClassesByObfSimple.get(obfSimpleName);
137 } 137 }
138 138
139 public ClassMapping getInnerClassByDeobf(String deobfName) { 139 public ClassMapping getInnerClassByDeobf(String deobfName) {
140 assert (isSimpleClassName(deobfName)); 140 assert (isSimpleClassName(deobfName));
141 return m_innerClassesByDeobf.get(deobfName); 141 return innerClassesByDeobf.get(deobfName);
142 } 142 }
143 143
144 public ClassMapping getInnerClassByDeobfThenObfSimple(String name) { 144 public ClassMapping getInnerClassByDeobfThenObfSimple(String name) {
@@ -151,7 +151,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
151 151
152 public String getDeobfInnerClassName(String obfSimpleName) { 152 public String getDeobfInnerClassName(String obfSimpleName) {
153 assert (isSimpleClassName(obfSimpleName)); 153 assert (isSimpleClassName(obfSimpleName));
154 ClassMapping classMapping = m_innerClassesByObfSimple.get(obfSimpleName); 154 ClassMapping classMapping = innerClassesByObfSimple.get(obfSimpleName);
155 if (classMapping != null) { 155 if (classMapping != null) {
156 return classMapping.getDeobfName(); 156 return classMapping.getDeobfName();
157 } 157 }
@@ -161,80 +161,80 @@ public class ClassMapping implements Comparable<ClassMapping> {
161 public void setInnerClassName(ClassEntry obfInnerClass, String deobfName) { 161 public void setInnerClassName(ClassEntry obfInnerClass, String deobfName) {
162 ClassMapping classMapping = getOrCreateInnerClass(obfInnerClass); 162 ClassMapping classMapping = getOrCreateInnerClass(obfInnerClass);
163 if (classMapping.getDeobfName() != null) { 163 if (classMapping.getDeobfName() != null) {
164 boolean wasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null; 164 boolean wasRemoved = innerClassesByDeobf.remove(classMapping.getDeobfName()) != null;
165 assert (wasRemoved); 165 assert (wasRemoved);
166 } 166 }
167 classMapping.setDeobfName(deobfName); 167 classMapping.setDeobfName(deobfName);
168 if (deobfName != null) { 168 if (deobfName != null) {
169 assert (isSimpleClassName(deobfName)); 169 assert (isSimpleClassName(deobfName));
170 boolean wasAdded = m_innerClassesByDeobf.put(deobfName, classMapping) == null; 170 boolean wasAdded = innerClassesByDeobf.put(deobfName, classMapping) == null;
171 assert (wasAdded); 171 assert (wasAdded);
172 } 172 }
173 this.isDirty = true; 173 this.isDirty = true;
174 } 174 }
175 175
176 public boolean hasInnerClassByObfSimple(String obfSimpleName) { 176 public boolean hasInnerClassByObfSimple(String obfSimpleName) {
177 return m_innerClassesByObfSimple.containsKey(obfSimpleName); 177 return innerClassesByObfSimple.containsKey(obfSimpleName);
178 } 178 }
179 179
180 public boolean hasInnerClassByDeobf(String deobfName) { 180 public boolean hasInnerClassByDeobf(String deobfName) {
181 return m_innerClassesByDeobf.containsKey(deobfName); 181 return innerClassesByDeobf.containsKey(deobfName);
182 } 182 }
183 183
184 184
185 //// FIELDS //////// 185 //// FIELDS ////////
186 186
187 public Iterable<FieldMapping> fields() { 187 public Iterable<FieldMapping> fields() {
188 assert (m_fieldsByObf.size() == m_fieldsByDeobf.size()); 188 assert (fieldsByObf.size() == fieldsByDeobf.size());
189 return m_fieldsByObf.values(); 189 return fieldsByObf.values();
190 } 190 }
191 191
192 public boolean containsObfField(String obfName, Type obfType) { 192 public boolean containsObfField(String obfName, Type obfType) {
193 return m_fieldsByObf.containsKey(getFieldKey(obfName, obfType)); 193 return fieldsByObf.containsKey(getFieldKey(obfName, obfType));
194 } 194 }
195 195
196 public boolean containsDeobfField(String deobfName, Type deobfType) { 196 public boolean containsDeobfField(String deobfName, Type deobfType) {
197 return m_fieldsByDeobf.containsKey(getFieldKey(deobfName, deobfType)); 197 return fieldsByDeobf.containsKey(getFieldKey(deobfName, deobfType));
198 } 198 }
199 199
200 public void addFieldMapping(FieldMapping fieldMapping) { 200 public void addFieldMapping(FieldMapping fieldMapping) {
201 String obfKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()); 201 String obfKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType());
202 if (m_fieldsByObf.containsKey(obfKey)) { 202 if (fieldsByObf.containsKey(obfKey)) {
203 throw new Error("Already have mapping for " + m_obfFullName + "." + obfKey); 203 throw new Error("Already have mapping for " + obfFullName + "." + obfKey);
204 } 204 }
205 if (fieldMapping.getDeobfName() != null) { 205 if (fieldMapping.getDeobfName() != null) {
206 String deobfKey = getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType()); 206 String deobfKey = getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType());
207 if (m_fieldsByDeobf.containsKey(deobfKey)) { 207 if (fieldsByDeobf.containsKey(deobfKey)) {
208 throw new Error("Already have mapping for " + m_deobfName + "." + deobfKey); 208 throw new Error("Already have mapping for " + deobfName + "." + deobfKey);
209 } 209 }
210 boolean deobfWasAdded = m_fieldsByDeobf.put(deobfKey, fieldMapping) == null; 210 boolean deobfWasAdded = fieldsByDeobf.put(deobfKey, fieldMapping) == null;
211 assert (deobfWasAdded); 211 assert (deobfWasAdded);
212 } 212 }
213 boolean obfWasAdded = m_fieldsByObf.put(obfKey, fieldMapping) == null; 213 boolean obfWasAdded = fieldsByObf.put(obfKey, fieldMapping) == null;
214 assert (obfWasAdded); 214 assert (obfWasAdded);
215 this.isDirty = true; 215 this.isDirty = true;
216 } 216 }
217 217
218 public void removeFieldMapping(FieldMapping fieldMapping) { 218 public void removeFieldMapping(FieldMapping fieldMapping) {
219 boolean obfWasRemoved = m_fieldsByObf.remove(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType())) != null; 219 boolean obfWasRemoved = fieldsByObf.remove(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType())) != null;
220 assert (obfWasRemoved); 220 assert (obfWasRemoved);
221 if (fieldMapping.getDeobfName() != null) { 221 if (fieldMapping.getDeobfName() != null) {
222 boolean deobfWasRemoved = m_fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType())) != null; 222 boolean deobfWasRemoved = fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), fieldMapping.getObfType())) != null;
223 assert (deobfWasRemoved); 223 assert (deobfWasRemoved);
224 } 224 }
225 this.isDirty = true; 225 this.isDirty = true;
226 } 226 }
227 227
228 public FieldMapping getFieldByObf(String obfName, Type obfType) { 228 public FieldMapping getFieldByObf(String obfName, Type obfType) {
229 return m_fieldsByObf.get(getFieldKey(obfName, obfType)); 229 return fieldsByObf.get(getFieldKey(obfName, obfType));
230 } 230 }
231 231
232 public FieldMapping getFieldByDeobf(String deobfName, Type obfType) { 232 public FieldMapping getFieldByDeobf(String deobfName, Type obfType) {
233 return m_fieldsByDeobf.get(getFieldKey(deobfName, obfType)); 233 return fieldsByDeobf.get(getFieldKey(deobfName, obfType));
234 } 234 }
235 235
236 public String getObfFieldName(String deobfName, Type obfType) { 236 public String getObfFieldName(String deobfName, Type obfType) {
237 FieldMapping fieldMapping = m_fieldsByDeobf.get(getFieldKey(deobfName, obfType)); 237 FieldMapping fieldMapping = fieldsByDeobf.get(getFieldKey(deobfName, obfType));
238 if (fieldMapping != null) { 238 if (fieldMapping != null) {
239 return fieldMapping.getObfName(); 239 return fieldMapping.getObfName();
240 } 240 }
@@ -242,7 +242,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
242 } 242 }
243 243
244 public String getDeobfFieldName(String obfName, Type obfType) { 244 public String getDeobfFieldName(String obfName, Type obfType) {
245 FieldMapping fieldMapping = m_fieldsByObf.get(getFieldKey(obfName, obfType)); 245 FieldMapping fieldMapping = fieldsByObf.get(getFieldKey(obfName, obfType));
246 if (fieldMapping != null) { 246 if (fieldMapping != null) {
247 return fieldMapping.getDeobfName(); 247 return fieldMapping.getDeobfName();
248 } 248 }
@@ -261,18 +261,18 @@ public class ClassMapping implements Comparable<ClassMapping> {
261 261
262 public void setFieldName(String obfName, Type obfType, String deobfName) { 262 public void setFieldName(String obfName, Type obfType, String deobfName) {
263 assert (deobfName != null); 263 assert (deobfName != null);
264 FieldMapping fieldMapping = m_fieldsByObf.get(getFieldKey(obfName, obfType)); 264 FieldMapping fieldMapping = fieldsByObf.get(getFieldKey(obfName, obfType));
265 if (fieldMapping == null) { 265 if (fieldMapping == null) {
266 fieldMapping = new FieldMapping(obfName, obfType, deobfName, Mappings.EntryModifier.UNCHANGED); 266 fieldMapping = new FieldMapping(obfName, obfType, deobfName, Mappings.EntryModifier.UNCHANGED);
267 boolean obfWasAdded = m_fieldsByObf.put(getFieldKey(obfName, obfType), fieldMapping) == null; 267 boolean obfWasAdded = fieldsByObf.put(getFieldKey(obfName, obfType), fieldMapping) == null;
268 assert (obfWasAdded); 268 assert (obfWasAdded);
269 } else { 269 } else {
270 boolean wasRemoved = m_fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), obfType)) != null; 270 boolean wasRemoved = fieldsByDeobf.remove(getFieldKey(fieldMapping.getDeobfName(), obfType)) != null;
271 assert (wasRemoved); 271 assert (wasRemoved);
272 } 272 }
273 fieldMapping.setDeobfName(deobfName); 273 fieldMapping.setDeobfName(deobfName);
274 if (deobfName != null) { 274 if (deobfName != null) {
275 boolean wasAdded = m_fieldsByDeobf.put(getFieldKey(deobfName, obfType), fieldMapping) == null; 275 boolean wasAdded = fieldsByDeobf.put(getFieldKey(deobfName, obfType), fieldMapping) == null;
276 assert (wasAdded); 276 assert (wasAdded);
277 } 277 }
278 this.isDirty = true; 278 this.isDirty = true;
@@ -280,11 +280,11 @@ public class ClassMapping implements Comparable<ClassMapping> {
280 280
281 public void setFieldObfNameAndType(String oldObfName, Type obfType, String newObfName, Type newObfType) { 281 public void setFieldObfNameAndType(String oldObfName, Type obfType, String newObfName, Type newObfType) {
282 assert(newObfName != null); 282 assert(newObfName != null);
283 FieldMapping fieldMapping = m_fieldsByObf.remove(getFieldKey(oldObfName, obfType)); 283 FieldMapping fieldMapping = fieldsByObf.remove(getFieldKey(oldObfName, obfType));
284 assert(fieldMapping != null); 284 assert(fieldMapping != null);
285 fieldMapping.setObfName(newObfName); 285 fieldMapping.setObfName(newObfName);
286 fieldMapping.setObfType(newObfType); 286 fieldMapping.setObfType(newObfType);
287 boolean obfWasAdded = m_fieldsByObf.put(getFieldKey(newObfName, newObfType), fieldMapping) == null; 287 boolean obfWasAdded = fieldsByObf.put(getFieldKey(newObfName, newObfType), fieldMapping) == null;
288 assert(obfWasAdded); 288 assert(obfWasAdded);
289 this.isDirty = true; 289 this.isDirty = true;
290 } 290 }
@@ -292,53 +292,53 @@ public class ClassMapping implements Comparable<ClassMapping> {
292 //// METHODS //////// 292 //// METHODS ////////
293 293
294 public Iterable<MethodMapping> methods() { 294 public Iterable<MethodMapping> methods() {
295 assert (m_methodsByObf.size() >= m_methodsByDeobf.size()); 295 assert (methodsByObf.size() >= methodsByDeobf.size());
296 return m_methodsByObf.values(); 296 return methodsByObf.values();
297 } 297 }
298 298
299 public boolean containsObfMethod(String obfName, Signature obfSignature) { 299 public boolean containsObfMethod(String obfName, Signature obfSignature) {
300 return m_methodsByObf.containsKey(getMethodKey(obfName, obfSignature)); 300 return methodsByObf.containsKey(getMethodKey(obfName, obfSignature));
301 } 301 }
302 302
303 public boolean containsDeobfMethod(String deobfName, Signature obfSignature) { 303 public boolean containsDeobfMethod(String deobfName, Signature obfSignature) {
304 return m_methodsByDeobf.containsKey(getMethodKey(deobfName, obfSignature)); 304 return methodsByDeobf.containsKey(getMethodKey(deobfName, obfSignature));
305 } 305 }
306 306
307 public void addMethodMapping(MethodMapping methodMapping) { 307 public void addMethodMapping(MethodMapping methodMapping) {
308 String obfKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()); 308 String obfKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature());
309 if (m_methodsByObf.containsKey(obfKey)) { 309 if (methodsByObf.containsKey(obfKey)) {
310 throw new Error("Already have mapping for " + m_obfFullName + "." + obfKey); 310 throw new Error("Already have mapping for " + obfFullName + "." + obfKey);
311 } 311 }
312 boolean wasAdded = m_methodsByObf.put(obfKey, methodMapping) == null; 312 boolean wasAdded = methodsByObf.put(obfKey, methodMapping) == null;
313 assert (wasAdded); 313 assert (wasAdded);
314 if (methodMapping.getDeobfName() != null) { 314 if (methodMapping.getDeobfName() != null) {
315 String deobfKey = getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature()); 315 String deobfKey = getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature());
316 if (m_methodsByDeobf.containsKey(deobfKey)) { 316 if (methodsByDeobf.containsKey(deobfKey)) {
317 throw new Error("Already have mapping for " + m_deobfName + "." + deobfKey); 317 throw new Error("Already have mapping for " + deobfName + "." + deobfKey);
318 } 318 }
319 boolean deobfWasAdded = m_methodsByDeobf.put(deobfKey, methodMapping) == null; 319 boolean deobfWasAdded = methodsByDeobf.put(deobfKey, methodMapping) == null;
320 assert (deobfWasAdded); 320 assert (deobfWasAdded);
321 } 321 }
322 this.isDirty = true; 322 this.isDirty = true;
323 assert (m_methodsByObf.size() >= m_methodsByDeobf.size()); 323 assert (methodsByObf.size() >= methodsByDeobf.size());
324 } 324 }
325 325
326 public void removeMethodMapping(MethodMapping methodMapping) { 326 public void removeMethodMapping(MethodMapping methodMapping) {
327 boolean obfWasRemoved = m_methodsByObf.remove(getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature())) != null; 327 boolean obfWasRemoved = methodsByObf.remove(getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature())) != null;
328 assert (obfWasRemoved); 328 assert (obfWasRemoved);
329 if (methodMapping.getDeobfName() != null) { 329 if (methodMapping.getDeobfName() != null) {
330 boolean deobfWasRemoved = m_methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature())) != null; 330 boolean deobfWasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature())) != null;
331 assert (deobfWasRemoved); 331 assert (deobfWasRemoved);
332 } 332 }
333 this.isDirty = true; 333 this.isDirty = true;
334 } 334 }
335 335
336 public MethodMapping getMethodByObf(String obfName, Signature obfSignature) { 336 public MethodMapping getMethodByObf(String obfName, Signature obfSignature) {
337 return m_methodsByObf.get(getMethodKey(obfName, obfSignature)); 337 return methodsByObf.get(getMethodKey(obfName, obfSignature));
338 } 338 }
339 339
340 public MethodMapping getMethodByDeobf(String deobfName, Signature obfSignature) { 340 public MethodMapping getMethodByDeobf(String deobfName, Signature obfSignature) {
341 return m_methodsByDeobf.get(getMethodKey(deobfName, obfSignature)); 341 return methodsByDeobf.get(getMethodKey(deobfName, obfSignature));
342 } 342 }
343 343
344 private String getMethodKey(String name, Signature signature) { 344 private String getMethodKey(String name, Signature signature) {
@@ -352,16 +352,16 @@ public class ClassMapping implements Comparable<ClassMapping> {
352 } 352 }
353 353
354 public void setMethodName(String obfName, Signature obfSignature, String deobfName) { 354 public void setMethodName(String obfName, Signature obfSignature, String deobfName) {
355 MethodMapping methodMapping = m_methodsByObf.get(getMethodKey(obfName, obfSignature)); 355 MethodMapping methodMapping = methodsByObf.get(getMethodKey(obfName, obfSignature));
356 if (methodMapping == null) { 356 if (methodMapping == null) {
357 methodMapping = createMethodMapping(obfName, obfSignature); 357 methodMapping = createMethodMapping(obfName, obfSignature);
358 } else if (methodMapping.getDeobfName() != null) { 358 } else if (methodMapping.getDeobfName() != null) {
359 boolean wasRemoved = m_methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature())) != null; 359 boolean wasRemoved = methodsByDeobf.remove(getMethodKey(methodMapping.getDeobfName(), methodMapping.getObfSignature())) != null;
360 assert (wasRemoved); 360 assert (wasRemoved);
361 } 361 }
362 methodMapping.setDeobfName(deobfName); 362 methodMapping.setDeobfName(deobfName);
363 if (deobfName != null) { 363 if (deobfName != null) {
364 boolean wasAdded = m_methodsByDeobf.put(getMethodKey(deobfName, obfSignature), methodMapping) == null; 364 boolean wasAdded = methodsByDeobf.put(getMethodKey(deobfName, obfSignature), methodMapping) == null;
365 assert (wasAdded); 365 assert (wasAdded);
366 } 366 }
367 this.isDirty = true; 367 this.isDirty = true;
@@ -369,11 +369,11 @@ public class ClassMapping implements Comparable<ClassMapping> {
369 369
370 public void setMethodObfNameAndSignature(String oldObfName, Signature obfSignature, String newObfName, Signature newObfSignature) { 370 public void setMethodObfNameAndSignature(String oldObfName, Signature obfSignature, String newObfName, Signature newObfSignature) {
371 assert(newObfName != null); 371 assert(newObfName != null);
372 MethodMapping methodMapping = m_methodsByObf.remove(getMethodKey(oldObfName, obfSignature)); 372 MethodMapping methodMapping = methodsByObf.remove(getMethodKey(oldObfName, obfSignature));
373 assert(methodMapping != null); 373 assert(methodMapping != null);
374 methodMapping.setObfName(newObfName); 374 methodMapping.setObfName(newObfName);
375 methodMapping.setObfSignature(newObfSignature); 375 methodMapping.setObfSignature(newObfSignature);
376 boolean obfWasAdded = m_methodsByObf.put(getMethodKey(newObfName, newObfSignature), methodMapping) == null; 376 boolean obfWasAdded = methodsByObf.put(getMethodKey(newObfName, newObfSignature), methodMapping) == null;
377 assert(obfWasAdded); 377 assert(obfWasAdded);
378 this.isDirty = true; 378 this.isDirty = true;
379 } 379 }
@@ -382,7 +382,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
382 382
383 public void setArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex, String argumentName) { 383 public void setArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex, String argumentName) {
384 assert (argumentName != null); 384 assert (argumentName != null);
385 MethodMapping methodMapping = m_methodsByObf.get(getMethodKey(obfMethodName, obfMethodSignature)); 385 MethodMapping methodMapping = methodsByObf.get(getMethodKey(obfMethodName, obfMethodSignature));
386 if (methodMapping == null) { 386 if (methodMapping == null) {
387 methodMapping = createMethodMapping(obfMethodName, obfMethodSignature); 387 methodMapping = createMethodMapping(obfMethodName, obfMethodSignature);
388 } 388 }
@@ -391,13 +391,13 @@ public class ClassMapping implements Comparable<ClassMapping> {
391 } 391 }
392 392
393 public void removeArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex) { 393 public void removeArgumentName(String obfMethodName, Signature obfMethodSignature, int argumentIndex) {
394 m_methodsByObf.get(getMethodKey(obfMethodName, obfMethodSignature)).removeArgumentName(argumentIndex); 394 methodsByObf.get(getMethodKey(obfMethodName, obfMethodSignature)).removeArgumentName(argumentIndex);
395 this.isDirty = true; 395 this.isDirty = true;
396 } 396 }
397 397
398 private MethodMapping createMethodMapping(String obfName, Signature obfSignature) { 398 private MethodMapping createMethodMapping(String obfName, Signature obfSignature) {
399 MethodMapping methodMapping = new MethodMapping(obfName, obfSignature); 399 MethodMapping methodMapping = new MethodMapping(obfName, obfSignature);
400 boolean wasAdded = m_methodsByObf.put(getMethodKey(obfName, obfSignature), methodMapping) == null; 400 boolean wasAdded = methodsByObf.put(getMethodKey(obfName, obfSignature), methodMapping) == null;
401 assert (wasAdded); 401 assert (wasAdded);
402 this.isDirty = true; 402 this.isDirty = true;
403 return methodMapping; 403 return methodMapping;
@@ -406,9 +406,9 @@ public class ClassMapping implements Comparable<ClassMapping> {
406 @Override 406 @Override
407 public String toString() { 407 public String toString() {
408 StringBuilder buf = new StringBuilder(); 408 StringBuilder buf = new StringBuilder();
409 buf.append(m_obfFullName); 409 buf.append(obfFullName);
410 buf.append(" <-> "); 410 buf.append(" <-> ");
411 buf.append(m_deobfName); 411 buf.append(deobfName);
412 buf.append("\n"); 412 buf.append("\n");
413 buf.append("Fields:\n"); 413 buf.append("Fields:\n");
414 for (FieldMapping fieldMapping : fields()) { 414 for (FieldMapping fieldMapping : fields()) {
@@ -419,12 +419,12 @@ public class ClassMapping implements Comparable<ClassMapping> {
419 buf.append("\n"); 419 buf.append("\n");
420 } 420 }
421 buf.append("Methods:\n"); 421 buf.append("Methods:\n");
422 for (MethodMapping methodMapping : m_methodsByObf.values()) { 422 for (MethodMapping methodMapping : methodsByObf.values()) {
423 buf.append(methodMapping.toString()); 423 buf.append(methodMapping.toString());
424 buf.append("\n"); 424 buf.append("\n");
425 } 425 }
426 buf.append("Inner Classes:\n"); 426 buf.append("Inner Classes:\n");
427 for (ClassMapping classMapping : m_innerClassesByObfSimple.values()) { 427 for (ClassMapping classMapping : innerClassesByObfSimple.values()) {
428 buf.append("\t"); 428 buf.append("\t");
429 buf.append(classMapping.getObfSimpleName()); 429 buf.append(classMapping.getObfSimpleName());
430 buf.append(" <-> "); 430 buf.append(" <-> ");
@@ -437,49 +437,51 @@ public class ClassMapping implements Comparable<ClassMapping> {
437 @Override 437 @Override
438 public int compareTo(ClassMapping other) { 438 public int compareTo(ClassMapping other) {
439 // sort by a, b, c, ... aa, ab, etc 439 // sort by a, b, c, ... aa, ab, etc
440 if (m_obfFullName.length() != other.m_obfFullName.length()) { 440 if (obfFullName.length() != other.obfFullName.length()) {
441 return m_obfFullName.length() - other.m_obfFullName.length(); 441 return obfFullName.length() - other.obfFullName.length();
442 } 442 }
443 return m_obfFullName.compareTo(other.m_obfFullName); 443 return obfFullName.compareTo(other.obfFullName);
444 } 444 }
445 445
446 public boolean renameObfClass(String oldObfClassName, String newObfClassName) { 446 public boolean renameObfClass(String oldObfClassName, String newObfClassName) {
447 447
448 // rename inner classes 448 // rename inner classes
449 for (ClassMapping innerClassMapping : new ArrayList<>(m_innerClassesByObfSimple.values())) { 449 for (ClassMapping innerClassMapping : new ArrayList<>(innerClassesByObfSimple.values())) {
450 if (innerClassMapping.renameObfClass(oldObfClassName, newObfClassName)) { 450 if (innerClassMapping.renameObfClass(oldObfClassName, newObfClassName)) {
451 boolean wasRemoved = m_innerClassesByObfSimple.remove(oldObfClassName) != null; 451 boolean wasRemoved = innerClassesByObfSimple.remove(oldObfClassName) != null;
452 assert (wasRemoved); 452 assert (wasRemoved);
453 boolean wasAdded = m_innerClassesByObfSimple.put(newObfClassName, innerClassMapping) == null; 453 boolean wasAdded = innerClassesByObfSimple.put(newObfClassName, innerClassMapping) == null;
454 assert (wasAdded); 454 assert (wasAdded);
455 } 455 }
456 } 456 }
457 457
458 // rename field types 458 // rename field types
459 for (FieldMapping fieldMapping : new ArrayList<>(m_fieldsByObf.values())) { 459 for (FieldMapping fieldMapping : new ArrayList<>(fieldsByObf.values())) {
460 String oldFieldKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()); 460 String oldFieldKey = getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType());
461 if (fieldMapping.renameObfClass(oldObfClassName, newObfClassName)) { 461 if (fieldMapping.renameObfClass(oldObfClassName, newObfClassName)) {
462 boolean wasRemoved = m_fieldsByObf.remove(oldFieldKey) != null; 462 boolean wasRemoved = fieldsByObf.remove(oldFieldKey) != null;
463 assert (wasRemoved); 463 assert (wasRemoved);
464 boolean wasAdded = m_fieldsByObf.put(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()), fieldMapping) == null; 464 boolean wasAdded = fieldsByObf
465 .put(getFieldKey(fieldMapping.getObfName(), fieldMapping.getObfType()), fieldMapping) == null;
465 assert (wasAdded); 466 assert (wasAdded);
466 } 467 }
467 } 468 }
468 469
469 // rename method signatures 470 // rename method signatures
470 for (MethodMapping methodMapping : new ArrayList<>(m_methodsByObf.values())) { 471 for (MethodMapping methodMapping : new ArrayList<>(methodsByObf.values())) {
471 String oldMethodKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()); 472 String oldMethodKey = getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature());
472 if (methodMapping.renameObfClass(oldObfClassName, newObfClassName)) { 473 if (methodMapping.renameObfClass(oldObfClassName, newObfClassName)) {
473 boolean wasRemoved = m_methodsByObf.remove(oldMethodKey) != null; 474 boolean wasRemoved = methodsByObf.remove(oldMethodKey) != null;
474 assert (wasRemoved); 475 assert (wasRemoved);
475 boolean wasAdded = m_methodsByObf.put(getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()), methodMapping) == null; 476 boolean wasAdded = methodsByObf
477 .put(getMethodKey(methodMapping.getObfName(), methodMapping.getObfSignature()), methodMapping) == null;
476 assert (wasAdded); 478 assert (wasAdded);
477 } 479 }
478 } 480 }
479 481
480 if (m_obfFullName.equals(oldObfClassName)) { 482 if (obfFullName.equals(oldObfClassName)) {
481 // rename this class 483 // rename this class
482 m_obfFullName = newObfClassName; 484 obfFullName = newObfClassName;
483 return true; 485 return true;
484 } 486 }
485 this.isDirty = true; 487 this.isDirty = true;
@@ -487,7 +489,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
487 } 489 }
488 490
489 public boolean containsArgument(BehaviorEntry obfBehaviorEntry, String name) { 491 public boolean containsArgument(BehaviorEntry obfBehaviorEntry, String name) {
490 MethodMapping methodMapping = m_methodsByObf.get(getMethodKey(obfBehaviorEntry.getName(), obfBehaviorEntry.getSignature())); 492 MethodMapping methodMapping = methodsByObf.get(getMethodKey(obfBehaviorEntry.getName(), obfBehaviorEntry.getSignature()));
491 return methodMapping != null && methodMapping.containsArgument(name); 493 return methodMapping != null && methodMapping.containsArgument(name);
492 } 494 }
493 495
@@ -496,7 +498,7 @@ public class ClassMapping implements Comparable<ClassMapping> {
496 } 498 }
497 499
498 public ClassEntry getObfEntry() { 500 public ClassEntry getObfEntry() {
499 return new ClassEntry(m_obfFullName); 501 return new ClassEntry(obfFullName);
500 } 502 }
501 503
502 public boolean isDirty() 504 public boolean isDirty()
@@ -522,11 +524,8 @@ public class ClassMapping implements Comparable<ClassMapping> {
522 } 524 }
523 525
524 public void setFieldModifier(String obfName, Type obfType, Mappings.EntryModifier modifier) { 526 public void setFieldModifier(String obfName, Type obfType, Mappings.EntryModifier modifier) {
525 FieldMapping fieldMapping = m_fieldsByObf.get(getFieldKey(obfName, obfType)); 527 FieldMapping fieldMapping = fieldsByObf.computeIfAbsent(getFieldKey(obfName, obfType),
526 if (fieldMapping == null) { 528 k -> new FieldMapping(obfName, obfType, null, Mappings.EntryModifier.UNCHANGED));
527 fieldMapping = new FieldMapping(obfName, obfType, null, Mappings.EntryModifier.UNCHANGED);
528 m_fieldsByObf.put(getFieldKey(obfName, obfType), fieldMapping);
529 }
530 529
531 if (fieldMapping.getModifier() != modifier) 530 if (fieldMapping.getModifier() != modifier)
532 { 531 {
@@ -536,11 +535,8 @@ public class ClassMapping implements Comparable<ClassMapping> {
536 } 535 }
537 536
538 public void setMethodModifier(String obfName, Signature sig, Mappings.EntryModifier modifier) { 537 public void setMethodModifier(String obfName, Signature sig, Mappings.EntryModifier modifier) {
539 MethodMapping methodMapping = m_methodsByObf.get(getMethodKey(obfName, sig)); 538 MethodMapping methodMapping = methodsByObf.computeIfAbsent(getMethodKey(obfName, sig),
540 if (methodMapping == null) { 539 k -> new MethodMapping(obfName, sig, null, Mappings.EntryModifier.UNCHANGED));
541 methodMapping = new MethodMapping(obfName, sig, null, Mappings.EntryModifier.UNCHANGED);
542 m_methodsByObf.put(getMethodKey(obfName, sig), methodMapping);
543 }
544 540
545 if (methodMapping.getModifier() != modifier) 541 if (methodMapping.getModifier() != modifier)
546 { 542 {