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.java119
1 files changed, 0 insertions, 119 deletions
diff --git a/src/main/java/cuchaz/enigma/SourceProvider.java b/src/main/java/cuchaz/enigma/SourceProvider.java
deleted file mode 100644
index d3d3003..0000000
--- a/src/main/java/cuchaz/enigma/SourceProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
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.BraceStyle;
11import com.strobel.decompiler.languages.java.JavaFormattingOptions;
12import com.strobel.decompiler.languages.java.JavaOutputVisitor;
13import com.strobel.decompiler.languages.java.ast.AstBuilder;
14import com.strobel.decompiler.languages.java.ast.CompilationUnit;
15import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor;
16import com.strobel.decompiler.languages.java.ast.transforms.IAstTransform;
17import cuchaz.enigma.utils.Utils;
18import oml.ast.transformers.*;
19
20import java.io.StringWriter;
21import java.io.Writer;
22import java.lang.ref.WeakReference;
23import java.util.Arrays;
24import java.util.List;
25import java.util.Objects;
26
27public class SourceProvider {
28 private final DecompilerSettings settings;
29
30 private final ITypeLoader typeLoader;
31 private final MetadataSystem metadataSystem;
32
33 private String lastLookUpName;
34 private WeakReference<CompilationUnit> lastDecompiled;
35
36 public SourceProvider(DecompilerSettings settings, ITypeLoader typeLoader, MetadataSystem metadataSystem) {
37 this.settings = settings;
38 this.typeLoader = typeLoader;
39 this.metadataSystem = metadataSystem;
40 }
41
42 public SourceProvider(DecompilerSettings settings, ITypeLoader typeLoader) {
43 this(settings, typeLoader, new NoRetryMetadataSystem(typeLoader));
44 }
45
46 public static DecompilerSettings createSettings() {
47 DecompilerSettings settings = DecompilerSettings.javaDefaults();
48 settings.setMergeVariables(Utils.getSystemPropertyAsBoolean("enigma.mergeVariables", true));
49 settings.setForceExplicitImports(Utils.getSystemPropertyAsBoolean("enigma.forceExplicitImports", true));
50 settings.setForceExplicitTypeArguments(Utils.getSystemPropertyAsBoolean("enigma.forceExplicitTypeArguments", true));
51 settings.setShowDebugLineNumbers(Utils.getSystemPropertyAsBoolean("enigma.showDebugLineNumbers", false));
52 settings.setShowSyntheticMembers(Utils.getSystemPropertyAsBoolean("enigma.showSyntheticMembers", false));
53
54 JavaFormattingOptions formattingOptions = settings.getJavaFormattingOptions();
55 formattingOptions.ClassBraceStyle = BraceStyle.EndOfLine;
56 formattingOptions.InterfaceBraceStyle = BraceStyle.EndOfLine;
57 formattingOptions.EnumBraceStyle = BraceStyle.EndOfLine;
58
59 return settings;
60 }
61
62 public CompilationUnit getSources(String name) {
63 // Optimization for javadoc-caused decompilations
64 if (Objects.equals(lastLookUpName, name)) {
65 CompilationUnit last = lastDecompiled.get();
66 if (last != null)
67 return last;
68 }
69
70 TypeReference type = metadataSystem.lookupType(name);
71 if (type == null) {
72 throw new Error(String.format("Unable to find desc: %s", name));
73 }
74
75 TypeDefinition resolvedType = type.resolve();
76
77 settings.setTypeLoader(typeLoader);
78
79 // decompile it!
80 DecompilerContext context = new DecompilerContext();
81 context.setCurrentType(resolvedType);
82 context.setSettings(settings);
83
84 AstBuilder builder = new AstBuilder(context);
85 builder.addType(resolvedType);
86 builder.runTransformations(null);
87 runCustomTransforms(builder, context);
88
89 CompilationUnit ret = builder.getCompilationUnit();
90 lastLookUpName = name;
91 lastDecompiled = new WeakReference<>(ret);
92 return ret;
93 }
94
95 public void writeSource(Writer writer, CompilationUnit sourceTree) {
96 // render the AST into source
97 sourceTree.acceptVisitor(new InsertParenthesesVisitor(), null);
98 sourceTree.acceptVisitor(new JavaOutputVisitor(new PlainTextOutput(writer), settings), null);
99 }
100
101 public String writeSourceToString(CompilationUnit sourceTree) {
102 StringWriter writer = new StringWriter();
103 writeSource(writer, sourceTree);
104 return writer.toString();
105 }
106
107 private static void runCustomTransforms(AstBuilder builder, DecompilerContext context) {
108 List<IAstTransform> transformers = Arrays.asList(
109 new ObfuscatedEnumSwitchRewriterTransform(context),
110 new VarargsFixer(context),
111 new RemoveObjectCasts(context),
112 new Java8Generics(),
113 new InvalidIdentifierFix()
114 );
115 for (IAstTransform transform : transformers) {
116 transform.run(builder.getCompilationUnit());
117 }
118 }
119}