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/Translator.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/Translator.java')
| -rw-r--r-- | src/cuchaz/enigma/mapping/Translator.java | 73 |
1 files changed, 19 insertions, 54 deletions
diff --git a/src/cuchaz/enigma/mapping/Translator.java b/src/cuchaz/enigma/mapping/Translator.java index d3b6e77..fb187b9 100644 --- a/src/cuchaz/enigma/mapping/Translator.java +++ b/src/cuchaz/enigma/mapping/Translator.java | |||
| @@ -24,6 +24,13 @@ public class Translator { | |||
| 24 | private Map<String,ClassMapping> m_classes; | 24 | private Map<String,ClassMapping> m_classes; |
| 25 | private TranslationIndex m_index; | 25 | private TranslationIndex m_index; |
| 26 | 26 | ||
| 27 | private ClassNameReplacer m_classNameReplacer = new ClassNameReplacer() { | ||
| 28 | @Override | ||
| 29 | public String replace(String className) { | ||
| 30 | return translateEntry(new ClassEntry(className)).getName(); | ||
| 31 | } | ||
| 32 | }; | ||
| 33 | |||
| 27 | public Translator() { | 34 | public Translator() { |
| 28 | m_direction = null; | 35 | m_direction = null; |
| 29 | m_classes = Maps.newHashMap(); | 36 | m_classes = Maps.newHashMap(); |
| @@ -69,48 +76,16 @@ public class Translator { | |||
| 69 | } | 76 | } |
| 70 | } | 77 | } |
| 71 | 78 | ||
| 72 | public String translateClass(String className) { | ||
| 73 | return translate(new ClassEntry(className)); | ||
| 74 | } | ||
| 75 | |||
| 76 | public String translate(ClassEntry in) { | 79 | public String translate(ClassEntry in) { |
| 77 | 80 | ClassEntry translated = translateEntry(in); | |
| 78 | if (in.isInnerClass()) { | 81 | if (translated.equals(in)) { |
| 79 | 82 | return null; | |
| 80 | // translate everything in the class chain, or return null | ||
| 81 | List<ClassMapping> mappingsChain = getClassMappingChain(in); | ||
| 82 | StringBuilder buf = new StringBuilder(); | ||
| 83 | for (ClassMapping classMapping : mappingsChain) { | ||
| 84 | if (classMapping == null) { | ||
| 85 | return null; | ||
| 86 | } | ||
| 87 | boolean isFirstClass = buf.length() == 0; | ||
| 88 | String name = m_direction.choose( | ||
| 89 | classMapping.getDeobfName(), | ||
| 90 | isFirstClass ? classMapping.getObfFullName() : classMapping.getObfSimpleName() | ||
| 91 | ); | ||
| 92 | if (name == null) { | ||
| 93 | return null; | ||
| 94 | } | ||
| 95 | if (!isFirstClass) { | ||
| 96 | buf.append("$"); | ||
| 97 | } | ||
| 98 | buf.append(name); | ||
| 99 | } | ||
| 100 | return buf.toString(); | ||
| 101 | |||
| 102 | } else { | ||
| 103 | |||
| 104 | // normal classes are easier | ||
| 105 | ClassMapping classMapping = m_classes.get(in.getName()); | ||
| 106 | if (classMapping == null) { | ||
| 107 | return null; | ||
| 108 | } | ||
| 109 | return m_direction.choose( | ||
| 110 | classMapping.getDeobfName(), | ||
| 111 | classMapping.getObfFullName() | ||
| 112 | ); | ||
| 113 | } | 83 | } |
| 84 | return translated.getName(); | ||
| 85 | } | ||
| 86 | |||
| 87 | public String translateClass(String className) { | ||
| 88 | return translate(new ClassEntry(className)); | ||
| 114 | } | 89 | } |
| 115 | 90 | ||
| 116 | public ClassEntry translateEntry(ClassEntry in) { | 91 | public ClassEntry translateEntry(ClassEntry in) { |
| @@ -264,21 +239,11 @@ public class Translator { | |||
| 264 | } | 239 | } |
| 265 | 240 | ||
| 266 | public Type translateType(Type type) { | 241 | public Type translateType(Type type) { |
| 267 | return new Type(type, new ClassNameReplacer() { | 242 | return new Type(type, m_classNameReplacer); |
| 268 | @Override | ||
| 269 | public String replace(String className) { | ||
| 270 | return translateClass(className); | ||
| 271 | } | ||
| 272 | }); | ||
| 273 | } | 243 | } |
| 274 | 244 | ||
| 275 | public Signature translateSignature(Signature signature) { | 245 | public Signature translateSignature(Signature signature) { |
| 276 | return new Signature(signature, new ClassNameReplacer() { | 246 | return new Signature(signature, m_classNameReplacer); |
| 277 | @Override | ||
| 278 | public String replace(String className) { | ||
| 279 | return translateClass(className); | ||
| 280 | } | ||
| 281 | }); | ||
| 282 | } | 247 | } |
| 283 | 248 | ||
| 284 | private ClassMapping findClassMapping(ClassEntry in) { | 249 | private ClassMapping findClassMapping(ClassEntry in) { |
| @@ -302,8 +267,8 @@ public class Translator { | |||
| 302 | ClassMapping innerClassMapping = null; | 267 | ClassMapping innerClassMapping = null; |
| 303 | if (outerClassMapping != null) { | 268 | if (outerClassMapping != null) { |
| 304 | innerClassMapping = m_direction.choose( | 269 | innerClassMapping = m_direction.choose( |
| 305 | outerClassMapping.getInnerClassByObf(parts[i]), | 270 | outerClassMapping.getInnerClassByObfSimple(parts[i]), |
| 306 | outerClassMapping.getInnerClassByDeobfThenObf(parts[i]) | 271 | outerClassMapping.getInnerClassByDeobfThenObfSimple(parts[i]) |
| 307 | ); | 272 | ); |
| 308 | } | 273 | } |
| 309 | mappingsChain.add(innerClassMapping); | 274 | mappingsChain.add(innerClassMapping); |