summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/cuchaz/enigma/analysis/JarIndex.java8
-rw-r--r--src/main/java/cuchaz/enigma/mapping/Mappings.java16
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java19
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
16import java.io.File; 16import java.io.File;
17import java.io.IOException; 17import java.io.IOException;
18import java.util.ArrayList; 18import java.util.*;
19import java.util.Collection;
20import java.util.List;
21import java.util.Map;
22import java.util.Set;
23 19
24import com.google.common.collect.Sets; 20import com.google.common.collect.Sets;
25import cuchaz.enigma.analysis.TranslationIndex; 21import 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());