summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/EnigmaProject.java
diff options
context:
space:
mode:
authorGravatar Runemoro2020-03-09 06:04:08 -0400
committerGravatar GitHub2020-03-09 10:04:08 +0000
commit58c0aeb15a65324de08a914dfa62cc68a516a4e3 (patch)
treef45e8141c0864692051149a478c5a0a6bbe68686 /src/main/java/cuchaz/enigma/EnigmaProject.java
parentMade Enigma gui translatable (#193) (diff)
downloadenigma-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.java39
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 @@
1package cuchaz.enigma; 1package cuchaz.enigma;
2 2
3import com.google.common.base.Functions; 3import com.google.common.base.Functions;
4import com.strobel.assembler.metadata.ITypeLoader;
5import com.strobel.assembler.metadata.MetadataSystem;
6import com.strobel.decompiler.DecompilerSettings;
7import com.strobel.decompiler.languages.java.ast.CompilationUnit;
8import cuchaz.enigma.analysis.ClassCache; 4import cuchaz.enigma.analysis.ClassCache;
9import cuchaz.enigma.analysis.EntryReference; 5import cuchaz.enigma.analysis.EntryReference;
10import cuchaz.enigma.analysis.index.JarIndex; 6import cuchaz.enigma.analysis.index.JarIndex;
11import cuchaz.enigma.api.service.NameProposalService; 7import cuchaz.enigma.api.service.NameProposalService;
12import cuchaz.enigma.bytecode.translators.SourceFixVisitor; 8import cuchaz.enigma.bytecode.translators.SourceFixVisitor;
13import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; 9import cuchaz.enigma.bytecode.translators.TranslationClassVisitor;
10import cuchaz.enigma.source.*;
14import cuchaz.enigma.translation.Translator; 11import cuchaz.enigma.translation.Translator;
15import cuchaz.enigma.translation.mapping.*; 12import cuchaz.enigma.translation.mapping.*;
16import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree; 13import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree;
@@ -25,10 +22,7 @@ import org.objectweb.asm.ClassWriter;
25import org.objectweb.asm.Opcodes; 22import org.objectweb.asm.Opcodes;
26import org.objectweb.asm.tree.ClassNode; 23import org.objectweb.asm.tree.ClassNode;
27 24
28import java.io.BufferedWriter; 25import java.io.*;
29import java.io.IOException;
30import java.io.PrintWriter;
31import java.io.StringWriter;
32import java.nio.file.Files; 26import java.nio.file.Files;
33import java.nio.file.Path; 27import java.nio.file.Path;
34import java.util.Collection; 28import 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