summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/Mappings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping/Mappings.java')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/Mappings.java83
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
13import com.google.common.collect.Lists; 13import com.google.common.collect.Lists;
14import com.google.common.collect.Maps; 14import com.google.common.collect.Maps;
15import com.google.common.collect.Sets;
16 15
17import java.io.Serializable; 16import java.util.Collection;
18import java.util.*; 17import java.util.List;
18import java.util.Map;
19 19
20import cuchaz.enigma.analysis.TranslationIndex; 20import cuchaz.enigma.analysis.TranslationIndex;
21import cuchaz.enigma.throwables.MappingConflict;
21 22
22public class Mappings implements Serializable { 23public 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 }