From 65f551cd25739f1ccfa15d819c6a23060ebf2629 Mon Sep 17 00:00:00 2001 From: jeff Date: Fri, 13 Mar 2015 16:46:02 -0400 Subject: complete mappings converion code. Still need to debug though --- src/cuchaz/enigma/convert/MappingsConverter.java | 45 ++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'src/cuchaz/enigma/convert/MappingsConverter.java') 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 { Collection> getMappings(ClassMapping destClassMapping); Set filterEntries(Collection obfEntries, T obfSourceEntry, ClassMatches classMatches); void setMemberObfName(ClassMapping classMapping, MemberMapping memberMapping, String newObfName); + boolean hasObfMember(ClassMapping classMapping, T obfEntry); } public static Doer getFieldDoer() { @@ -300,6 +301,11 @@ public class MappingsConverter { FieldMapping fieldMapping = (FieldMapping)memberMapping; classMapping.setFieldObfName(fieldMapping.getObfName(), fieldMapping.getObfType(), newObfName); } + + @Override + public boolean hasObfMember(ClassMapping classMapping, FieldEntry obfField) { + return classMapping.getFieldByObf(obfField.getName(), obfField.getType()) != null; + } }; } @@ -342,6 +348,11 @@ public class MappingsConverter { MethodMapping methodMapping = (MethodMapping)memberMapping; classMapping.setMethodObfName(methodMapping.getObfName(), methodMapping.getObfSignature(), newObfName); } + + @Override + public boolean hasObfMember(ClassMapping classMapping, BehaviorEntry obfBehavior) { + return classMapping.getMethodByObf(obfBehavior.getName(), obfBehavior.getSignature()) != null; + } }; } @@ -475,13 +486,41 @@ public class MappingsConverter { private static void applyMemberMatches(ClassMapping classMapping, MemberMatches memberMatches, Doer doer) { ClassEntry classEntry = classMapping.getObfEntry(); - // apply to this class - // TODO: need to sort renames so they happen in the right order!! + // make a map of all the renames we need to make + Map renames = Maps.newHashMap(); for (MemberMapping memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) { T obfSourceEntry = memberMapping.getObfEntry(classEntry); T obfDestEntry = memberMatches.matches().get(obfSourceEntry); if (obfDestEntry != null) { - doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName()); + if (obfDestEntry.getName().equals(obfSourceEntry.getName())) { + // same name, don't need to change anything + continue; + } + renames.put(obfSourceEntry, obfDestEntry); + } + } + + // apply to this class (should never need more than n passes) + int numRenames = renames.size(); + for (int i=0; i memberMapping : Lists.newArrayList(doer.getMappings(classMapping))) { + T obfSourceEntry = memberMapping.getObfEntry(classEntry); + T obfDestEntry = renames.get(obfSourceEntry); + if (obfDestEntry != null) { + // make sure this rename won't cause a collision + if (!doer.hasObfMember(classMapping, obfDestEntry)) { + doer.setMemberObfName(classMapping, memberMapping, obfDestEntry.getName()); + renames.remove(obfSourceEntry); + } + } + } + } + if (!renames.isEmpty()) { + System.err.println(String.format("WARNING: Couldn't apply all the renames for class %s. %d/%d renames left.", + classMapping.getObfFullName(), renames.size(), numRenames + )); + for (Map.Entry entry : renames.entrySet()) { + System.err.println(String.format("\t%s -> %s", entry.getKey(), entry.getValue())); } } -- cgit v1.2.3