summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
index 5c299e3..046e212 100644
--- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
+++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
@@ -19,6 +19,7 @@ import java.util.Set;
19import java.util.zip.GZIPOutputStream; 19import java.util.zip.GZIPOutputStream;
20 20
21import com.google.common.collect.Lists; 21import com.google.common.collect.Lists;
22import cuchaz.enigma.analysis.Access;
22import cuchaz.enigma.analysis.JarIndex; 23import cuchaz.enigma.analysis.JarIndex;
23import cuchaz.enigma.analysis.MethodImplementationsTreeNode; 24import cuchaz.enigma.analysis.MethodImplementationsTreeNode;
24import cuchaz.enigma.throwables.IllegalNameException; 25import cuchaz.enigma.throwables.IllegalNameException;
@@ -87,11 +88,49 @@ public class MappingsRenamer {
87 } 88 }
88 } 89 }
89 90
91 private void validateFieldTreeName(FieldEntry obf, String deobfName, byte directionFlag) {
92 FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType());
93 boolean contains = false;
94
95 ClassMapping classMapping = m_mappings.getClassByObf(obf.getClassEntry());
96 if (classMapping != null && classMapping.containsDeobfField(deobfName, obf.getType())
97 && m_index.getAccess(classMapping.getFieldByDeobf(deobfName, obf.getType()).getObfEntry(obf.getClassEntry())).isSubclassAccessible()) {
98 contains = true;
99 }
100
101 if (!contains && m_index.containsObfField(targetEntry)
102 && m_index.getAccess(targetEntry).isSubclassAccessible()) {
103 contains = true;
104 }
105
106 if (contains) {
107 String deobfClassName = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(obf.getClassName());
108 if (deobfClassName == null) {
109 deobfClassName = obf.getClassName();
110 }
111 throw new IllegalNameException(deobfName, "There is already a field with that name in class " + deobfClassName);
112 }
113
114 if (directionFlag == 1) {
115 ClassEntry ancestor = m_index.getTranslationIndex().getSuperclass(obf.getClassEntry());
116 if (m_index.containsObfClass(ancestor)) {
117 validateFieldTreeName(obf.cloneToNewClass(ancestor), deobfName, directionFlag);
118 }
119 } else if (directionFlag == 2) {
120 for (ClassEntry child : m_index.getTranslationIndex().getSubclass(obf.getClassEntry())) {
121 validateFieldTreeName(obf.cloneToNewClass(child), deobfName, directionFlag);
122 }
123 }
124 }
125
90 public void setFieldName(FieldEntry obf, String deobfName) { 126 public void setFieldName(FieldEntry obf, String deobfName) {
91 deobfName = NameValidator.validateFieldName(deobfName); 127 deobfName = NameValidator.validateFieldName(deobfName);
92 FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType()); 128
93 if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName, obf.getType()) || m_index.containsObfField(targetEntry)) { 129 if (m_index.getAccess(obf).isSubclassAccessible()) {
94 throw new IllegalNameException(deobfName, "There is already a field with that name"); 130 validateFieldTreeName(obf, deobfName, (byte) 1);
131 validateFieldTreeName(obf, deobfName, (byte) 2);
132 } else {
133 validateFieldTreeName(obf, deobfName, (byte) 0);
95 } 134 }
96 135
97 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); 136 ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry());
@@ -122,8 +161,10 @@ public class MappingsRenamer {
122 throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName); 161 throw new IllegalNameException(deobfName, "There is already a method with that name and signature in class " + deobfClassName);
123 } 162 }
124 163
125 for (ClassEntry child : m_index.getTranslationIndex().getSubclass(entry.getClassEntry())) { 164 if (m_index.getAccess(entry) != Access.Private) {
126 validateMethodTreeName(entry.cloneToNewClass(child), deobfName); 165 for (ClassEntry child : m_index.getTranslationIndex().getSubclass(entry.getClassEntry())) {
166 validateMethodTreeName(entry.cloneToNewClass(child), deobfName);
167 }
127 } 168 }
128 } 169 }
129 170