summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/MappingsRenamer.java
diff options
context:
space:
mode:
authorGravatar jeff2015-03-16 12:29:17 -0400
committerGravatar jeff2015-03-16 12:29:17 -0400
commitc133e05b786ff5357931842581571c046f958c74 (patch)
tree9fc998ac7b85828f3b57f04600244c6a79b2b2e8 /src/cuchaz/enigma/mapping/MappingsRenamer.java
parentAdded tag v0.9 beta for changeset 856528c00d1c (diff)
downloadenigma-fork-c133e05b786ff5357931842581571c046f958c74.tar.gz
enigma-fork-c133e05b786ff5357931842581571c046f958c74.tar.xz
enigma-fork-c133e05b786ff5357931842581571c046f958c74.zip
fix a zillion issues with inner classes
Diffstat (limited to 'src/cuchaz/enigma/mapping/MappingsRenamer.java')
-rw-r--r--src/cuchaz/enigma/mapping/MappingsRenamer.java128
1 files changed, 60 insertions, 68 deletions
diff --git a/src/cuchaz/enigma/mapping/MappingsRenamer.java b/src/cuchaz/enigma/mapping/MappingsRenamer.java
index 16f700d..d7766dc 100644
--- a/src/cuchaz/enigma/mapping/MappingsRenamer.java
+++ b/src/cuchaz/enigma/mapping/MappingsRenamer.java
@@ -13,10 +13,10 @@ package cuchaz.enigma.mapping;
13import java.io.IOException; 13import java.io.IOException;
14import java.io.ObjectOutputStream; 14import java.io.ObjectOutputStream;
15import java.io.OutputStream; 15import java.io.OutputStream;
16import java.util.List;
16import java.util.Set; 17import java.util.Set;
17import java.util.zip.GZIPOutputStream; 18import java.util.zip.GZIPOutputStream;
18 19
19import cuchaz.enigma.Constants;
20import cuchaz.enigma.analysis.JarIndex; 20import cuchaz.enigma.analysis.JarIndex;
21 21
22public class MappingsRenamer { 22public class MappingsRenamer {
@@ -30,48 +30,43 @@ public class MappingsRenamer {
30 } 30 }
31 31
32 public void setClassName(ClassEntry obf, String deobfName) { 32 public void setClassName(ClassEntry obf, String deobfName) {
33 deobfName = NameValidator.validateClassName(deobfName, !obf.isInnerClass());
34 ClassEntry targetEntry = new ClassEntry(deobfName);
35 if (m_mappings.containsDeobfClass(deobfName) || m_index.containsObfClass(targetEntry)) {
36 throw new IllegalNameException(deobfName, "There is already a class with that name");
37 }
38 33
39 ClassMapping classMapping = getOrCreateClassMapping(obf); 34 deobfName = NameValidator.validateClassName(deobfName, !obf.isInnerClass());
40 35
41 if (obf.isInnerClass()) { 36 List<ClassMapping> mappingChain = getOrCreateClassMappingChain(obf);
42 classMapping.setInnerClassName(obf.getInnerClassName(), deobfName); 37 if (mappingChain.size() == 1) {
38
39 if (deobfName != null) {
40 // make sure we don't rename to an existing obf or deobf class
41 if (m_mappings.containsDeobfClass(deobfName) || m_index.containsObfClass(new ClassEntry(deobfName))) {
42 throw new IllegalNameException(deobfName, "There is already a class with that name");
43 }
44 }
45
46 ClassMapping classMapping = mappingChain.get(0);
47 m_mappings.setClassDeobfName(classMapping, deobfName);
48
43 } else { 49 } else {
44 if (classMapping.getDeobfName() != null) { 50
45 boolean wasRemoved = m_mappings.m_classesByDeobf.remove(classMapping.getDeobfName()) != null; 51 ClassMapping outerClassMapping = mappingChain.get(mappingChain.size() - 2);
46 assert (wasRemoved); 52
53 if (deobfName != null) {
54 // make sure we don't rename to an existing obf or deobf inner class
55 if (outerClassMapping.hasInnerClassByDeobf(deobfName) || outerClassMapping.hasInnerClassByObfSimple(deobfName)) {
56 throw new IllegalNameException(deobfName, "There is already a class with that name");
57 }
47 } 58 }
48 classMapping.setDeobfName(deobfName); 59
49 boolean wasAdded = m_mappings.m_classesByDeobf.put(deobfName, classMapping) == null; 60 outerClassMapping.setInnerClassName(obf, deobfName);
50 assert (wasAdded);
51 } 61 }
52 } 62 }
53 63
54 public void removeClassMapping(ClassEntry obf) { 64 public void removeClassMapping(ClassEntry obf) {
55 ClassMapping classMapping = getClassMapping(obf); 65 setClassName(obf, null);
56 if (obf.isInnerClass()) {
57 classMapping.setInnerClassName(obf.getName(), null);
58 } else {
59 boolean wasRemoved = m_mappings.m_classesByDeobf.remove(classMapping.getDeobfName()) != null;
60 assert (wasRemoved);
61 classMapping.setDeobfName(null);
62 }
63 } 66 }
64 67
65 public void markClassAsDeobfuscated(ClassEntry obf) { 68 public void markClassAsDeobfuscated(ClassEntry obf) {
66 ClassMapping classMapping = getOrCreateClassMapping(obf); 69 setClassName(obf, obf.isInnerClass() ? obf.getInnermostClassName() : obf.getSimpleName());
67 if (obf.isInnerClass()) {
68 String innerClassName = Constants.NonePackage + "/" + obf.getInnerClassName();
69 classMapping.setInnerClassName(innerClassName, innerClassName);
70 } else {
71 classMapping.setDeobfName(obf.getName());
72 boolean wasAdded = m_mappings.m_classesByDeobf.put(obf.getName(), classMapping) == null;
73 assert (wasAdded);
74 }
75 } 70 }
76 71
77 public void setFieldName(FieldEntry obf, String deobfName) { 72 public void setFieldName(FieldEntry obf, String deobfName) {
@@ -81,17 +76,17 @@ public class MappingsRenamer {
81 throw new IllegalNameException(deobfName, "There is already a field with that name"); 76 throw new IllegalNameException(deobfName, "There is already a field with that name");
82 } 77 }
83 78
84 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 79 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
85 classMapping.setFieldName(obf.getName(), obf.getType(), deobfName); 80 classMapping.setFieldName(obf.getName(), obf.getType(), deobfName);
86 } 81 }
87 82
88 public void removeFieldMapping(FieldEntry obf) { 83 public void removeFieldMapping(FieldEntry obf) {
89 ClassMapping classMapping = getClassMappingOrInnerClassMapping(obf.getClassEntry()); 84 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
90 classMapping.removeFieldMapping(classMapping.getFieldByObf(obf.getName(), obf.getType())); 85 classMapping.removeFieldMapping(classMapping.getFieldByObf(obf.getName(), obf.getType()));
91 } 86 }
92 87
93 public void markFieldAsDeobfuscated(FieldEntry obf) { 88 public void markFieldAsDeobfuscated(FieldEntry obf) {
94 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 89 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
95 classMapping.setFieldName(obf.getName(), obf.getType(), obf.getName()); 90 classMapping.setFieldName(obf.getName(), obf.getType(), obf.getName());
96 } 91 }
97 92
@@ -121,7 +116,7 @@ public class MappingsRenamer {
121 throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); 116 throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName);
122 } 117 }
123 118
124 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 119 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
125 classMapping.setMethodName(obf.getName(), obf.getSignature(), deobfName); 120 classMapping.setMethodName(obf.getName(), obf.getSignature(), deobfName);
126 } 121 }
127 122
@@ -132,7 +127,7 @@ public class MappingsRenamer {
132 } 127 }
133 128
134 public void removeMethodMapping(MethodEntry obf) { 129 public void removeMethodMapping(MethodEntry obf) {
135 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 130 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
136 classMapping.setMethodName(obf.getName(), obf.getSignature(), null); 131 classMapping.setMethodName(obf.getName(), obf.getSignature(), null);
137 } 132 }
138 133
@@ -143,7 +138,7 @@ public class MappingsRenamer {
143 } 138 }
144 139
145 public void markMethodAsDeobfuscated(MethodEntry obf) { 140 public void markMethodAsDeobfuscated(MethodEntry obf) {
146 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 141 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
147 classMapping.setMethodName(obf.getName(), obf.getSignature(), obf.getName()); 142 classMapping.setMethodName(obf.getName(), obf.getSignature(), obf.getName());
148 } 143 }
149 144
@@ -154,17 +149,17 @@ public class MappingsRenamer {
154 throw new IllegalNameException(deobfName, "There is already an argument with that name"); 149 throw new IllegalNameException(deobfName, "There is already an argument with that name");
155 } 150 }
156 151
157 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 152 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
158 classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName); 153 classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName);
159 } 154 }
160 155
161 public void removeArgumentMapping(ArgumentEntry obf) { 156 public void removeArgumentMapping(ArgumentEntry obf) {
162 ClassMapping classMapping = getClassMappingOrInnerClassMapping(obf.getClassEntry()); 157 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
163 classMapping.removeArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex()); 158 classMapping.removeArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex());
164 } 159 }
165 160
166 public void markArgumentAsDeobfuscated(ArgumentEntry obf) { 161 public void markArgumentAsDeobfuscated(ArgumentEntry obf) {
167 ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping(obf.getClassEntry()); 162 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
168 classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), obf.getName()); 163 classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), obf.getName());
169 } 164 }
170 165
@@ -204,34 +199,31 @@ public class MappingsRenamer {
204 gzipout.finish(); 199 gzipout.finish();
205 } 200 }
206 201
207 private ClassMapping getClassMapping(ClassEntry obfClassEntry) {
208 return m_mappings.m_classesByObf.get(obfClassEntry.getOuterClassName());
209 }
210
211 private ClassMapping getOrCreateClassMapping(ClassEntry obfClassEntry) { 202 private ClassMapping getOrCreateClassMapping(ClassEntry obfClassEntry) {
212 String obfClassName = obfClassEntry.getOuterClassName(); 203 List<ClassMapping> mappingChain = getOrCreateClassMappingChain(obfClassEntry);
213 ClassMapping classMapping = m_mappings.m_classesByObf.get(obfClassName); 204 return mappingChain.get(mappingChain.size() - 1);
214 if (classMapping == null) { 205 }
215 classMapping = new ClassMapping(obfClassName); 206
216 boolean obfWasAdded = m_mappings.m_classesByObf.put(classMapping.getObfFullName(), classMapping) == null; 207 private List<ClassMapping> getOrCreateClassMappingChain(ClassEntry obfClassEntry) {
217 assert (obfWasAdded); 208 List<ClassEntry> classChain = obfClassEntry.getClassChain();
218 } 209 List<ClassMapping> mappingChain = m_mappings.getClassMappingChain(obfClassEntry);
219 return classMapping; 210 for (int i=0; i<classChain.size(); i++) {
220 } 211 ClassEntry classEntry = classChain.get(i);
221 212 ClassMapping classMapping = mappingChain.get(i);
222 private ClassMapping getClassMappingOrInnerClassMapping(ClassEntry obfClassEntry) { 213 if (classMapping == null) {
223 ClassMapping classMapping = getClassMapping(obfClassEntry); 214
224 if (obfClassEntry.isInDefaultPackage()) { 215 // create it
225 classMapping = classMapping.getInnerClassByObf(obfClassEntry.getInnerClassName()); 216 classMapping = new ClassMapping(classEntry.getName());
226 } 217 mappingChain.set(i, classMapping);
227 return classMapping; 218
228 } 219 // add it to the right parent
229 220 if (i == 0) {
230 private ClassMapping getOrCreateClassMappingOrInnerClassMapping(ClassEntry obfClassEntry) { 221 m_mappings.addClassMapping(classMapping);
231 ClassMapping classMapping = getOrCreateClassMapping(obfClassEntry); 222 } else {
232 if (obfClassEntry.isInnerClass()) { 223 mappingChain.get(i-1).addInnerClassMapping(classMapping);
233 classMapping = classMapping.getOrCreateInnerClass(obfClassEntry.getInnerClassName()); 224 }
225 }
234 } 226 }
235 return classMapping; 227 return mappingChain;
236 } 228 }
237} 229}