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/EnigmaProject.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/EnigmaProject.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/EnigmaProject.java | 39 |
1 files changed, 7 insertions, 32 deletions
diff --git a/src/main/java/cuchaz/enigma/EnigmaProject.java b/src/main/java/cuchaz/enigma/EnigmaProject.java index fddaccc..78b49b5 100644 --- a/src/main/java/cuchaz/enigma/EnigmaProject.java +++ b/src/main/java/cuchaz/enigma/EnigmaProject.java | |||
| @@ -1,16 +1,13 @@ | |||
| 1 | package cuchaz.enigma; | 1 | package cuchaz.enigma; |
| 2 | 2 | ||
| 3 | import com.google.common.base.Functions; | 3 | import com.google.common.base.Functions; |
| 4 | import com.strobel.assembler.metadata.ITypeLoader; | ||
| 5 | import com.strobel.assembler.metadata.MetadataSystem; | ||
| 6 | import com.strobel.decompiler.DecompilerSettings; | ||
| 7 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | ||
| 8 | import cuchaz.enigma.analysis.ClassCache; | 4 | import cuchaz.enigma.analysis.ClassCache; |
| 9 | import cuchaz.enigma.analysis.EntryReference; | 5 | import cuchaz.enigma.analysis.EntryReference; |
| 10 | import cuchaz.enigma.analysis.index.JarIndex; | 6 | import cuchaz.enigma.analysis.index.JarIndex; |
| 11 | import cuchaz.enigma.api.service.NameProposalService; | 7 | import cuchaz.enigma.api.service.NameProposalService; |
| 12 | import cuchaz.enigma.bytecode.translators.SourceFixVisitor; | 8 | import cuchaz.enigma.bytecode.translators.SourceFixVisitor; |
| 13 | import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; | 9 | import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; |
| 10 | import cuchaz.enigma.source.*; | ||
| 14 | import cuchaz.enigma.translation.Translator; | 11 | import cuchaz.enigma.translation.Translator; |
| 15 | import cuchaz.enigma.translation.mapping.*; | 12 | import cuchaz.enigma.translation.mapping.*; |
| 16 | import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree; | 13 | import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree; |
| @@ -25,10 +22,7 @@ import org.objectweb.asm.ClassWriter; | |||
| 25 | import org.objectweb.asm.Opcodes; | 22 | import org.objectweb.asm.Opcodes; |
| 26 | import org.objectweb.asm.tree.ClassNode; | 23 | import org.objectweb.asm.tree.ClassNode; |
| 27 | 24 | ||
| 28 | import java.io.BufferedWriter; | 25 | import java.io.*; |
| 29 | import java.io.IOException; | ||
| 30 | import java.io.PrintWriter; | ||
| 31 | import java.io.StringWriter; | ||
| 32 | import java.nio.file.Files; | 26 | import java.nio.file.Files; |
| 33 | import java.nio.file.Path; | 27 | import java.nio.file.Path; |
| 34 | import java.util.Collection; | 28 | import java.util.Collection; |
| @@ -200,7 +194,7 @@ public class EnigmaProject { | |||
| 200 | } | 194 | } |
| 201 | } | 195 | } |
| 202 | 196 | ||
| 203 | public SourceExport decompile(ProgressListener progress) { | 197 | public SourceExport decompile(ProgressListener progress, DecompilerService decompilerService) { |
| 204 | Collection<ClassNode> classes = this.compiled.values().stream() | 198 | Collection<ClassNode> classes = this.compiled.values().stream() |
| 205 | .filter(classNode -> classNode.name.indexOf('$') == -1) | 199 | .filter(classNode -> classNode.name.indexOf('$') == -1) |
| 206 | .collect(Collectors.toList()); | 200 | .collect(Collectors.toList()); |
| @@ -208,18 +202,7 @@ public class EnigmaProject { | |||
| 208 | progress.init(classes.size(), I18n.translate("progress.classes.decompiling")); | 202 | progress.init(classes.size(), I18n.translate("progress.classes.decompiling")); |
| 209 | 203 | ||
| 210 | //create a common instance outside the loop as mappings shouldn't be changing while this is happening | 204 | //create a common instance outside the loop as mappings shouldn't be changing while this is happening |
| 211 | CompiledSourceTypeLoader typeLoader = new CompiledSourceTypeLoader(this.compiled::get); | 205 | Decompiler decompiler = decompilerService.create(compiled::get, new SourceSettings(false, false)); |
| 212 | |||
| 213 | //synchronized to make sure the parallelStream doesn't CME with the cache | ||
| 214 | ITypeLoader synchronizedTypeLoader = new SynchronizedTypeLoader(typeLoader); | ||
| 215 | |||
| 216 | MetadataSystem metadataSystem = new NoRetryMetadataSystem(synchronizedTypeLoader); | ||
| 217 | |||
| 218 | //ensures methods are loaded on classload and prevents race conditions | ||
| 219 | metadataSystem.setEagerMethodLoadingEnabled(true); | ||
| 220 | |||
| 221 | DecompilerSettings settings = SourceProvider.createSettings(); | ||
| 222 | SourceProvider sourceProvider = new SourceProvider(settings, synchronizedTypeLoader, metadataSystem); | ||
| 223 | 206 | ||
| 224 | AtomicInteger count = new AtomicInteger(); | 207 | AtomicInteger count = new AtomicInteger(); |
| 225 | 208 | ||
| @@ -227,7 +210,7 @@ public class EnigmaProject { | |||
| 227 | .map(translatedNode -> { | 210 | .map(translatedNode -> { |
| 228 | progress.step(count.getAndIncrement(), translatedNode.name); | 211 | progress.step(count.getAndIncrement(), translatedNode.name); |
| 229 | 212 | ||
| 230 | String source = decompileClass(translatedNode, sourceProvider); | 213 | String source = decompileClass(translatedNode, decompiler); |
| 231 | return new ClassSource(translatedNode.name, source); | 214 | return new ClassSource(translatedNode.name, source); |
| 232 | }) | 215 | }) |
| 233 | .collect(Collectors.toList()); | 216 | .collect(Collectors.toList()); |
| @@ -235,16 +218,8 @@ public class EnigmaProject { | |||
| 235 | return new SourceExport(decompiled); | 218 | return new SourceExport(decompiled); |
| 236 | } | 219 | } |
| 237 | 220 | ||
| 238 | private String decompileClass(ClassNode translatedNode, SourceProvider sourceProvider) { | 221 | private String decompileClass(ClassNode translatedNode, Decompiler decompiler) { |
| 239 | StringWriter writer = new StringWriter(); | 222 | return decompiler.getSource(translatedNode.name).asString(); |
| 240 | try { | ||
| 241 | CompilationUnit sourceTree = sourceProvider.getSources(translatedNode.name); | ||
| 242 | sourceProvider.writeSource(writer, sourceTree); | ||
| 243 | } catch (Throwable t) { | ||
| 244 | t.printStackTrace(); | ||
| 245 | t.printStackTrace(new PrintWriter(writer)); | ||
| 246 | } | ||
| 247 | return writer.toString(); | ||
| 248 | } | 223 | } |
| 249 | } | 224 | } |
| 250 | 225 | ||