summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
diff options
context:
space:
mode:
authorGravatar asiekierka2016-09-12 15:17:04 +0200
committerGravatar asiekierka2016-09-12 15:17:04 +0200
commitcfbb0efbff7c0fb2128fea25c2e15f4f911077c1 (patch)
tree6ef2a86ae9be1e932e2ff612d4eb723aa1baa184 /src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java
parentfix publify not handling package-default methods (diff)
downloadenigma-fork-cfbb0efbff7c0fb2128fea25c2e15f4f911077c1.tar.gz
enigma-fork-cfbb0efbff7c0fb2128fea25c2e15f4f911077c1.tar.xz
enigma-fork-cfbb0efbff7c0fb2128fea25c2e15f4f911077c1.zip
fix method/argument renaming edge cases, add method/argument name rebuilder, add Package to Access enum
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java56
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;
17import java.util.Set; 17import java.util.Set;
18import java.util.zip.GZIPOutputStream; 18import java.util.zip.GZIPOutputStream;
19 19
20import com.google.common.collect.Lists;
20import cuchaz.enigma.analysis.JarIndex; 21import cuchaz.enigma.analysis.JarIndex;
21import cuchaz.enigma.throwables.IllegalNameException; 22import cuchaz.enigma.throwables.IllegalNameException;
22import cuchaz.enigma.throwables.MappingConflict; 23import 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