diff options
| author | 2015-03-16 12:29:17 -0400 | |
|---|---|---|
| committer | 2015-03-16 12:29:17 -0400 | |
| commit | c133e05b786ff5357931842581571c046f958c74 (patch) | |
| tree | 9fc998ac7b85828f3b57f04600244c6a79b2b2e8 /src/cuchaz/enigma/mapping/MappingsRenamer.java | |
| parent | Added tag v0.9 beta for changeset 856528c00d1c (diff) | |
| download | enigma-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.java | 128 |
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; | |||
| 13 | import java.io.IOException; | 13 | import java.io.IOException; |
| 14 | import java.io.ObjectOutputStream; | 14 | import java.io.ObjectOutputStream; |
| 15 | import java.io.OutputStream; | 15 | import java.io.OutputStream; |
| 16 | import java.util.List; | ||
| 16 | import java.util.Set; | 17 | import java.util.Set; |
| 17 | import java.util.zip.GZIPOutputStream; | 18 | import java.util.zip.GZIPOutputStream; |
| 18 | 19 | ||
| 19 | import cuchaz.enigma.Constants; | ||
| 20 | import cuchaz.enigma.analysis.JarIndex; | 20 | import cuchaz.enigma.analysis.JarIndex; |
| 21 | 21 | ||
| 22 | public class MappingsRenamer { | 22 | public 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 | } |