diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/Mappings.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/mapping/Mappings.java | 83 |
1 files changed, 31 insertions, 52 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index ee4c302..b51e1a4 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -12,85 +12,64 @@ package cuchaz.enigma.mapping; | |||
| 12 | 12 | ||
| 13 | import com.google.common.collect.Lists; | 13 | import com.google.common.collect.Lists; |
| 14 | import com.google.common.collect.Maps; | 14 | import com.google.common.collect.Maps; |
| 15 | import com.google.common.collect.Sets; | ||
| 16 | 15 | ||
| 17 | import java.io.Serializable; | 16 | import java.util.Collection; |
| 18 | import java.util.*; | 17 | import java.util.List; |
| 18 | import java.util.Map; | ||
| 19 | 19 | ||
| 20 | import cuchaz.enigma.analysis.TranslationIndex; | 20 | import cuchaz.enigma.analysis.TranslationIndex; |
| 21 | import cuchaz.enigma.throwables.MappingConflict; | ||
| 21 | 22 | ||
| 22 | public class Mappings implements Serializable { | 23 | public class Mappings { |
| 23 | 24 | ||
| 24 | private static final long serialVersionUID = 4649790259460259026L; | 25 | protected Map<String, ClassMapping> classesByObf; |
| 25 | 26 | protected Map<String, ClassMapping> classesByDeobf; | |
| 26 | protected Map<String, ClassMapping> m_classesByObf; | ||
| 27 | protected Map<String, ClassMapping> m_classesByDeobf; | ||
| 28 | 27 | ||
| 29 | public Mappings() { | 28 | public Mappings() { |
| 30 | m_classesByObf = Maps.newHashMap(); | 29 | this.classesByObf = Maps.newHashMap(); |
| 31 | m_classesByDeobf = Maps.newHashMap(); | 30 | this.classesByDeobf = Maps.newHashMap(); |
| 32 | } | ||
| 33 | |||
| 34 | public Mappings(Iterable<ClassMapping> classes) { | ||
| 35 | this(); | ||
| 36 | |||
| 37 | for (ClassMapping classMapping : classes) { | ||
| 38 | m_classesByObf.put(classMapping.getObfFullName(), classMapping); | ||
| 39 | if (classMapping.getDeobfName() != null) { | ||
| 40 | m_classesByDeobf.put(classMapping.getDeobfName(), classMapping); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | } | 31 | } |
| 44 | 32 | ||
| 45 | public Collection<ClassMapping> classes() { | 33 | public Collection<ClassMapping> classes() { |
| 46 | assert (m_classesByObf.size() >= m_classesByDeobf.size()); | 34 | assert (this.classesByObf.size() >= this.classesByDeobf.size()); |
| 47 | return m_classesByObf.values(); | 35 | return this.classesByObf.values(); |
| 48 | } | 36 | } |
| 49 | 37 | ||
| 50 | public void addClassMapping(ClassMapping classMapping) { | 38 | public void addClassMapping(ClassMapping classMapping) throws MappingConflict { |
| 51 | if (m_classesByObf.containsKey(classMapping.getObfFullName())) { | 39 | if (this.classesByObf.containsKey(classMapping.getObfFullName())) { |
| 52 | throw new Error("Already have mapping for " + classMapping.getObfFullName()); | 40 | throw new MappingConflict("class", classMapping.getObfFullName(), this.classesByObf.get(classMapping.getObfFullName()).getObfFullName()); |
| 53 | } | 41 | } |
| 54 | boolean obfWasAdded = m_classesByObf.put(classMapping.getObfFullName(), classMapping) == null; | 42 | this.classesByObf.put(classMapping.getObfFullName(), classMapping); |
| 55 | assert (obfWasAdded); | 43 | |
| 56 | if (classMapping.getDeobfName() != null) { | 44 | if (classMapping.getDeobfName() != null) { |
| 57 | if (m_classesByDeobf.containsKey(classMapping.getDeobfName())) { | 45 | if (this.classesByDeobf.containsKey(classMapping.getDeobfName())) { |
| 58 | throw new Error("Already have mapping for " + classMapping.getDeobfName()); | 46 | throw new MappingConflict("class", classMapping.getDeobfName(), this.classesByDeobf.get(classMapping.getDeobfName()).getDeobfName()); |
| 59 | } | 47 | } |
| 60 | boolean deobfWasAdded = m_classesByDeobf.put(classMapping.getDeobfName(), classMapping) == null; | 48 | this.classesByDeobf.put(classMapping.getDeobfName(), classMapping); |
| 61 | assert (deobfWasAdded); | ||
| 62 | } | 49 | } |
| 63 | } | 50 | } |
| 64 | 51 | ||
| 65 | public void removeClassMapping(ClassMapping classMapping) { | 52 | public void removeClassMapping(ClassMapping classMapping) { |
| 66 | boolean obfWasRemoved = m_classesByObf.remove(classMapping.getObfFullName()) != null; | 53 | boolean obfWasRemoved = this.classesByObf.remove(classMapping.getObfFullName()) != null; |
| 67 | assert (obfWasRemoved); | 54 | assert (obfWasRemoved); |
| 68 | if (classMapping.getDeobfName() != null) { | 55 | if (classMapping.getDeobfName() != null) { |
| 69 | boolean deobfWasRemoved = m_classesByDeobf.remove(classMapping.getDeobfName()) != null; | 56 | boolean deobfWasRemoved = this.classesByDeobf.remove(classMapping.getDeobfName()) != null; |
| 70 | assert (deobfWasRemoved); | 57 | assert (deobfWasRemoved); |
| 71 | } | 58 | } |
| 72 | } | 59 | } |
| 73 | 60 | ||
| 74 | public ClassMapping getClassByObf(ClassEntry entry) { | ||
| 75 | return getClassByObf(entry.getName()); | ||
| 76 | } | ||
| 77 | |||
| 78 | public ClassMapping getClassByObf(String obfName) { | 61 | public ClassMapping getClassByObf(String obfName) { |
| 79 | return m_classesByObf.get(obfName); | 62 | return this.classesByObf.get(obfName); |
| 80 | } | ||
| 81 | |||
| 82 | public ClassMapping getClassByDeobf(String deobfName) { | ||
| 83 | return m_classesByDeobf.get(deobfName); | ||
| 84 | } | 63 | } |
| 85 | 64 | ||
| 86 | public void setClassDeobfName(ClassMapping classMapping, String deobfName) { | 65 | public void setClassDeobfName(ClassMapping classMapping, String deobfName) { |
| 87 | if (classMapping.getDeobfName() != null) { | 66 | if (classMapping.getDeobfName() != null) { |
| 88 | boolean wasRemoved = m_classesByDeobf.remove(classMapping.getDeobfName()) != null; | 67 | boolean wasRemoved = this.classesByDeobf.remove(classMapping.getDeobfName()) != null; |
| 89 | assert (wasRemoved); | 68 | assert (wasRemoved); |
| 90 | } | 69 | } |
| 91 | classMapping.setDeobfName(deobfName); | 70 | classMapping.setDeobfName(deobfName); |
| 92 | if (deobfName != null) { | 71 | if (deobfName != null) { |
| 93 | boolean wasAdded = m_classesByDeobf.put(deobfName, classMapping) == null; | 72 | boolean wasAdded = this.classesByDeobf.put(deobfName, classMapping) == null; |
| 94 | assert (wasAdded); | 73 | assert (wasAdded); |
| 95 | } | 74 | } |
| 96 | } | 75 | } |
| @@ -99,7 +78,7 @@ public class Mappings implements Serializable { | |||
| 99 | switch (direction) { | 78 | switch (direction) { |
| 100 | case Deobfuscating: | 79 | case Deobfuscating: |
| 101 | 80 | ||
| 102 | return new Translator(direction, m_classesByObf, index); | 81 | return new Translator(direction, this.classesByObf, index); |
| 103 | 82 | ||
| 104 | case Obfuscating: | 83 | case Obfuscating: |
| 105 | 84 | ||
| @@ -127,7 +106,7 @@ public class Mappings implements Serializable { | |||
| 127 | @Override | 106 | @Override |
| 128 | public String toString() { | 107 | public String toString() { |
| 129 | StringBuilder buf = new StringBuilder(); | 108 | StringBuilder buf = new StringBuilder(); |
| 130 | for (ClassMapping classMapping : m_classesByObf.values()) { | 109 | for (ClassMapping classMapping : this.classesByObf.values()) { |
| 131 | buf.append(classMapping.toString()); | 110 | buf.append(classMapping.toString()); |
| 132 | buf.append("\n"); | 111 | buf.append("\n"); |
| 133 | } | 112 | } |
| @@ -135,21 +114,21 @@ public class Mappings implements Serializable { | |||
| 135 | } | 114 | } |
| 136 | 115 | ||
| 137 | public boolean containsDeobfClass(String deobfName) { | 116 | public boolean containsDeobfClass(String deobfName) { |
| 138 | return m_classesByDeobf.containsKey(deobfName); | 117 | return this.classesByDeobf.containsKey(deobfName); |
| 139 | } | 118 | } |
| 140 | 119 | ||
| 141 | public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName, Type obfType) { | 120 | public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName, Type obfType) { |
| 142 | ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); | 121 | ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); |
| 143 | return classMapping != null && classMapping.containsDeobfField(deobfName, obfType); | 122 | return classMapping != null && classMapping.containsDeobfField(deobfName, obfType); |
| 144 | } | 123 | } |
| 145 | 124 | ||
| 146 | public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, Signature deobfSignature) { | 125 | public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, Signature deobfSignature) { |
| 147 | ClassMapping classMapping = m_classesByObf.get(obfClassEntry.getName()); | 126 | ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); |
| 148 | return classMapping != null && classMapping.containsDeobfMethod(deobfName, deobfSignature); | 127 | return classMapping != null && classMapping.containsDeobfMethod(deobfName, deobfSignature); |
| 149 | } | 128 | } |
| 150 | 129 | ||
| 151 | public boolean containsArgument(BehaviorEntry obfBehaviorEntry, String name) { | 130 | public boolean containsArgument(BehaviorEntry obfBehaviorEntry, String name) { |
| 152 | ClassMapping classMapping = m_classesByObf.get(obfBehaviorEntry.getClassName()); | 131 | ClassMapping classMapping = this.classesByObf.get(obfBehaviorEntry.getClassName()); |
| 153 | return classMapping != null && classMapping.containsArgument(obfBehaviorEntry, name); | 132 | return classMapping != null && classMapping.containsArgument(obfBehaviorEntry, name); |
| 154 | } | 133 | } |
| 155 | 134 | ||
| @@ -158,7 +137,7 @@ public class Mappings implements Serializable { | |||
| 158 | ClassMapping classMapping = null; | 137 | ClassMapping classMapping = null; |
| 159 | for (ClassEntry obfClassEntry : obfClass.getClassChain()) { | 138 | for (ClassEntry obfClassEntry : obfClass.getClassChain()) { |
| 160 | if (mappingChain.isEmpty()) { | 139 | if (mappingChain.isEmpty()) { |
| 161 | classMapping = m_classesByObf.get(obfClassEntry.getName()); | 140 | classMapping = this.classesByObf.get(obfClassEntry.getName()); |
| 162 | } else if (classMapping != null) { | 141 | } else if (classMapping != null) { |
| 163 | classMapping = classMapping.getInnerClassByObfSimple(obfClassEntry.getInnermostClassName()); | 142 | classMapping = classMapping.getInnerClassByObfSimple(obfClassEntry.getInnermostClassName()); |
| 164 | } | 143 | } |