diff options
| -rw-r--r-- | src/main/java/cuchaz/enigma/analysis/JarIndex.java | 8 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/mapping/Mappings.java | 16 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java | 19 |
3 files changed, 36 insertions, 7 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index f955a408..ee1dd544 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -771,6 +771,14 @@ public class JarIndex { | |||
| 771 | return this.access.containsKey(obfBehaviorEntry); | 771 | return this.access.containsKey(obfBehaviorEntry); |
| 772 | } | 772 | } |
| 773 | 773 | ||
| 774 | public boolean containsEntryWithSameName(Entry entry) | ||
| 775 | { | ||
| 776 | for (Entry target : this.access.keySet()) | ||
| 777 | if (target.getName().equals(entry.getName()) && entry.getClass().isInstance(target.getClass())) | ||
| 778 | return true; | ||
| 779 | return false; | ||
| 780 | } | ||
| 781 | |||
| 774 | public boolean containsObfArgument(ArgumentEntry obfArgumentEntry) { | 782 | public boolean containsObfArgument(ArgumentEntry obfArgumentEntry) { |
| 775 | // check the behavior | 783 | // check the behavior |
| 776 | if (!containsObfBehavior(obfArgumentEntry.getBehaviorEntry())) { | 784 | if (!containsObfBehavior(obfArgumentEntry.getBehaviorEntry())) { |
diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index 912a57ab..2166bb9f 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -15,11 +15,7 @@ import com.google.common.collect.Maps; | |||
| 15 | 15 | ||
| 16 | import java.io.File; | 16 | import java.io.File; |
| 17 | import java.io.IOException; | 17 | import java.io.IOException; |
| 18 | import java.util.ArrayList; | 18 | import java.util.*; |
| 19 | import java.util.Collection; | ||
| 20 | import java.util.List; | ||
| 21 | import java.util.Map; | ||
| 22 | import java.util.Set; | ||
| 23 | 19 | ||
| 24 | import com.google.common.collect.Sets; | 20 | import com.google.common.collect.Sets; |
| 25 | import cuchaz.enigma.analysis.TranslationIndex; | 21 | import cuchaz.enigma.analysis.TranslationIndex; |
| @@ -177,6 +173,16 @@ public class Mappings { | |||
| 177 | return classMapping != null && classMapping.containsDeobfField(deobfName, obfType); | 173 | return classMapping != null && classMapping.containsDeobfField(deobfName, obfType); |
| 178 | } | 174 | } |
| 179 | 175 | ||
| 176 | public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName) { | ||
| 177 | ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); | ||
| 178 | if (classMapping != null) | ||
| 179 | for (FieldMapping fieldMapping : classMapping.fields()) | ||
| 180 | if (deobfName.equals(fieldMapping.getDeobfName()) || deobfName.equals(fieldMapping.getObfName())) | ||
| 181 | return true; | ||
| 182 | |||
| 183 | return false; | ||
| 184 | } | ||
| 185 | |||
| 180 | public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, Signature obfSignature) { | 186 | public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, Signature obfSignature) { |
| 181 | ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); | 187 | ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); |
| 182 | return classMapping != null && classMapping.containsDeobfMethod(deobfName, obfSignature); | 188 | return classMapping != null && classMapping.containsDeobfMethod(deobfName, obfSignature); |
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index 5c299e3e..4e812b10 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java | |||
| @@ -90,8 +90,23 @@ public class MappingsRenamer { | |||
| 90 | public void setFieldName(FieldEntry obf, String deobfName) { | 90 | public void setFieldName(FieldEntry obf, String deobfName) { |
| 91 | deobfName = NameValidator.validateFieldName(deobfName); | 91 | deobfName = NameValidator.validateFieldName(deobfName); |
| 92 | FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType()); | 92 | FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType()); |
| 93 | if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName, obf.getType()) || m_index.containsObfField(targetEntry)) { | 93 | ClassEntry definedClass = null; |
| 94 | throw new IllegalNameException(deobfName, "There is already a field with that name"); | 94 | if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName) || m_index.containsEntryWithSameName(targetEntry)) |
| 95 | definedClass = obf.getClassEntry(); | ||
| 96 | else { | ||
| 97 | for (ClassEntry ancestorEntry : this.m_index.getTranslationIndex().getAncestry(obf.getClassEntry())) { | ||
| 98 | if (m_mappings.containsDeobfField(ancestorEntry, deobfName) || m_index.containsEntryWithSameName(targetEntry.cloneToNewClass(ancestorEntry))) { | ||
| 99 | definedClass = ancestorEntry; | ||
| 100 | break; | ||
| 101 | } | ||
| 102 | } | ||
| 103 | } | ||
| 104 | |||
| 105 | if (definedClass != null) { | ||
| 106 | String className = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(definedClass.getClassName()); | ||
| 107 | if (className == null) | ||
| 108 | className = definedClass.getClassName(); | ||
| 109 | throw new IllegalNameException(deobfName, "There is already a field with that name in " + className); | ||
| 95 | } | 110 | } |
| 96 | 111 | ||
| 97 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); | 112 | ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); |