summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/ClassMapping.java
diff options
context:
space:
mode:
authorGravatar jeff2015-03-16 12:29:17 -0400
committerGravatar jeff2015-03-16 12:29:17 -0400
commitc133e05b786ff5357931842581571c046f958c74 (patch)
tree9fc998ac7b85828f3b57f04600244c6a79b2b2e8 /src/cuchaz/enigma/mapping/ClassMapping.java
parentAdded tag v0.9 beta for changeset 856528c00d1c (diff)
downloadenigma-fork-c133e05b786ff5357931842581571c046f958c74.tar.gz
enigma-fork-c133e05b786ff5357931842581571c046f958c74.tar.xz
enigma-fork-c133e05b786ff5357931842581571c046f958c74.zip
fix a zillion issues with inner classes
Diffstat (limited to 'src/cuchaz/enigma/mapping/ClassMapping.java')
-rw-r--r--src/cuchaz/enigma/mapping/ClassMapping.java79
1 files changed, 39 insertions, 40 deletions
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java
index 38cd3d6..6e7fd17 100644
--- a/src/cuchaz/enigma/mapping/ClassMapping.java
+++ b/src/cuchaz/enigma/mapping/ClassMapping.java
@@ -23,22 +23,23 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
23 private String m_obfFullName; 23 private String m_obfFullName;
24 private String m_obfSimpleName; 24 private String m_obfSimpleName;
25 private String m_deobfName; 25 private String m_deobfName;
26 private Map<String,ClassMapping> m_innerClassesByObf; 26 private Map<String,ClassMapping> m_innerClassesByObfSimple;
27 private Map<String,ClassMapping> m_innerClassesByDeobf; 27 private Map<String,ClassMapping> m_innerClassesByDeobf;
28 private Map<String,FieldMapping> m_fieldsByObf; 28 private Map<String,FieldMapping> m_fieldsByObf;
29 private Map<String,FieldMapping> m_fieldsByDeobf; 29 private Map<String,FieldMapping> m_fieldsByDeobf;
30 private Map<String,MethodMapping> m_methodsByObf; 30 private Map<String,MethodMapping> m_methodsByObf;
31 private Map<String,MethodMapping> m_methodsByDeobf; 31 private Map<String,MethodMapping> m_methodsByDeobf;
32 32
33 public ClassMapping(String obfName) { 33 public ClassMapping(String obfFullName) {
34 this(obfName, null); 34 this(obfFullName, null);
35 } 35 }
36 36
37 public ClassMapping(String obfName, String deobfName) { 37 public ClassMapping(String obfFullName, String deobfName) {
38 m_obfFullName = obfName; 38 m_obfFullName = obfFullName;
39 m_obfSimpleName = new ClassEntry(obfName).getSimpleName(); 39 ClassEntry classEntry = new ClassEntry(obfFullName);
40 m_obfSimpleName = classEntry.isInnerClass() ? classEntry.getInnermostClassName() : classEntry.getSimpleName();
40 m_deobfName = NameValidator.validateClassName(deobfName, false); 41 m_deobfName = NameValidator.validateClassName(deobfName, false);
41 m_innerClassesByObf = Maps.newHashMap(); 42 m_innerClassesByObfSimple = Maps.newHashMap();
42 m_innerClassesByDeobf = Maps.newHashMap(); 43 m_innerClassesByDeobf = Maps.newHashMap();
43 m_fieldsByObf = Maps.newHashMap(); 44 m_fieldsByObf = Maps.newHashMap();
44 m_fieldsByDeobf = Maps.newHashMap(); 45 m_fieldsByDeobf = Maps.newHashMap();
@@ -65,12 +66,12 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
65 //// INNER CLASSES //////// 66 //// INNER CLASSES ////////
66 67
67 public Iterable<ClassMapping> innerClasses() { 68 public Iterable<ClassMapping> innerClasses() {
68 assert (m_innerClassesByObf.size() >= m_innerClassesByDeobf.size()); 69 assert (m_innerClassesByObfSimple.size() >= m_innerClassesByDeobf.size());
69 return m_innerClassesByObf.values(); 70 return m_innerClassesByObfSimple.values();
70 } 71 }
71 72
72 public void addInnerClassMapping(ClassMapping classMapping) { 73 public void addInnerClassMapping(ClassMapping classMapping) {
73 boolean obfWasAdded = m_innerClassesByObf.put(classMapping.getObfSimpleName(), classMapping) == null; 74 boolean obfWasAdded = m_innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping) == null;
74 assert (obfWasAdded); 75 assert (obfWasAdded);
75 if (classMapping.getDeobfName() != null) { 76 if (classMapping.getDeobfName() != null) {
76 assert (isSimpleClassName(classMapping.getDeobfName())); 77 assert (isSimpleClassName(classMapping.getDeobfName()));
@@ -80,7 +81,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
80 } 81 }
81 82
82 public void removeInnerClassMapping(ClassMapping classMapping) { 83 public void removeInnerClassMapping(ClassMapping classMapping) {
83 boolean obfWasRemoved = m_innerClassesByObf.remove(classMapping.getObfSimpleName()) != null; 84 boolean obfWasRemoved = m_innerClassesByObfSimple.remove(classMapping.getObfSimpleName()) != null;
84 assert (obfWasRemoved); 85 assert (obfWasRemoved);
85 if (classMapping.getDeobfName() != null) { 86 if (classMapping.getDeobfName() != null) {
86 boolean deobfWasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null; 87 boolean deobfWasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null;
@@ -88,20 +89,19 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
88 } 89 }
89 } 90 }
90 91
91 public ClassMapping getOrCreateInnerClass(String obfName) { 92 public ClassMapping getOrCreateInnerClass(ClassEntry obfInnerClass) {
92 assert (isSimpleClassName(obfName)); 93 ClassMapping classMapping = m_innerClassesByObfSimple.get(obfInnerClass.getInnermostClassName());
93 ClassMapping classMapping = m_innerClassesByObf.get(obfName);
94 if (classMapping == null) { 94 if (classMapping == null) {
95 classMapping = new ClassMapping(obfName); 95 classMapping = new ClassMapping(obfInnerClass.getName());
96 boolean wasAdded = m_innerClassesByObf.put(obfName, classMapping) == null; 96 boolean wasAdded = m_innerClassesByObfSimple.put(classMapping.getObfSimpleName(), classMapping) == null;
97 assert (wasAdded); 97 assert (wasAdded);
98 } 98 }
99 return classMapping; 99 return classMapping;
100 } 100 }
101 101
102 public ClassMapping getInnerClassByObf(String obfName) { 102 public ClassMapping getInnerClassByObfSimple(String obfSimpleName) {
103 assert (isSimpleClassName(obfName)); 103 assert (isSimpleClassName(obfSimpleName));
104 return m_innerClassesByObf.get(obfName); 104 return m_innerClassesByObfSimple.get(obfSimpleName);
105 } 105 }
106 106
107 public ClassMapping getInnerClassByDeobf(String deobfName) { 107 public ClassMapping getInnerClassByDeobf(String deobfName) {
@@ -109,35 +109,25 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
109 return m_innerClassesByDeobf.get(deobfName); 109 return m_innerClassesByDeobf.get(deobfName);
110 } 110 }
111 111
112 public ClassMapping getInnerClassByDeobfThenObf(String name) { 112 public ClassMapping getInnerClassByDeobfThenObfSimple(String name) {
113 ClassMapping classMapping = getInnerClassByDeobf(name); 113 ClassMapping classMapping = getInnerClassByDeobf(name);
114 if (classMapping == null) { 114 if (classMapping == null) {
115 classMapping = getInnerClassByObf(name); 115 classMapping = getInnerClassByObfSimple(name);
116 } 116 }
117 return classMapping; 117 return classMapping;
118 } 118 }
119 119
120 public String getObfInnerClassSimpleName(String deobfName) { 120 public String getDeobfInnerClassName(String obfSimpleName) {
121 assert (isSimpleClassName(deobfName)); 121 assert (isSimpleClassName(obfSimpleName));
122 ClassMapping classMapping = m_innerClassesByDeobf.get(deobfName); 122 ClassMapping classMapping = m_innerClassesByObfSimple.get(obfSimpleName);
123 if (classMapping != null) {
124 return classMapping.getObfSimpleName();
125 }
126 return null;
127 }
128
129 public String getDeobfInnerClassName(String obfName) {
130 assert (isSimpleClassName(obfName));
131 ClassMapping classMapping = m_innerClassesByObf.get(obfName);
132 if (classMapping != null) { 123 if (classMapping != null) {
133 return classMapping.getDeobfName(); 124 return classMapping.getDeobfName();
134 } 125 }
135 return null; 126 return null;
136 } 127 }
137 128
138 public void setInnerClassName(String obfName, String deobfName) { 129 public void setInnerClassName(ClassEntry obfInnerClass, String deobfName) {
139 assert (isSimpleClassName(obfName)); 130 ClassMapping classMapping = getOrCreateInnerClass(obfInnerClass);
140 ClassMapping classMapping = getOrCreateInnerClass(obfName);
141 if (classMapping.getDeobfName() != null) { 131 if (classMapping.getDeobfName() != null) {
142 boolean wasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null; 132 boolean wasRemoved = m_innerClassesByDeobf.remove(classMapping.getDeobfName()) != null;
143 assert (wasRemoved); 133 assert (wasRemoved);
@@ -150,6 +140,15 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
150 } 140 }
151 } 141 }
152 142
143 public boolean hasInnerClassByObfSimple(String obfSimpleName) {
144 return m_innerClassesByObfSimple.containsKey(obfSimpleName);
145 }
146
147 public boolean hasInnerClassByDeobf(String deobfName) {
148 return m_innerClassesByDeobf.containsKey(deobfName);
149 }
150
151
153 //// FIELDS //////// 152 //// FIELDS ////////
154 153
155 public Iterable<FieldMapping> fields() { 154 public Iterable<FieldMapping> fields() {
@@ -382,7 +381,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
382 buf.append("\n"); 381 buf.append("\n");
383 } 382 }
384 buf.append("Inner Classes:\n"); 383 buf.append("Inner Classes:\n");
385 for (ClassMapping classMapping : m_innerClassesByObf.values()) { 384 for (ClassMapping classMapping : m_innerClassesByObfSimple.values()) {
386 buf.append("\t"); 385 buf.append("\t");
387 buf.append(classMapping.getObfSimpleName()); 386 buf.append(classMapping.getObfSimpleName());
388 buf.append(" <-> "); 387 buf.append(" <-> ");
@@ -404,11 +403,11 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> {
404 public boolean renameObfClass(String oldObfClassName, String newObfClassName) { 403 public boolean renameObfClass(String oldObfClassName, String newObfClassName) {
405 404
406 // rename inner classes 405 // rename inner classes
407 for (ClassMapping innerClassMapping : new ArrayList<ClassMapping>(m_innerClassesByObf.values())) { 406 for (ClassMapping innerClassMapping : new ArrayList<ClassMapping>(m_innerClassesByObfSimple.values())) {
408 if (innerClassMapping.renameObfClass(oldObfClassName, newObfClassName)) { 407 if (innerClassMapping.renameObfClass(oldObfClassName, newObfClassName)) {
409 boolean wasRemoved = m_innerClassesByObf.remove(oldObfClassName) != null; 408 boolean wasRemoved = m_innerClassesByObfSimple.remove(oldObfClassName) != null;
410 assert (wasRemoved); 409 assert (wasRemoved);
411 boolean wasAdded = m_innerClassesByObf.put(newObfClassName, innerClassMapping) == null; 410 boolean wasAdded = m_innerClassesByObfSimple.put(newObfClassName, innerClassMapping) == null;
412 assert (wasAdded); 411 assert (wasAdded);
413 } 412 }
414 } 413 }