diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index f244748..7c6c831 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java | |||
| @@ -17,6 +17,7 @@ import java.util.List; | |||
| 17 | import java.util.Set; | 17 | import java.util.Set; |
| 18 | import java.util.zip.GZIPOutputStream; | 18 | import java.util.zip.GZIPOutputStream; |
| 19 | 19 | ||
| 20 | import com.google.common.collect.Lists; | ||
| 20 | import cuchaz.enigma.analysis.JarIndex; | 21 | import cuchaz.enigma.analysis.JarIndex; |
| 21 | import cuchaz.enigma.throwables.IllegalNameException; | 22 | import cuchaz.enigma.throwables.IllegalNameException; |
| 22 | import cuchaz.enigma.throwables.MappingConflict; | 23 | import cuchaz.enigma.throwables.MappingConflict; |
| @@ -110,10 +111,16 @@ public class MappingsRenamer { | |||
| 110 | 111 | ||
| 111 | deobfName = NameValidator.validateMethodName(deobfName); | 112 | deobfName = NameValidator.validateMethodName(deobfName); |
| 112 | for (MethodEntry entry : implementations) { | 113 | for (MethodEntry entry : implementations) { |
| 113 | Signature deobfSignature = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateSignature(obf.getSignature()); | 114 | MethodEntry targetEntry = new MethodEntry(entry.getClassEntry(), deobfName, entry.getSignature()); |
| 114 | MethodEntry targetEntry = new MethodEntry(entry.getClassEntry(), deobfName, deobfSignature); | 115 | |
| 115 | if (m_mappings.containsDeobfMethod(entry.getClassEntry(), deobfName, entry.getSignature()) || m_index.containsObfBehavior(targetEntry)) { | 116 | // TODO: Verify if I don't break things |
| 117 | ClassMapping classMapping = m_mappings.getClassByObf(entry.getClassEntry()); | ||
| 118 | if ((classMapping != null && classMapping.containsDeobfMethod(deobfName, entry.getSignature()) && classMapping.getMethodByObf(entry.getName(), entry.getSignature()) != classMapping.getMethodByDeobf(deobfName, entry.getSignature())) | ||
| 119 | || m_index.containsObfBehavior(targetEntry)) { | ||
| 116 | String deobfClassName = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(entry.getClassName()); | 120 | String deobfClassName = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(entry.getClassName()); |
| 121 | if (deobfClassName == null) { | ||
| 122 | deobfClassName = entry.getClassName(); | ||
| 123 | } | ||
| 117 | throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); | 124 | throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); |
| 118 | } | 125 | } |
| 119 | } | 126 | } |
| @@ -126,12 +133,18 @@ public class MappingsRenamer { | |||
| 126 | public void setMethodName(MethodEntry obf, String deobfName) { | 133 | public void setMethodName(MethodEntry obf, String deobfName) { |
| 127 | deobfName = NameValidator.validateMethodName(deobfName); | 134 | deobfName = NameValidator.validateMethodName(deobfName); |
| 128 | MethodEntry targetEntry = new MethodEntry(obf.getClassEntry(), deobfName, obf.getSignature()); | 135 | MethodEntry targetEntry = new MethodEntry(obf.getClassEntry(), deobfName, obf.getSignature()); |
| 129 | if (m_mappings.containsDeobfMethod(obf.getClassEntry(), deobfName, obf.getSignature()) || m_index.containsObfBehavior(targetEntry)) { | 136 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); |
| 137 | |||
| 138 | // TODO: Verify if I don't break things | ||
| 139 | if ((m_mappings.containsDeobfMethod(obf.getClassEntry(), deobfName, obf.getSignature()) && classMapping.getMethodByObf(obf.getName(), obf.getSignature()) != classMapping.getMethodByDeobf(deobfName, obf.getSignature())) | ||
| 140 | || m_index.containsObfBehavior(targetEntry)) { | ||
| 130 | String deobfClassName = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(obf.getClassName()); | 141 | String deobfClassName = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(obf.getClassName()); |
| 142 | if (deobfClassName == null) { | ||
| 143 | deobfClassName = obf.getClassName(); | ||
| 144 | } | ||
| 131 | throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); | 145 | throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); |
| 132 | } | 146 | } |
| 133 | 147 | ||
| 134 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); | ||
| 135 | classMapping.setMethodName(obf.getName(), obf.getSignature(), deobfName); | 148 | classMapping.setMethodName(obf.getName(), obf.getSignature(), deobfName); |
| 136 | } | 149 | } |
| 137 | 150 | ||
| @@ -163,9 +176,21 @@ public class MappingsRenamer { | |||
| 163 | 176 | ||
| 164 | Set<MethodEntry> implementations = m_index.getRelatedMethodImplementations(obfMethod); | 177 | Set<MethodEntry> implementations = m_index.getRelatedMethodImplementations(obfMethod); |
| 165 | for (MethodEntry entry : implementations) { | 178 | for (MethodEntry entry : implementations) { |
| 166 | // NOTE: don't need to check arguments for name collisions with names determined by Procyon | 179 | ClassMapping classMapping = m_mappings.getClassByObf(entry.getClassEntry()); |
| 167 | if (m_mappings.containsArgument(entry, deobfName)) { | 180 | if (classMapping != null) { |
| 168 | throw new IllegalNameException(deobfName, "There is already an argument with that name"); | 181 | MethodMapping mapping = classMapping.getMethodByObf(entry.getName(), entry.getSignature()); |
| 182 | // NOTE: don't need to check arguments for name collisions with names determined by Procyon | ||
| 183 | // TODO: Verify if I don't break things | ||
| 184 | if (mapping != null) { | ||
| 185 | for (ArgumentMapping argumentMapping : Lists.newArrayList(mapping.arguments())) { | ||
| 186 | if (argumentMapping.getIndex() != obf.getIndex()) { | ||
| 187 | if (mapping.getDeobfArgumentName(argumentMapping.getIndex()).equals(deobfName) | ||
| 188 | || argumentMapping.getName().equals(deobfName)) { | ||
| 189 | throw new IllegalNameException(deobfName, "There is already an argument with that name"); | ||
| 190 | } | ||
| 191 | } | ||
| 192 | } | ||
| 193 | } | ||
| 169 | } | 194 | } |
| 170 | } | 195 | } |
| 171 | 196 | ||
| @@ -176,12 +201,21 @@ public class MappingsRenamer { | |||
| 176 | 201 | ||
| 177 | public void setArgumentName(ArgumentEntry obf, String deobfName) { | 202 | public void setArgumentName(ArgumentEntry obf, String deobfName) { |
| 178 | deobfName = NameValidator.validateArgumentName(deobfName); | 203 | deobfName = NameValidator.validateArgumentName(deobfName); |
| 204 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); | ||
| 205 | MethodMapping mapping = classMapping.getMethodByObf(obf.getMethodName(), obf.getMethodSignature()); | ||
| 179 | // NOTE: don't need to check arguments for name collisions with names determined by Procyon | 206 | // NOTE: don't need to check arguments for name collisions with names determined by Procyon |
| 180 | if (m_mappings.containsArgument(obf.getBehaviorEntry(), deobfName)) { | 207 | // TODO: Verify if I don't break things |
| 181 | throw new IllegalNameException(deobfName, "There is already an argument with that name"); | 208 | if (mapping != null) { |
| 209 | for (ArgumentMapping argumentMapping : Lists.newArrayList(mapping.arguments())) { | ||
| 210 | if (argumentMapping.getIndex() != obf.getIndex()) { | ||
| 211 | if (mapping.getDeobfArgumentName(argumentMapping.getIndex()).equals(deobfName) | ||
| 212 | || argumentMapping.getName().equals(deobfName)) { | ||
| 213 | throw new IllegalNameException(deobfName, "There is already an argument with that name"); | ||
| 214 | } | ||
| 215 | } | ||
| 216 | } | ||
| 182 | } | 217 | } |
| 183 | 218 | ||
| 184 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); | ||
| 185 | classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName); | 219 | classMapping.setArgumentName(obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName); |
| 186 | } | 220 | } |
| 187 | 221 | ||