summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/ProposingTranslator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/ProposingTranslator.java')
-rw-r--r--src/main/java/cuchaz/enigma/ProposingTranslator.java43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/ProposingTranslator.java b/src/main/java/cuchaz/enigma/ProposingTranslator.java
new file mode 100644
index 0000000..0807880
--- /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}