diff options
| author | 2020-03-09 06:04:08 -0400 | |
|---|---|---|
| committer | 2020-03-09 10:04:08 +0000 | |
| commit | 58c0aeb15a65324de08a914dfa62cc68a516a4e3 (patch) | |
| tree | f45e8141c0864692051149a478c5a0a6bbe68686 /src/main/java/cuchaz/enigma/SourceProvider.java | |
| parent | Made Enigma gui translatable (#193) (diff) | |
| download | enigma-fork-58c0aeb15a65324de08a914dfa62cc68a516a4e3.tar.gz enigma-fork-58c0aeb15a65324de08a914dfa62cc68a516a4e3.tar.xz enigma-fork-58c0aeb15a65324de08a914dfa62cc68a516a4e3.zip | |
CFR support (#192)
* Add decompiler API
* Add CFR support
Diffstat (limited to 'src/main/java/cuchaz/enigma/SourceProvider.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/SourceProvider.java | 119 |
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 @@ | |||
| 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.BraceStyle; | ||
| 11 | import com.strobel.decompiler.languages.java.JavaFormattingOptions; | ||
| 12 | import com.strobel.decompiler.languages.java.JavaOutputVisitor; | ||
| 13 | import com.strobel.decompiler.languages.java.ast.AstBuilder; | ||
| 14 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | ||
| 15 | import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; | ||
| 16 | import com.strobel.decompiler.languages.java.ast.transforms.IAstTransform; | ||
| 17 | import cuchaz.enigma.utils.Utils; | ||
| 18 | import oml.ast.transformers.*; | ||
| 19 | |||
| 20 | import java.io.StringWriter; | ||
| 21 | import java.io.Writer; | ||
| 22 | import java.lang.ref.WeakReference; | ||
| 23 | import java.util.Arrays; | ||
| 24 | import java.util.List; | ||
| 25 | import java.util.Objects; | ||
| 26 | |||
| 27 | public 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 | } | ||