diff options
| author | 2015-03-16 12:29:17 -0400 | |
|---|---|---|
| committer | 2015-03-16 12:29:17 -0400 | |
| commit | c133e05b786ff5357931842581571c046f958c74 (patch) | |
| tree | 9fc998ac7b85828f3b57f04600244c6a79b2b2e8 /src/cuchaz/enigma/mapping/ClassMapping.java | |
| parent | Added tag v0.9 beta for changeset 856528c00d1c (diff) | |
| download | enigma-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.java | 79 |
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 | } |