diff options
| author | 2018-07-17 19:14:08 +0200 | |
|---|---|---|
| committer | 2018-07-17 19:14:08 +0200 | |
| commit | a88175ffc95792b88a8724f66db6dda2b8cc32ee (patch) | |
| tree | 65895bbc6cf1766f4ca01e1257619ab1993e71dc /src/test/java/cuchaz/enigma/TestInnerClasses.java | |
| parent | Merge pull request #3 from thiakil/src-jar (diff) | |
| download | enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.gz enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.tar.xz enigma-fork-a88175ffc95792b88a8724f66db6dda2b8cc32ee.zip | |
ASM Based Class Translator (#1)
* Initial port to ASM
* Package updates
* Annotation + inner class translation
* Fix inner class mapping
* More bytecode translation
* Signature refactoring
* Fix highlighting of mapped names
* Fix parameter name offset
* Fix anonymous class generation
* Fix issues with inner class signature transformation
* Fix bridged method detection
* Fix compile issues
* Resolve all failed tests
* Apply deobfuscated name to transformed classes
* Fix class signatures not being translated
* Fix frame array type translation
* Fix frame array type translation
* Fix array translation in method calls
* Fix method reference and bridge detection
* Fix handling of null deobf mappings
* Parameter translation in interfaces
* Fix enum parameter index offset
* Fix parsed local variable indexing
* Fix stackoverflow on rebuilding method names
* Ignore invalid decompiled variable indices
* basic source jar
* Output directly to file on source export
* Make decompile parallel
* fix incorrect super calls
* Use previous save state to delete old mapping files
* Fix old mappings not properly being removed
* Fix old mappings not properly being removed
* make isMethodProvider public
(cherry picked from commit ebad6a9)
* speed up Deobfuscator's getSources by using a single TranslatingTypeloader and caching the ClassLoaderTypeloader
* ignore .idea project folders
* move SynchronizedTypeLoader to a non-inner
* fix signature remap of inners for now
* index & resolve method/field references for usages view
* Allow reader/writer subclasses to provide the underlying file operations
* fix giving obf classes a name not removing them from the panel
* buffer the ParsedJar class entry inputstream, allow use with a jarinputstream
* make CachingClasspathTypeLoader public
* make CachingClasspathTypeLoader public
* support enum switches with obfuscated SwitchMaps
Diffstat (limited to 'src/test/java/cuchaz/enigma/TestInnerClasses.java')
| -rw-r--r-- | src/test/java/cuchaz/enigma/TestInnerClasses.java | 49 |
1 files changed, 8 insertions, 41 deletions
diff --git a/src/test/java/cuchaz/enigma/TestInnerClasses.java b/src/test/java/cuchaz/enigma/TestInnerClasses.java index 38db0df..843a63c 100644 --- a/src/test/java/cuchaz/enigma/TestInnerClasses.java +++ b/src/test/java/cuchaz/enigma/TestInnerClasses.java | |||
| @@ -12,7 +12,9 @@ | |||
| 12 | package cuchaz.enigma; | 12 | package cuchaz.enigma; |
| 13 | 13 | ||
| 14 | import cuchaz.enigma.analysis.JarIndex; | 14 | import cuchaz.enigma.analysis.JarIndex; |
| 15 | import cuchaz.enigma.mapping.ClassEntry; | 15 | import cuchaz.enigma.analysis.ParsedJar; |
| 16 | import cuchaz.enigma.mapping.entry.ClassEntry; | ||
| 17 | import cuchaz.enigma.mapping.entry.ReferencedEntryPool; | ||
| 16 | import org.junit.Test; | 18 | import org.junit.Test; |
| 17 | 19 | ||
| 18 | import java.util.jar.JarFile; | 20 | import java.util.jar.JarFile; |
| @@ -26,16 +28,10 @@ import static org.hamcrest.Matchers.nullValue; | |||
| 26 | 28 | ||
| 27 | public class TestInnerClasses { | 29 | public class TestInnerClasses { |
| 28 | 30 | ||
| 29 | private static final ClassEntry AnonymousOuter = newClass("a"); | ||
| 30 | private static final ClassEntry AnonymousInner = newClass("a$1"); | ||
| 31 | private static final ClassEntry SimpleOuter = newClass("d"); | 31 | private static final ClassEntry SimpleOuter = newClass("d"); |
| 32 | private static final ClassEntry SimpleInner = newClass("d$a"); | 32 | private static final ClassEntry SimpleInner = newClass("d$a"); |
| 33 | private static final ClassEntry ConstructorArgsOuter = newClass("c"); | 33 | private static final ClassEntry ConstructorArgsOuter = newClass("c"); |
| 34 | private static final ClassEntry ConstructorArgsInner = newClass("c$a"); | 34 | private static final ClassEntry ConstructorArgsInner = newClass("c$a"); |
| 35 | private static final ClassEntry AnonymousWithScopeArgsOuter = newClass("b"); | ||
| 36 | private static final ClassEntry AnonymousWithScopeArgsInner = newClass("b$1"); | ||
| 37 | private static final ClassEntry AnonymousWithOuterAccessOuter = newClass("e"); | ||
| 38 | private static final ClassEntry AnonymousWithOuterAccessInner = newClass("e$1"); | ||
| 39 | private static final ClassEntry ClassTreeRoot = newClass("f"); | 35 | private static final ClassEntry ClassTreeRoot = newClass("f"); |
| 40 | private static final ClassEntry ClassTreeLevel1 = newClass("f$a"); | 36 | private static final ClassEntry ClassTreeLevel1 = newClass("f$a"); |
| 41 | private static final ClassEntry ClassTreeLevel2 = newClass("f$a$a"); | 37 | private static final ClassEntry ClassTreeLevel2 = newClass("f$a$a"); |
| @@ -45,8 +41,8 @@ public class TestInnerClasses { | |||
| 45 | 41 | ||
| 46 | public TestInnerClasses() | 42 | public TestInnerClasses() |
| 47 | throws Exception { | 43 | throws Exception { |
| 48 | index = new JarIndex(); | 44 | index = new JarIndex(new ReferencedEntryPool()); |
| 49 | JarFile jar = new JarFile("build/test-obf/innerClasses.jar"); | 45 | ParsedJar jar = new ParsedJar(new JarFile("build/test-obf/innerClasses.jar")); |
| 50 | index.indexJar(jar, true); | 46 | index.indexJar(jar, true); |
| 51 | deobfuscator = new Deobfuscator(jar); | 47 | deobfuscator = new Deobfuscator(jar); |
| 52 | } | 48 | } |
| @@ -55,43 +51,17 @@ public class TestInnerClasses { | |||
| 55 | public void simple() { | 51 | public void simple() { |
| 56 | assertThat(index.getOuterClass(SimpleInner), is(SimpleOuter)); | 52 | assertThat(index.getOuterClass(SimpleInner), is(SimpleOuter)); |
| 57 | assertThat(index.getInnerClasses(SimpleOuter), containsInAnyOrder(SimpleInner)); | 53 | assertThat(index.getInnerClasses(SimpleOuter), containsInAnyOrder(SimpleInner)); |
| 58 | assertThat(index.isAnonymousClass(SimpleInner), is(false)); | ||
| 59 | decompile(SimpleOuter); | 54 | decompile(SimpleOuter); |
| 60 | } | 55 | } |
| 61 | 56 | ||
| 62 | @Test | 57 | @Test |
| 63 | public void anonymous() { | ||
| 64 | assertThat(index.getOuterClass(AnonymousInner), is(AnonymousOuter)); | ||
| 65 | assertThat(index.getInnerClasses(AnonymousOuter), containsInAnyOrder(AnonymousInner)); | ||
| 66 | assertThat(index.isAnonymousClass(AnonymousInner), is(true)); | ||
| 67 | decompile(AnonymousOuter); | ||
| 68 | } | ||
| 69 | |||
| 70 | @Test | ||
| 71 | public void constructorArgs() { | 58 | public void constructorArgs() { |
| 72 | assertThat(index.getOuterClass(ConstructorArgsInner), is(ConstructorArgsOuter)); | 59 | assertThat(index.getOuterClass(ConstructorArgsInner), is(ConstructorArgsOuter)); |
| 73 | assertThat(index.getInnerClasses(ConstructorArgsOuter), containsInAnyOrder(ConstructorArgsInner)); | 60 | assertThat(index.getInnerClasses(ConstructorArgsOuter), containsInAnyOrder(ConstructorArgsInner)); |
| 74 | assertThat(index.isAnonymousClass(ConstructorArgsInner), is(false)); | ||
| 75 | decompile(ConstructorArgsOuter); | 61 | decompile(ConstructorArgsOuter); |
| 76 | } | 62 | } |
| 77 | 63 | ||
| 78 | @Test | 64 | @Test |
| 79 | public void anonymousWithScopeArgs() { | ||
| 80 | assertThat(index.getOuterClass(AnonymousWithScopeArgsInner), is(AnonymousWithScopeArgsOuter)); | ||
| 81 | assertThat(index.getInnerClasses(AnonymousWithScopeArgsOuter), containsInAnyOrder(AnonymousWithScopeArgsInner)); | ||
| 82 | assertThat(index.isAnonymousClass(AnonymousWithScopeArgsInner), is(true)); | ||
| 83 | decompile(AnonymousWithScopeArgsOuter); | ||
| 84 | } | ||
| 85 | |||
| 86 | @Test | ||
| 87 | public void anonymousWithOuterAccess() { | ||
| 88 | assertThat(index.getOuterClass(AnonymousWithOuterAccessInner), is(AnonymousWithOuterAccessOuter)); | ||
| 89 | assertThat(index.getInnerClasses(AnonymousWithOuterAccessOuter), containsInAnyOrder(AnonymousWithOuterAccessInner)); | ||
| 90 | assertThat(index.isAnonymousClass(AnonymousWithOuterAccessInner), is(true)); | ||
| 91 | decompile(AnonymousWithOuterAccessOuter); | ||
| 92 | } | ||
| 93 | |||
| 94 | @Test | ||
| 95 | public void classTree() { | 65 | public void classTree() { |
| 96 | 66 | ||
| 97 | // root level | 67 | // root level |
| @@ -101,8 +71,7 @@ public class TestInnerClasses { | |||
| 101 | 71 | ||
| 102 | // level 1 | 72 | // level 1 |
| 103 | ClassEntry fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | 73 | ClassEntry fullClassEntry = new ClassEntry(ClassTreeRoot.getName() |
| 104 | + "$" + ClassTreeLevel1.getInnermostClassName() | 74 | + "$" + ClassTreeLevel1.getInnermostClassName()); |
| 105 | ); | ||
| 106 | assertThat(index.containsObfClass(fullClassEntry), is(true)); | 75 | assertThat(index.containsObfClass(fullClassEntry), is(true)); |
| 107 | assertThat(index.getOuterClass(ClassTreeLevel1), is(ClassTreeRoot)); | 76 | assertThat(index.getOuterClass(ClassTreeLevel1), is(ClassTreeRoot)); |
| 108 | assertThat(index.getInnerClasses(ClassTreeLevel1), containsInAnyOrder(ClassTreeLevel2)); | 77 | assertThat(index.getInnerClasses(ClassTreeLevel1), containsInAnyOrder(ClassTreeLevel2)); |
| @@ -110,8 +79,7 @@ public class TestInnerClasses { | |||
| 110 | // level 2 | 79 | // level 2 |
| 111 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | 80 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() |
| 112 | + "$" + ClassTreeLevel1.getInnermostClassName() | 81 | + "$" + ClassTreeLevel1.getInnermostClassName() |
| 113 | + "$" + ClassTreeLevel2.getInnermostClassName() | 82 | + "$" + ClassTreeLevel2.getInnermostClassName()); |
| 114 | ); | ||
| 115 | assertThat(index.containsObfClass(fullClassEntry), is(true)); | 83 | assertThat(index.containsObfClass(fullClassEntry), is(true)); |
| 116 | assertThat(index.getOuterClass(ClassTreeLevel2), is(ClassTreeLevel1)); | 84 | assertThat(index.getOuterClass(ClassTreeLevel2), is(ClassTreeLevel1)); |
| 117 | assertThat(index.getInnerClasses(ClassTreeLevel2), containsInAnyOrder(ClassTreeLevel3)); | 85 | assertThat(index.getInnerClasses(ClassTreeLevel2), containsInAnyOrder(ClassTreeLevel3)); |
| @@ -120,8 +88,7 @@ public class TestInnerClasses { | |||
| 120 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | 88 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() |
| 121 | + "$" + ClassTreeLevel1.getInnermostClassName() | 89 | + "$" + ClassTreeLevel1.getInnermostClassName() |
| 122 | + "$" + ClassTreeLevel2.getInnermostClassName() | 90 | + "$" + ClassTreeLevel2.getInnermostClassName() |
| 123 | + "$" + ClassTreeLevel3.getInnermostClassName() | 91 | + "$" + ClassTreeLevel3.getInnermostClassName()); |
| 124 | ); | ||
| 125 | assertThat(index.containsObfClass(fullClassEntry), is(true)); | 92 | assertThat(index.containsObfClass(fullClassEntry), is(true)); |
| 126 | assertThat(index.getOuterClass(ClassTreeLevel3), is(ClassTreeLevel2)); | 93 | assertThat(index.getOuterClass(ClassTreeLevel3), is(ClassTreeLevel2)); |
| 127 | assertThat(index.getInnerClasses(ClassTreeLevel3), is(empty())); | 94 | assertThat(index.getInnerClasses(ClassTreeLevel3), is(empty())); |