summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Runemoro2019-08-26 00:55:44 -0400
committerGravatar Gegy2019-08-26 06:55:44 +0200
commitc31b70da2f88c41936a3fd7d69f445ef1db6548d (patch)
tree3c8d419f8d895a8345464c43c0dac315764e8a30 /src/main
parentPut class opening brace on same line (#160) (diff)
downloadenigma-c31b70da2f88c41936a3fd7d69f445ef1db6548d.tar.gz
enigma-c31b70da2f88c41936a3fd7d69f445ef1db6548d.tar.xz
enigma-c31b70da2f88c41936a3fd7d69f445ef1db6548d.zip
Use name proposal service when exporting deobfuscated jar or decompiled sources (#159)
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/cuchaz/enigma/EnigmaProject.java26
-rw-r--r--src/main/java/cuchaz/enigma/ProposingTranslator.java43
2 files changed, 61 insertions, 8 deletions
diff --git a/src/main/java/cuchaz/enigma/EnigmaProject.java b/src/main/java/cuchaz/enigma/EnigmaProject.java
index bb2f7faa..a589c638 100644
--- a/src/main/java/cuchaz/enigma/EnigmaProject.java
+++ b/src/main/java/cuchaz/enigma/EnigmaProject.java
@@ -8,12 +8,11 @@ import com.strobel.decompiler.languages.java.ast.CompilationUnit;
8import cuchaz.enigma.analysis.ClassCache; 8import cuchaz.enigma.analysis.ClassCache;
9import cuchaz.enigma.analysis.EntryReference; 9import cuchaz.enigma.analysis.EntryReference;
10import cuchaz.enigma.analysis.index.JarIndex; 10import cuchaz.enigma.analysis.index.JarIndex;
11import cuchaz.enigma.api.service.NameProposalService;
11import cuchaz.enigma.bytecode.translators.SourceFixVisitor; 12import cuchaz.enigma.bytecode.translators.SourceFixVisitor;
12import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; 13import cuchaz.enigma.bytecode.translators.TranslationClassVisitor;
13import cuchaz.enigma.translation.Translator; 14import cuchaz.enigma.translation.Translator;
14import cuchaz.enigma.translation.mapping.EntryMapping; 15import cuchaz.enigma.translation.mapping.*;
15import cuchaz.enigma.translation.mapping.EntryRemapper;
16import cuchaz.enigma.translation.mapping.MappingsChecker;
17import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree; 16import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree;
18import cuchaz.enigma.translation.mapping.tree.EntryTree; 17import cuchaz.enigma.translation.mapping.tree.EntryTree;
19import cuchaz.enigma.translation.representation.entry.ClassEntry; 18import cuchaz.enigma.translation.representation.entry.ClassEntry;
@@ -26,16 +25,19 @@ import org.objectweb.asm.tree.ClassNode;
26 25
27import java.io.BufferedWriter; 26import java.io.BufferedWriter;
28import java.io.IOException; 27import java.io.IOException;
28import java.io.PrintWriter;
29import java.io.StringWriter; 29import java.io.StringWriter;
30import java.nio.file.Files; 30import java.nio.file.Files;
31import java.nio.file.Path; 31import java.nio.file.Path;
32import java.util.Collection; 32import java.util.Collection;
33import java.util.Map; 33import java.util.Map;
34import java.util.Objects; 34import java.util.Objects;
35import java.util.Optional;
35import java.util.concurrent.atomic.AtomicInteger; 36import java.util.concurrent.atomic.AtomicInteger;
36import java.util.jar.JarEntry; 37import java.util.jar.JarEntry;
37import java.util.jar.JarOutputStream; 38import java.util.jar.JarOutputStream;
38import java.util.stream.Collectors; 39import java.util.stream.Collectors;
40import java.util.stream.Stream;
39 41
40public class EnigmaProject { 42public class EnigmaProject {
41 private final Enigma enigma; 43 private final Enigma enigma;
@@ -141,7 +143,12 @@ public class EnigmaProject {
141 143
142 public JarExport exportRemappedJar(ProgressListener progress) { 144 public JarExport exportRemappedJar(ProgressListener progress) {
143 Collection<ClassEntry> classEntries = jarIndex.getEntryIndex().getClasses(); 145 Collection<ClassEntry> classEntries = jarIndex.getEntryIndex().getClasses();
144 Translator deobfuscator = mapper.getDeobfuscator(); 146
147 Translator deobfuscator = getEnigma()
148 .getServices()
149 .get(NameProposalService.TYPE)
150 .map(nameProposalService -> (Translator) new ProposingTranslator(mapper, nameProposalService))
151 .orElse(mapper.getDeobfuscator());
145 152
146 AtomicInteger count = new AtomicInteger(); 153 AtomicInteger count = new AtomicInteger();
147 progress.init(classEntries.size(), "Deobfuscating classes..."); 154 progress.init(classEntries.size(), "Deobfuscating classes...");
@@ -233,11 +240,14 @@ public class EnigmaProject {
233 } 240 }
234 241
235 private String decompileClass(ClassNode translatedNode, SourceProvider sourceProvider) { 242 private String decompileClass(ClassNode translatedNode, SourceProvider sourceProvider) {
236 CompilationUnit sourceTree = sourceProvider.getSources(translatedNode.name);
237
238 StringWriter writer = new StringWriter(); 243 StringWriter writer = new StringWriter();
239 sourceProvider.writeSource(writer, sourceTree); 244 try {
240 245 CompilationUnit sourceTree = sourceProvider.getSources(translatedNode.name);
246 sourceProvider.writeSource(writer, sourceTree);
247 } catch (Throwable t) {
248 t.printStackTrace();
249 t.printStackTrace(new PrintWriter(writer));
250 }
241 return writer.toString(); 251 return writer.toString();
242 } 252 }
243 } 253 }
diff --git a/src/main/java/cuchaz/enigma/ProposingTranslator.java b/src/main/java/cuchaz/enigma/ProposingTranslator.java
new file mode 100644
index 00000000..0807880e
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/ProposingTranslator.java
@@ -0,0 +1,43 @@
1package cuchaz.enigma;
2
3import cuchaz.enigma.api.service.NameProposalService;
4import cuchaz.enigma.translation.Translatable;
5import cuchaz.enigma.translation.Translator;
6import cuchaz.enigma.translation.mapping.*;
7import cuchaz.enigma.translation.representation.entry.Entry;
8
9import java.util.Optional;
10
11public class ProposingTranslator implements Translator {
12 private final EntryRemapper mapper;
13 private final NameProposalService nameProposalService;
14
15 public ProposingTranslator(EntryRemapper mapper, NameProposalService nameProposalService) {
16 this.mapper = mapper;
17 this.nameProposalService = nameProposalService;
18 }
19
20 @Override
21 @SuppressWarnings("unchecked")
22 public <T extends Translatable> T translate(T translatable) {
23 if (translatable == null) {
24 return null;
25 }
26
27 T deobfuscated = mapper.deobfuscate(translatable);
28
29 if (translatable instanceof Entry && ((Entry) deobfuscated).getName().equals(((Entry<?>) translatable).getName())) {
30 return mapper.getObfResolver()
31 .resolveEntry((Entry<?>) translatable, ResolutionStrategy.RESOLVE_ROOT)
32 .stream()
33 .map(e1 -> nameProposalService.proposeName(e1, mapper))
34 .filter(Optional::isPresent)
35 .map(Optional::get)
36 .findFirst()
37 .map(newName -> (T) ((Entry) deobfuscated).withName(newName))
38 .orElse(deobfuscated);
39 }
40
41 return deobfuscated;
42 }
43}