summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar asiekierka2016-10-16 13:22:07 +0200
committerGravatar asiekierka2016-10-16 13:22:07 +0200
commitea3d062ba2426903a37acca26acca187c7e245c3 (patch)
tree72ab4db33c6cd80971d7539c4de634dd51d923db /src/main/java
parentmake Enigma check subclasses of method implementations for duplicate mapping ... (diff)
downloadenigma-ea3d062ba2426903a37acca26acca187c7e245c3.tar.gz
enigma-ea3d062ba2426903a37acca26acca187c7e245c3.tar.xz
enigma-ea3d062ba2426903a37acca26acca187c7e245c3.zip
apply similar fix to fields
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/Access.java8
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java51
2 files changed, 54 insertions, 5 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/Access.java b/src/main/java/cuchaz/enigma/analysis/Access.java
index b8aafaa0..0077cb50 100644
--- a/src/main/java/cuchaz/enigma/analysis/Access.java
+++ b/src/main/java/cuchaz/enigma/analysis/Access.java
@@ -47,4 +47,12 @@ public enum Access {
47 // assume public by default 47 // assume public by default
48 return Public; 48 return Public;
49 } 49 }
50
51 public boolean isPackageAccessible() {
52 return this != Private;
53 }
54
55 public boolean isSubclassAccessible() {
56 return this == Protected || this == Public;
57 }
50} 58}
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
index 5c299e3e..046e2127 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