summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/SourceProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/SourceProvider.java')
-rw-r--r--src/main/java/cuchaz/enigma/SourceProvider.java97
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 @@
1package cuchaz.enigma;
2
3import com.strobel.assembler.metadata.ITypeLoader;
4import com.strobel.assembler.metadata.MetadataSystem;
5import com.strobel.assembler.metadata.TypeDefinition;
6import com.strobel.assembler.metadata.TypeReference;
7import com.strobel.decompiler.DecompilerContext;
8import com.strobel.decompiler.DecompilerSettings;
9import com.strobel.decompiler.PlainTextOutput;
10import com.strobel.decompiler.languages.java.JavaOutputVisitor;
11import com.strobel.decompiler.languages.java.ast.AstBuilder;
12import com.strobel.decompiler.languages.java.ast.CompilationUnit;
13import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor;
14import com.strobel.decompiler.languages.java.ast.transforms.IAstTransform;
15import cuchaz.enigma.utils.Utils;
16import oml.ast.transformers.*;
17
18import java.io.StringWriter;
19import java.io.Writer;
20import java.util.Arrays;
21import java.util.List;
22
23public 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}