diff options
Diffstat (limited to 'src/cuchaz/enigma/convert/MappingsConverter.java')
| -rw-r--r-- | src/cuchaz/enigma/convert/MappingsConverter.java | 45 |
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 | ||