summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/convert/MappingsConverter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/convert/MappingsConverter.java')
-rw-r--r--src/cuchaz/enigma/convert/MappingsConverter.java45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/cuchaz/enigma/convert/MappingsConverter.java b/src/cuchaz/enigma/convert/MappingsConverter.java
index 44bc8b8..59f3b5b 100644
--- a/src/cuchaz/enigma/convert/MappingsConverter.java
+++ b/src/cuchaz/enigma/convert/MappingsConverter.java
@@ -263,6 +263,7 @@ public class MappingsConverter {
263 Collection<? extends MemberMapping<T>> getMappings(ClassMapping destClassMapping); 263 Collection<? extends MemberMapping<T>> getMappings(ClassMapping destClassMapping);
264 Set<T> filterEntries(Collection<T> obfEntries, T obfSourceEntry, ClassMatches classMatches); 264 Set<T> filterEntries(Collection<T> obfEntries, T obfSourceEntry, ClassMatches classMatches);
265 void setMemberObfName(ClassMapping classMapping, MemberMapping<T> memberMapping, String newObfName); 265 void setMemberObfName(ClassMapping classMapping, MemberMapping<T> memberMapping, String newObfName);
266 boolean hasObfMember(ClassMapping classMapping, T obfEntry);
266 } 267 }
267 268
268 public static Doer<FieldEntry> getFieldDoer() { 269 public static Doer<FieldEntry> getFieldDoer() {
@@ -300,6 +301,11 @@ public class MappingsConverter {
300 FieldMapping fieldMapping = (FieldMapping)memberMapping; 301 FieldMapping fieldMapping = (FieldMapping)memberMapping;
301 classMapping.setFieldObfName(fieldMapping.getObfName(), fieldMapping.getObfType(), newObfName); 302 classMapping.setFieldObfName(fieldMapping.getObfName(), fieldMapping.getObfType(), newObfName);
302 } 303 }
304
305 @Override
306 public boolean hasObfMember(ClassMapping classMapping, FieldEntry obfField) {
307 return classMapping.getFieldByObf(obfField.getName(), obfField.getType()) != null;
308 }
303 }; 309 };
304 } 310 }
305 311
@@ -342,6 +348,11 @@ public class MappingsConverter {
342 MethodMapping methodMapping = (MethodMapping)memberMapping; 348 MethodMapping methodMapping = (MethodMapping)memberMapping;
343 classMapping.setMethodObfName(methodMapping.getObfName(), methodMapping.getObfSignature(), newObfName); 349 classMapping.setMethodObfName(methodMapping.getObfName(), methodMapping.getObfSignature(), newObfName);
344 } 350 }
351
352 @Override
353 public boolean hasObfMember(ClassMapping classMapping, BehaviorEntry obfBehavior) {
354 return classMapping.getMethodByObf(obfBehavior.getName(), obfBehavior.getSignature()) != null;
355 }
345 }; 356 };
346 } 357 }
347 358
@@ -475,13 +486,41 @@ public class MappingsConverter {
475 private static <T extends Entry> void applyMemberMatches(ClassMapping classMapping, MemberMatches<T> memberMatches, Doer<T> doer) { 486 private static <T extends Entry> void applyMemberMatches(ClassMapping classMapping, MemberMatches<T> memberMatches, Doer<T> doer) {
476 ClassEntry classEntry = classMapping.getObfEntry(); 487 ClassEntry classEntry = classMapping.getObfEntry();
477 488
478 // apply to this class 489 // make a map of all the renames we need to make
479 // TODO: need to sort renames so they happen in the right order!! 490 Map<T,T> renames = Maps.newHashMap();
480 for (MemberMapping<T> memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) { 491 for (MemberMapping<T> memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) {
481 T obfSourceEntry = memberMapping.getObfEntry(classEntry); 492 T obfSourceEntry = memberMapping.getObfEntry(classEntry);
482 T obfDestEntry = memberMatches.matches().get(obfSourceEntry); 493 T obfDestEntry = memberMatches.matches().get(obfSourceEntry);
483 if (obfDestEntry != null) { 494 if (obfDestEntry != null) {
484 doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName()); 495 if (obfDestEntry.getName().equals(obfSourceEntry.getName())) {
496 // same name, don't need to change anything
497 continue;
498 }
499 renames.put(obfSourceEntry, obfDestEntry);
500 }
501 }
502
503 // apply to this class (should never need more than n passes)
504 int numRenames = renames.size();
505 for (int i=0; i<numRenames && !renames.isEmpty(); i++) {
506 for (MemberMapping<T> memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) {
507 T obfSourceEntry = memberMapping.getObfEntry(classEntry);
508 T obfDestEntry = renames.get(obfSourceEntry);
509 if (obfDestEntry != null) {
510 // make sure this rename won't cause a collision
511 if (!doer.hasObfMember(classMapping, obfDestEntry)) {
512 doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName());
513 renames.remove(obfSourceEntry);
514 }
515 }
516 }
517 }
518 if (!renames.isEmpty()) {
519 System.err.println(String.format("WARNING: Couldn't apply all the renames for class %s. %d/%d renames left.",
520 classMapping.getObfFullName(), renames.size(), numRenames
521 ));
522 for (Map.Entry<T,T> entry : renames.entrySet()) {
523 System.err.println(String.format("\t%s -> %s", entry.getKey(), entry.getValue()));
485 } 524 }
486 } 525 }
487 526