diff options
| author | 2019-01-30 21:05:32 +0200 | |
|---|---|---|
| committer | 2019-01-30 21:05:32 +0200 | |
| commit | ba7a354efae7d49833c887cf147ac940c975a1fa (patch) | |
| tree | 02e14fda81dd5984e24f2df392c57c6e829fc875 /src/main/java/cuchaz/enigma/SourceProvider.java | |
| parent | Rewrite the Jenkinsfile to use the new declarative pipeline syntax, lets hope... (diff) | |
| download | enigma-fork-ba7a354efae7d49833c887cf147ac940c975a1fa.tar.gz enigma-fork-ba7a354efae7d49833c887cf147ac940c975a1fa.tar.xz enigma-fork-ba7a354efae7d49833c887cf147ac940c975a1fa.zip | |
Remap sources (#106)
* Source remapping beginnings
* Fix navigation to remapped classes
* Translate identifier info reference
* Remap local variables with default names in source
* Caching translator
* Fix lack of highlighting for first opened class
* Fix unicode variable names
* Unicode checker shouldn't be checking just alphanumeric
* Fix package tree being built from obf names
* Don't index `this` as method call for method::reference
* Apply proposed names
* Fix source export issues
* Replace unicode var names at bytecode level uniquely
* Drop imports from editor source
* Class selector fixes
* Delta keep track of base mappings to enable lookup of old names
* Optimize source remapping by remapping source with a StringBuffer instead of copying
* Bump version
Diffstat (limited to 'src/main/java/cuchaz/enigma/SourceProvider.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/SourceProvider.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/SourceProvider.java b/src/main/java/cuchaz/enigma/SourceProvider.java new file mode 100644 index 0000000..48e5a59 --- /dev/null +++ b/src/main/java/cuchaz/enigma/SourceProvider.java | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | package cuchaz.enigma; | ||
| 2 | |||
| 3 | import com.strobel.assembler.metadata.ITypeLoader; | ||
| 4 | import com.strobel.assembler.metadata.MetadataSystem; | ||
| 5 | import com.strobel.assembler.metadata.TypeDefinition; | ||
| 6 | import com.strobel.assembler.metadata.TypeReference; | ||
| 7 | import com.strobel.decompiler.DecompilerContext; | ||
| 8 | import com.strobel.decompiler.DecompilerSettings; | ||
| 9 | import com.strobel.decompiler.PlainTextOutput; | ||
| 10 | import com.strobel.decompiler.languages.java.JavaOutputVisitor; | ||
| 11 | import com.strobel.decompiler.languages.java.ast.AstBuilder; | ||
| 12 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | ||
| 13 | import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; | ||
| 14 | import com.strobel.decompiler.languages.java.ast.transforms.IAstTransform; | ||
| 15 | import cuchaz.enigma.utils.Utils; | ||
| 16 | import oml.ast.transformers.*; | ||
| 17 | |||
| 18 | import java.io.StringWriter; | ||
| 19 | import java.io.Writer; | ||
| 20 | import java.util.Arrays; | ||
| 21 | import java.util.List; | ||
| 22 | |||
| 23 | public class SourceProvider { | ||
| 24 | private final DecompilerSettings settings; | ||
| 25 | |||
| 26 | private final ITypeLoader typeLoader; | ||
| 27 | private final MetadataSystem metadataSystem; | ||
| 28 | |||
| 29 | public SourceProvider(DecompilerSettings settings, ITypeLoader typeLoader, MetadataSystem metadataSystem) { | ||
| 30 | this.settings = settings; | ||
| 31 | this.typeLoader = typeLoader; | ||
| 32 | this.metadataSystem = metadataSystem; | ||
| 33 | } | ||
| 34 | |||
| 35 | public SourceProvider(DecompilerSettings settings, ITypeLoader typeLoader) { | ||
| 36 | this(settings, typeLoader, new Deobfuscator.NoRetryMetadataSystem(typeLoader)); | ||
| 37 | } | ||
| 38 | |||
| 39 | public static DecompilerSettings createSettings() { | ||
| 40 | DecompilerSettings settings = DecompilerSettings.javaDefaults(); | ||
| 41 | settings.setMergeVariables(Utils.getSystemPropertyAsBoolean("enigma.mergeVariables", true)); | ||
| 42 | settings.setForceExplicitImports(Utils.getSystemPropertyAsBoolean("enigma.forceExplicitImports", true)); | ||
| 43 | settings.setForceExplicitTypeArguments(Utils.getSystemPropertyAsBoolean("enigma.forceExplicitTypeArguments", true)); | ||
| 44 | settings.setShowDebugLineNumbers(Utils.getSystemPropertyAsBoolean("enigma.showDebugLineNumbers", false)); | ||
| 45 | settings.setShowSyntheticMembers(Utils.getSystemPropertyAsBoolean("enigma.showSyntheticMembers", false)); | ||
| 46 | |||
| 47 | return settings; | ||
| 48 | } | ||
| 49 | |||
| 50 | public CompilationUnit getSources(String name) { | ||
| 51 | TypeReference type = metadataSystem.lookupType(name); | ||
| 52 | if (type == null) { | ||
| 53 | throw new Error(String.format("Unable to find desc: %s", name)); | ||
| 54 | } | ||
| 55 | |||
| 56 | TypeDefinition resolvedType = type.resolve(); | ||
| 57 | |||
| 58 | settings.setTypeLoader(typeLoader); | ||
| 59 | |||
| 60 | // decompile it! | ||
| 61 | DecompilerContext context = new DecompilerContext(); | ||
| 62 | context.setCurrentType(resolvedType); | ||
| 63 | context.setSettings(settings); | ||
| 64 | |||
| 65 | AstBuilder builder = new AstBuilder(context); | ||
| 66 | builder.addType(resolvedType); | ||
| 67 | builder.runTransformations(null); | ||
| 68 | runCustomTransforms(builder, context); | ||
| 69 | |||
| 70 | return builder.getCompilationUnit(); | ||
| 71 | } | ||
| 72 | |||
| 73 | public void writeSource(Writer writer, CompilationUnit sourceTree) { | ||
| 74 | // render the AST into source | ||
| 75 | sourceTree.acceptVisitor(new InsertParenthesesVisitor(), null); | ||
| 76 | sourceTree.acceptVisitor(new JavaOutputVisitor(new PlainTextOutput(writer), settings), null); | ||
| 77 | } | ||
| 78 | |||
| 79 | public String writeSourceToString(CompilationUnit sourceTree) { | ||
| 80 | StringWriter writer = new StringWriter(); | ||
| 81 | writeSource(writer, sourceTree); | ||
| 82 | return writer.toString(); | ||
| 83 | } | ||
| 84 | |||
| 85 | private static void runCustomTransforms(AstBuilder builder, DecompilerContext context) { | ||
| 86 | List<IAstTransform> transformers = Arrays.asList( | ||
| 87 | new ObfuscatedEnumSwitchRewriterTransform(context), | ||
| 88 | new VarargsFixer(context), | ||
| 89 | new RemoveObjectCasts(context), | ||
| 90 | new Java8Generics(), | ||
| 91 | new InvalidIdentifierFix() | ||
| 92 | ); | ||
| 93 | for (IAstTransform transform : transformers) { | ||
| 94 | transform.run(builder.getCompilationUnit()); | ||
| 95 | } | ||
| 96 | } | ||
| 97 | } | ||