diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/DecompiledClassSource.java | 52 |
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 @@ | |||
| 1 | package cuchaz.enigma.gui; | 1 | package cuchaz.enigma.gui; |
| 2 | 2 | ||
| 3 | import cuchaz.enigma.Deobfuscator; | 3 | import cuchaz.enigma.EnigmaProject; |
| 4 | import cuchaz.enigma.EnigmaServices; | ||
| 4 | import cuchaz.enigma.analysis.EntryReference; | 5 | import cuchaz.enigma.analysis.EntryReference; |
| 5 | import cuchaz.enigma.analysis.SourceIndex; | 6 | import cuchaz.enigma.analysis.SourceIndex; |
| 6 | import cuchaz.enigma.analysis.Token; | 7 | import cuchaz.enigma.analysis.Token; |
| 7 | import cuchaz.enigma.api.EnigmaPlugin; | 8 | import cuchaz.enigma.api.service.NameProposalService; |
| 8 | import cuchaz.enigma.gui.highlight.TokenHighlightType; | 9 | import cuchaz.enigma.gui.highlight.TokenHighlightType; |
| 9 | import cuchaz.enigma.translation.LocalNameGenerator; | 10 | import cuchaz.enigma.translation.LocalNameGenerator; |
| 10 | import cuchaz.enigma.translation.Translator; | 11 | import cuchaz.enigma.translation.Translator; |
| 12 | import cuchaz.enigma.translation.mapping.EntryRemapper; | ||
| 13 | import cuchaz.enigma.translation.mapping.EntryResolver; | ||
| 14 | import cuchaz.enigma.translation.mapping.ResolutionStrategy; | ||
| 11 | import cuchaz.enigma.translation.representation.TypeDescriptor; | 15 | import cuchaz.enigma.translation.representation.TypeDescriptor; |
| 12 | import cuchaz.enigma.translation.representation.entry.ClassEntry; | 16 | import cuchaz.enigma.translation.representation.entry.ClassEntry; |
| 13 | import cuchaz.enigma.translation.representation.entry.Entry; | 17 | import cuchaz.enigma.translation.representation.entry.Entry; |
| 14 | import cuchaz.enigma.translation.representation.entry.FieldEntry; | ||
| 15 | import cuchaz.enigma.translation.representation.entry.LocalVariableDefEntry; | 18 | import cuchaz.enigma.translation.representation.entry.LocalVariableDefEntry; |
| 16 | 19 | ||
| 17 | import javax.annotation.Nullable; | 20 | import javax.annotation.Nullable; |
| 18 | import java.util.*; | 21 | import java.util.*; |
| 22 | import java.util.stream.Stream; | ||
| 19 | 23 | ||
| 20 | public class DecompiledClassSource { | 24 | public 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 |