summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java')
-rw-r--r--src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java
index 93643ab..44f70f8 100644
--- a/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java
+++ b/src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java
@@ -1,21 +1,25 @@
1package cuchaz.enigma.gui; 1package cuchaz.enigma.gui;
2 2
3import cuchaz.enigma.Deobfuscator; 3import cuchaz.enigma.EnigmaProject;
4import cuchaz.enigma.EnigmaServices;
4import cuchaz.enigma.analysis.EntryReference; 5import cuchaz.enigma.analysis.EntryReference;
5import cuchaz.enigma.analysis.SourceIndex; 6import cuchaz.enigma.analysis.SourceIndex;
6import cuchaz.enigma.analysis.Token; 7import cuchaz.enigma.analysis.Token;
7import cuchaz.enigma.api.EnigmaPlugin; 8import cuchaz.enigma.api.service.NameProposalService;
8import cuchaz.enigma.gui.highlight.TokenHighlightType; 9import cuchaz.enigma.gui.highlight.TokenHighlightType;
9import cuchaz.enigma.translation.LocalNameGenerator; 10import cuchaz.enigma.translation.LocalNameGenerator;
10import cuchaz.enigma.translation.Translator; 11import cuchaz.enigma.translation.Translator;
12import cuchaz.enigma.translation.mapping.EntryRemapper;
13import cuchaz.enigma.translation.mapping.EntryResolver;
14import cuchaz.enigma.translation.mapping.ResolutionStrategy;
11import cuchaz.enigma.translation.representation.TypeDescriptor; 15import cuchaz.enigma.translation.representation.TypeDescriptor;
12import cuchaz.enigma.translation.representation.entry.ClassEntry; 16import cuchaz.enigma.translation.representation.entry.ClassEntry;
13import cuchaz.enigma.translation.representation.entry.Entry; 17import cuchaz.enigma.translation.representation.entry.Entry;
14import cuchaz.enigma.translation.representation.entry.FieldEntry;
15import cuchaz.enigma.translation.representation.entry.LocalVariableDefEntry; 18import cuchaz.enigma.translation.representation.entry.LocalVariableDefEntry;
16 19
17import javax.annotation.Nullable; 20import javax.annotation.Nullable;
18import java.util.*; 21import java.util.*;
22import java.util.stream.Stream;
19 23
20public class DecompiledClassSource { 24public class DecompiledClassSource {
21 private final ClassEntry classEntry; 25 private final ClassEntry classEntry;
@@ -35,30 +39,30 @@ public class DecompiledClassSource {
35 return new DecompiledClassSource(classEntry, new SourceIndex(text)); 39 return new DecompiledClassSource(classEntry, new SourceIndex(text));
36 } 40 }
37 41
38 public void remapSource(Deobfuscator deobfuscator, Translator translator) { 42 public void remapSource(EnigmaProject project, Translator translator) {
39 highlightedTokens.clear(); 43 highlightedTokens.clear();
40 44
41 SourceRemapper remapper = new SourceRemapper(obfuscatedIndex.getSource(), obfuscatedIndex.referenceTokens()); 45 SourceRemapper remapper = new SourceRemapper(obfuscatedIndex.getSource(), obfuscatedIndex.referenceTokens());
42 46
43 SourceRemapper.Result remapResult = remapper.remap((token, movedToken) -> remapToken(deobfuscator, token, movedToken, translator)); 47 SourceRemapper.Result remapResult = remapper.remap((token, movedToken) -> remapToken(project, token, movedToken, translator));
44 remappedIndex = obfuscatedIndex.remapTo(remapResult); 48 remappedIndex = obfuscatedIndex.remapTo(remapResult);
45 } 49 }
46 50
47 private String remapToken(Deobfuscator deobfuscator, Token token, Token movedToken, Translator translator) { 51 private String remapToken(EnigmaProject project, Token token, Token movedToken, Translator translator) {
48 EntryReference<Entry<?>, Entry<?>> reference = obfuscatedIndex.getReference(token); 52 EntryReference<Entry<?>, Entry<?>> reference = obfuscatedIndex.getReference(token);
49 53
50 Entry<?> entry = reference.getNameableEntry(); 54 Entry<?> entry = reference.getNameableEntry();
51 Entry<?> translatedEntry = translator.translate(entry); 55 Entry<?> translatedEntry = translator.translate(entry);
52 56
53 if (deobfuscator.isRenamable(reference)) { 57 if (project.isRenamable(reference)) {
54 if (isDeobfuscated(entry, translatedEntry)) { 58 if (isDeobfuscated(entry, translatedEntry)) {
55 highlightToken(movedToken, TokenHighlightType.DEOBFUSCATED); 59 highlightToken(movedToken, TokenHighlightType.DEOBFUSCATED);
56 return translatedEntry.getSourceRemapName(); 60 return translatedEntry.getSourceRemapName();
57 } else { 61 } else {
58 String proposedName = proposeName(deobfuscator, entry); 62 Optional<String> proposedName = proposeName(project, entry);
59 if (proposedName != null) { 63 if (proposedName.isPresent()) {
60 highlightToken(movedToken, TokenHighlightType.PROPOSED); 64 highlightToken(movedToken, TokenHighlightType.PROPOSED);
61 return proposedName; 65 return proposedName.get();
62 } 66 }
63 67
64 highlightToken(movedToken, TokenHighlightType.OBFUSCATED); 68 highlightToken(movedToken, TokenHighlightType.OBFUSCATED);
@@ -73,18 +77,22 @@ public class DecompiledClassSource {
73 return null; 77 return null;
74 } 78 }
75 79
76 @Nullable 80 private Optional<String> proposeName(EnigmaProject project, Entry<?> entry) {
77 private String proposeName(Deobfuscator deobfuscator, Entry<?> entry) { 81 EnigmaServices services = project.getEnigma().getServices();
78 if (entry instanceof FieldEntry) { 82
79 for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { 83 return services.get(NameProposalService.TYPE).flatMap(nameProposalService -> {
80 String owner = entry.getContainingClass().getFullName(); 84 EntryResolver resolver = project.getMapper().getObfResolver();
81 String proposal = plugin.proposeFieldName(owner, entry.getName(), ((FieldEntry) entry).getDesc().toString()); 85
82 if (proposal != null) { 86 Collection<Entry<?>> resolved = resolver.resolveEntry(entry, ResolutionStrategy.RESOLVE_ROOT);
83 return proposal; 87 EntryRemapper mapper = project.getMapper();
84 } 88
85 } 89 Stream<String> proposals = resolved.stream()
86 } 90 .map(e -> nameProposalService.proposeName(e, mapper))
87 return null; 91 .filter(Optional::isPresent)
92 .map(Optional::get);
93
94 return proposals.findFirst();
95 });
88 } 96 }
89 97
90 @Nullable 98 @Nullable