From 4bc3afe4ff08b9f0c08952ec7f6e0ac930280cc5 Mon Sep 17 00:00:00 2001 From: asie Date: Sat, 8 Dec 2018 11:21:18 +0100 Subject: add barebones plugin framework, cleanup --- src/main/java/cuchaz/enigma/CommandMain.java | 20 ----- src/main/java/cuchaz/enigma/Deobfuscator.java | 63 +++++++--------- .../cuchaz/enigma/analysis/EntryReference.java | 2 +- .../cuchaz/enigma/analysis/IndexClassVisitor.java | 5 ++ .../enigma/analysis/IndexInnerClassVisitor.java | 6 ++ src/main/java/cuchaz/enigma/analysis/JarIndex.java | 14 ++-- .../java/cuchaz/enigma/analysis/ParsedJar.java | 58 ++++++++++----- .../java/cuchaz/enigma/analysis/SourceIndex.java | 36 +++++++-- src/main/java/cuchaz/enigma/analysis/Token.java | 21 +++++- src/main/java/cuchaz/enigma/api/EnigmaPlugin.java | 18 +++++ .../cuchaz/enigma/bytecode/ClassProtectifier.java | 49 ------------- .../cuchaz/enigma/bytecode/ClassPublifier.java | 55 -------------- src/main/java/cuchaz/enigma/config/Config.java | 85 ++++++++++++++-------- src/main/java/cuchaz/enigma/config/Themes.java | 22 +++--- src/main/java/cuchaz/enigma/gui/CodeReader.java | 1 + .../java/cuchaz/enigma/gui/EnigmaSyntaxKit.java | 42 +++++++++++ src/main/java/cuchaz/enigma/gui/Gui.java | 41 ++++------- src/main/java/cuchaz/enigma/gui/GuiController.java | 81 ++++++++++++++++----- .../java/cuchaz/enigma/gui/MinecraftSyntaxKit.java | 42 ----------- .../enigma/gui/highlight/BoxHighlightPainter.java | 13 ++-- .../highlight/DeobfuscatedHighlightPainter.java | 21 ------ .../gui/highlight/ObfuscatedHighlightPainter.java | 21 ------ .../gui/highlight/OtherHighlightPainter.java | 21 ------ .../enigma/mapping/DirectionalTranslator.java | 1 + src/main/java/cuchaz/enigma/mapping/Mappings.java | 1 + 25 files changed, 351 insertions(+), 388 deletions(-) create mode 100644 src/main/java/cuchaz/enigma/api/EnigmaPlugin.java delete mode 100644 src/main/java/cuchaz/enigma/bytecode/ClassProtectifier.java delete mode 100644 src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java create mode 100644 src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java delete mode 100644 src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java delete mode 100644 src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java (limited to 'src/main/java/cuchaz') diff --git a/src/main/java/cuchaz/enigma/CommandMain.java b/src/main/java/cuchaz/enigma/CommandMain.java index 59eb1b6..6c8caa4 100644 --- a/src/main/java/cuchaz/enigma/CommandMain.java +++ b/src/main/java/cuchaz/enigma/CommandMain.java @@ -28,10 +28,6 @@ public class CommandMain { deobfuscate(args); } else if (command.equalsIgnoreCase("decompile")) { decompile(args); - } else if (command.equalsIgnoreCase("protectify")) { - protectify(args); - } else if (command.equalsIgnoreCase("publify")) { - publify(args); } else if (command.equalsIgnoreCase("convertmappings")) { convertMappings(args); } else { @@ -50,8 +46,6 @@ public class CommandMain { System.out.println("\twhere is one of:"); System.out.println("\t\tdeobfuscate []"); System.out.println("\t\tdecompile []"); - System.out.println("\t\tprotectify "); - System.out.println("\t\tpublify "); System.out.println("\t\tconvertmappings "); } @@ -71,20 +65,6 @@ public class CommandMain { deobfuscator.writeJar(fileJarOut, new ConsoleProgressListener()); } - private static void protectify(String[] args) throws Exception { - File fileJarIn = getReadableFile(getArg(args, 1, "in jar", true)); - File fileJarOut = getWritableFile(getArg(args, 2, "out jar", true)); - Deobfuscator deobfuscator = getDeobfuscator(null, new JarFile(fileJarIn)); - deobfuscator.protectifyJar(fileJarOut, new ConsoleProgressListener()); - } - - private static void publify(String[] args) throws Exception { - File fileJarIn = getReadableFile(getArg(args, 1, "in jar", true)); - File fileJarOut = getWritableFile(getArg(args, 2, "out jar", true)); - Deobfuscator deobfuscator = getDeobfuscator(null, new JarFile(fileJarIn)); - deobfuscator.publifyJar(fileJarOut, new ConsoleProgressListener()); - } - private static Deobfuscator getDeobfuscator(File fileMappings, JarFile jar) throws Exception { System.out.println("Reading jar..."); Deobfuscator deobfuscator = new Deobfuscator(jar); diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 465c1ec..c199225 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -28,8 +28,7 @@ import com.strobel.decompiler.languages.java.ast.CompilationUnit; import com.strobel.decompiler.languages.java.ast.InsertParenthesesVisitor; import com.strobel.decompiler.languages.java.ast.transforms.IAstTransform; import cuchaz.enigma.analysis.*; -import cuchaz.enigma.bytecode.ClassProtectifier; -import cuchaz.enigma.bytecode.ClassPublifier; +import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.mapping.*; import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; @@ -40,19 +39,20 @@ import oml.ast.transformers.ObfuscatedEnumSwitchRewriterTransform; import oml.ast.transformers.RemoveObjectCasts; import oml.ast.transformers.VarargsFixer; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; import java.io.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; public class Deobfuscator { + private final ServiceLoader plugins = ServiceLoader.load(EnigmaPlugin.class); private final ReferencedEntryPool entryPool = new ReferencedEntryPool(); private final ParsedJar parsedJar; private final DecompilerSettings settings; @@ -61,13 +61,20 @@ public class Deobfuscator { private final Map translatorCache; private Mappings mappings; - public Deobfuscator(ParsedJar jar) { + public Deobfuscator(ParsedJar jar, Consumer listener) { this.parsedJar = jar; // build the jar index + listener.accept("Indexing JAR..."); this.jarIndex = new JarIndex(entryPool); this.jarIndex.indexJar(this.parsedJar, true); + listener.accept("Initializing plugins..."); + for (EnigmaPlugin plugin : getPlugins()) { + plugin.onClassesLoaded(parsedJar.getClassDataMap(), parsedJar::getClassNode); + } + + listener.accept("Preparing..."); // config the decompiler this.settings = DecompilerSettings.javaDefaults(); this.settings.setMergeVariables(Utils.getSystemPropertyAsBoolean("enigma.mergeVariables", true)); @@ -85,8 +92,20 @@ public class Deobfuscator { setMappings(new Mappings()); } - public Deobfuscator(JarFile jar) throws IOException { - this(new ParsedJar(jar)); + public Deobfuscator(JarFile jar, Consumer listener) throws IOException { + this(new ParsedJar(jar), listener); + } + + public Deobfuscator(ParsedJar jar) throws IOException { + this(jar, (msg) -> {}); + } + + public Deobfuscator(JarFile jar) throws IOException { + this(jar, (msg) -> {}); + } + + public ServiceLoader getPlugins() { + return plugins; } public ParsedJar getJar() { @@ -442,20 +461,6 @@ public class Deobfuscator { transformJar(out, progress, createTypeLoader()::transformInto); } - public void protectifyJar(File out, ProgressListener progress) { - transformJar(out, progress, (node, writer) -> { - node.accept(new ClassProtectifier(Opcodes.ASM5, writer)); - return node.name; - }); - } - - public void publifyJar(File out, ProgressListener progress) { - transformJar(out, progress, (node, writer) -> { - node.accept(new ClassPublifier(Opcodes.ASM5, writer)); - return node.name; - }); - } - public void transformJar(File out, ProgressListener progress, ClassTransformer transformer) { try (JarOutputStream outJar = new JarOutputStream(new FileOutputStream(out))) { if (progress != null) { @@ -463,7 +468,7 @@ public class Deobfuscator { } AtomicInteger i = new AtomicInteger(); - parsedJar.visit(node -> { + parsedJar.visitNode(node -> { if (progress != null) { progress.onProgress(i.getAndIncrement(), node.name); } @@ -524,13 +529,7 @@ public class Deobfuscator { } public boolean isObfuscatedIdentifier(Entry obfEntry) { - return isObfuscatedIdentifier(obfEntry, false); - } - - public boolean isObfuscatedIdentifier(Entry obfEntry, boolean hack) { - if (obfEntry instanceof MethodEntry) { - // HACKHACK: Object methods are not obfuscated identifiers MethodEntry obfMethodEntry = (MethodEntry) obfEntry; String name = obfMethodEntry.getName(); @@ -558,21 +557,13 @@ public class Deobfuscator { } else if (name.equals("wait") && sig.equals("(JI)V")) { return false; } - - // FIXME: HACK EVEN MORE HACK! - if (hack && this.jarIndex.containsObfEntry(obfEntry.getOwnerClassEntry())) - return true; } return this.jarIndex.containsObfEntry(obfEntry); } - public boolean isRenameable(EntryReference obfReference, boolean activeHack) { - return obfReference.isNamed() && isObfuscatedIdentifier(obfReference.getNameableEntry(), activeHack); - } - public boolean isRenameable(EntryReference obfReference) { - return isRenameable(obfReference, false); + return obfReference.isNamed() && isObfuscatedIdentifier(obfReference.getNameableEntry()); } public boolean hasDeobfuscatedName(Entry obfEntry) { diff --git a/src/main/java/cuchaz/enigma/analysis/EntryReference.java b/src/main/java/cuchaz/enigma/analysis/EntryReference.java index 101729d..df36c23 100644 --- a/src/main/java/cuchaz/enigma/analysis/EntryReference.java +++ b/src/main/java/cuchaz/enigma/analysis/EntryReference.java @@ -70,7 +70,7 @@ public class EntryReference { return entry; } - public String getNamableName() { + public String getNameableName() { if (getNameableEntry() instanceof ClassEntry) { ClassEntry classEntry = (ClassEntry) getNameableEntry(); if (classEntry.isInnerClass()) { diff --git a/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java index 69fe54f..4d5e803 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java @@ -14,6 +14,11 @@ public class IndexClassVisitor extends ClassVisitor { this.index = index; } + public IndexClassVisitor(JarIndex index, int api, ClassVisitor cv) { + super(api, cv); + this.index = index; + } + @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { this.classEntry = this.index.indexClass(access, name, signature, superName, interfaces); diff --git a/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java index 0474227..b6ab2d5 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java @@ -11,6 +11,11 @@ public class IndexInnerClassVisitor extends ClassVisitor { this.index = index; } + public IndexInnerClassVisitor(JarIndex index, int api, ClassVisitor cv) { + super(api, cv); + this.index = index; + } + @Override public void visitInnerClass(String name, String outerName, String innerName, int access) { ClassEntry entry = new ClassEntry(name); @@ -19,5 +24,6 @@ public class IndexInnerClassVisitor extends ClassVisitor { ClassEntry outerEntry = new ClassEntry(outerName); index.indexInnerClass(entry, outerEntry); } + super.visitInnerClass(name, outerName, innerName, access); } } diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index 158df4b..e8bda8e 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java @@ -15,6 +15,8 @@ import com.google.common.collect.*; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.*; import cuchaz.enigma.mapping.entry.*; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Opcodes; import java.util.*; @@ -62,10 +64,15 @@ public class JarIndex { obfClassEntries.addAll(jar.getClassEntries()); // step 2: index classes, fields, methods, interfaces - jar.visit(node -> node.accept(new IndexClassVisitor(this, Opcodes.ASM5))); + if (buildInnerClasses) { + // + step 5: index inner classes + jar.visitReader(name -> new IndexClassVisitor(this, Opcodes.ASM5, new IndexInnerClassVisitor(this, Opcodes.ASM5)), ClassReader.SKIP_CODE); + } else { + jar.visitReader(name -> new IndexClassVisitor(this, Opcodes.ASM5), ClassReader.SKIP_CODE); + } // step 3: index field, method, constructor references - jar.visit(node -> node.accept(new IndexReferenceVisitor(this, Opcodes.ASM5))); + jar.visitReader(name -> new IndexReferenceVisitor(this, Opcodes.ASM5), ClassReader.SKIP_FRAMES); // step 4: index access and bridged methods for (MethodDefEntry methodEntry : methods.values()) { @@ -79,9 +86,6 @@ public class JarIndex { } if (buildInnerClasses) { - // step 5: index inner classes and anonymous classes - jar.visit(node -> node.accept(new IndexInnerClassVisitor(this, Opcodes.ASM5))); - // step 6: update other indices with inner class info Map renames = Maps.newHashMap(); for (ClassEntry innerClassEntry : this.innerClassesByOuter.values()) { diff --git a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java index 55f2141..86655d0 100644 --- a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java +++ b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java @@ -11,8 +11,10 @@ package cuchaz.enigma.analysis; +import com.google.common.io.ByteStreams; import cuchaz.enigma.mapping.entry.ClassEntry; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.tree.ClassNode; import java.io.BufferedInputStream; @@ -20,14 +22,17 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarInputStream; public class ParsedJar { - private final Map nodes = new LinkedHashMap<>(); + private final Map classBytes; + private final Map nodeCache = new HashMap<>(); public ParsedJar(JarFile jar) throws IOException { + Map uClassBytes = new LinkedHashMap<>();; try { // get the jar entries that correspond to classes Enumeration entries = jar.entries(); @@ -36,60 +41,75 @@ public class ParsedJar { // is this a class file? if (entry.getName().endsWith(".class")) { try (InputStream input = new BufferedInputStream(jar.getInputStream(entry))) { - // read the ClassNode from the jar - ClassReader reader = new ClassReader(input); - ClassNode node = new ClassNode(); - reader.accept(node, 0); String path = entry.getName().substring(0, entry.getName().length() - ".class".length()); - nodes.put(path, node); + uClassBytes.put(path, ByteStreams.toByteArray(input)); } } } } finally { jar.close(); + classBytes = Collections.unmodifiableMap(uClassBytes); } } public ParsedJar(JarInputStream jar) throws IOException { + Map uClassBytes = new LinkedHashMap<>(); try { // get the jar entries that correspond to classes JarEntry entry; while ((entry = jar.getNextJarEntry()) != null) { // is this a class file? if (entry.getName().endsWith(".class")) { - // read the ClassNode from the jar - ClassReader reader = new ClassReader(jar); - ClassNode node = new ClassNode(); - reader.accept(node, 0); String path = entry.getName().substring(0, entry.getName().length() - ".class".length()); - nodes.put(path, node); + uClassBytes.put(path, ByteStreams.toByteArray(jar)); jar.closeEntry(); } } } finally { jar.close(); + classBytes = Collections.unmodifiableMap(uClassBytes); } } - public void visit(Consumer visitor) { - for (ClassNode node : nodes.values()) { - visitor.accept(node); + public void visitReader(Function visitorFunction, int options) { + for (String s : classBytes.keySet()) { + ClassNode nodeCached = nodeCache.get(s); + if (nodeCached != null) { + nodeCached.accept(visitorFunction.apply(s)); + } else { + new ClassReader(classBytes.get(s)).accept(visitorFunction.apply(s), options); + } + } + } + + public void visitNode(Consumer consumer) { + for (String s : classBytes.keySet()) { + consumer.accept(getClassNode(s)); } } public int getClassCount() { - return nodes.size(); + return classBytes.size(); } public List getClassEntries() { - List entries = new ArrayList<>(nodes.size()); - for (ClassNode node : nodes.values()) { - entries.add(new ClassEntry(node.name)); + List entries = new ArrayList<>(classBytes.size()); + for (String s : classBytes.keySet()) { + entries.add(new ClassEntry(s)); } return entries; } public ClassNode getClassNode(String name) { - return nodes.get(name); + return nodeCache.computeIfAbsent(name, (n) -> { + ClassReader reader = new ClassReader(classBytes.get(name)); + ClassNode node = new ClassNode(); + reader.accept(node, 0); + return node; + }); } + + public Map getClassDataMap() { + return classBytes; + } } diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndex.java b/src/main/java/cuchaz/enigma/analysis/SourceIndex.java index 78195cb..4c84e69 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndex.java @@ -22,10 +22,7 @@ import com.strobel.decompiler.languages.java.ast.Identifier; import com.strobel.decompiler.languages.java.ast.TypeDeclaration; import cuchaz.enigma.mapping.entry.Entry; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; import java.util.regex.Pattern; public class SourceIndex { @@ -48,9 +45,12 @@ public class SourceIndex { this.tokenToReference = Maps.newTreeMap(); this.referenceToTokens = HashMultimap.create(); this.declarationToToken = Maps.newHashMap(); - this.lineOffsets = Lists.newArrayList(); + calculateLineOffsets(); + } + private void calculateLineOffsets() { // count the lines + this.lineOffsets = Lists.newArrayList(); this.lineOffsets.add(0); for (int i = 0; i < source.length(); i++) { if (source.charAt(i) == '\n') { @@ -59,6 +59,32 @@ public class SourceIndex { } } + public void remap(String source, Map tokenMap) { + this.source = source; + calculateLineOffsets(); + + for (Entry entry : Lists.newArrayList(declarationToToken.keySet())) { + Token token = declarationToToken.get(entry); + declarationToToken.put(entry, tokenMap.getOrDefault(token, token)); + } + + for (Token token : Lists.newArrayList(tokenToReference.keySet())) { + EntryReference e = tokenToReference.remove(token); + tokenToReference.put(tokenMap.getOrDefault(token, token), e); + } + + for (EntryReference ref : Lists.newArrayList(referenceToTokens.keySet())) { + List newTokens = new ArrayList<>(); + + for (Token token : referenceToTokens.get(ref)) { + newTokens.add(tokenMap.getOrDefault(token, token)); + } + + referenceToTokens.removeAll(ref); + referenceToTokens.putAll(ref, newTokens); + } + } + public String getSource() { return this.source; } diff --git a/src/main/java/cuchaz/enigma/analysis/Token.java b/src/main/java/cuchaz/enigma/analysis/Token.java index 266d202..14fa7ca 100644 --- a/src/main/java/cuchaz/enigma/analysis/Token.java +++ b/src/main/java/cuchaz/enigma/analysis/Token.java @@ -25,6 +25,25 @@ public class Token implements Comparable { } } + public int getRenameOffset(String to) { + int length = this.end - this.start; + return to.length() - length; + } + + public String rename(String source, String to) { + int oldEnd = this.end; + this.text = to; + this.end = this.start + to.length(); + + return source.substring(0, this.start) + to + source.substring(oldEnd); + } + + public Token move(int offset) { + Token token = new Token(this.start + offset, this.end + offset, null); + token.text = text; + return token; + } + public boolean contains(int pos) { return pos >= start && pos <= end; } @@ -41,7 +60,7 @@ public class Token implements Comparable { @Override public int hashCode() { - return Integer.hashCode(start) + Integer.hashCode(end) + (text != null ? text.hashCode() : 0); + return start * 37 + end; } public boolean equals(Token other) { diff --git a/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java b/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java new file mode 100644 index 0000000..3efe0dc --- /dev/null +++ b/src/main/java/cuchaz/enigma/api/EnigmaPlugin.java @@ -0,0 +1,18 @@ +package cuchaz.enigma.api; + +import org.objectweb.asm.tree.ClassNode; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.function.Function; + +public abstract class EnigmaPlugin { + public void onClassesLoaded(Map classData, Function classNodeGetter) { + + } + + @Nullable + public String proposeFieldName(String owner, String name, String desc) { + return null; + } +} diff --git a/src/main/java/cuchaz/enigma/bytecode/ClassProtectifier.java b/src/main/java/cuchaz/enigma/bytecode/ClassProtectifier.java deleted file mode 100644 index 9ed6db9..0000000 --- a/src/main/java/cuchaz/enigma/bytecode/ClassProtectifier.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.bytecode; - -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; - -public class ClassProtectifier extends ClassVisitor { - - public ClassProtectifier(int api, ClassVisitor cv) { - super(api, cv); - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - access = protectify(access); - return super.visitMethod(access, name, desc, signature, exceptions); - } - - @Override - public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - access = protectify(access); - return super.visitField(access, name, desc, signature, value); - } - - @Override - public void visitInnerClass(String name, String outerName, String innerName, int access) { - access = protectify(access); - super.visitInnerClass(name, outerName, innerName, access); - } - - private static int protectify(int access) { - AccessFlags accessFlags = new AccessFlags(access); - if (accessFlags.isPrivate()) { - accessFlags.setProtected(); - } - return accessFlags.getFlags(); - } -} diff --git a/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java b/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java deleted file mode 100644 index 64de788..0000000 --- a/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.bytecode; - -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; - -public class ClassPublifier extends ClassVisitor { - - public ClassPublifier(int api, ClassVisitor cv) { - super(api, cv); - } - - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - access = publify(access); - super.visit(version, access, name, signature, superName, interfaces); - } - - @Override - public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - access = publify(access); - return super.visitField(access, name, desc, signature, value); - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - access = publify(access); - return super.visitMethod(access, name, desc, signature, exceptions); - } - - @Override - public void visitInnerClass(String name, String outerName, String innerName, int access) { - access = publify(access); - super.visitInnerClass(name, outerName, innerName, access); - } - - private static int publify(int access) { - AccessFlags accessFlags = new AccessFlags(access); - if (!accessFlags.isPublic()) { - accessFlags.setPublic(); - } - return accessFlags.getFlags(); - } -} diff --git a/src/main/java/cuchaz/enigma/config/Config.java b/src/main/java/cuchaz/enigma/config/Config.java index 8c16c47..47bd0a7 100644 --- a/src/main/java/cuchaz/enigma/config/Config.java +++ b/src/main/java/cuchaz/enigma/config/Config.java @@ -6,12 +6,32 @@ import com.google.gson.*; import javax.swing.*; import javax.swing.plaf.metal.MetalLookAndFeel; +import java.awt.*; import java.io.File; import java.io.IOException; import java.lang.reflect.Type; import java.nio.charset.Charset; public class Config { + public static class AlphaColorEntry { + public Integer rgb; + public float alpha = 1.0f; + + public AlphaColorEntry(Integer rgb, float alpha) { + this.rgb = rgb; + this.alpha = alpha; + } + + public Color get() { + if (rgb == null) { + return new Color(0, 0, 0, 0); + } + + Color baseColor = new Color(rgb); + return new Color(baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), (int)(255 * alpha)); + } + } + public enum LookAndFeel { DEFAULT("Default"), DARCULA("Dank"); @@ -47,16 +67,13 @@ public class Config { config.lineNumbersForeground = 0x333300; config.lineNumbersBackground = 0xEEEEFF; config.lineNumbersSelected = 0xCCCCEE; - config.obfuscatedColor = 0xFFDCDC; - config.obfuscatedHiglightAlpha = 1.0F; - config.obfuscatedColorOutline = 0xA05050; - config.obfuscatedOutlineAlpha = 1.0F; - config.deobfuscatedColor = 0xDCFFDC; - config.deobfuscatedHiglightAlpha = 1.0F; - config.deobfuscatedColorOutline = 0x50A050; - config.deobfuscatedOutlineAlpha = 1.0F; - config.otherColorOutline = 0xB4B4B4; - config.otherOutlineAlpha = 1.0F; + config.obfuscatedColor = new AlphaColorEntry(0xFFDCDC, 1.0f); + config.obfuscatedColorOutline = new AlphaColorEntry(0xA05050, 1.0f); + config.proposedColor = new AlphaColorEntry(0x000000, 0.075f); + config.proposedColorOutline = new AlphaColorEntry(0x000000, 0.15f); + config.deobfuscatedColor = new AlphaColorEntry(0xDCFFDC, 1.0f); + config.deobfuscatedColorOutline = new AlphaColorEntry(0x50A050, 1.0f); + config.otherColorOutline = new AlphaColorEntry(0xB4B4B4, 1.0f); config.editorBackground = 0xFFFFFF; config.highlightColor = 0x3333EE; config.stringColor = 0xCC6600; @@ -72,16 +89,13 @@ public class Config { config.lineNumbersForeground = 0xA4A4A3; config.lineNumbersBackground = 0x313335; config.lineNumbersSelected = 0x606366; - config.obfuscatedColor = 0xFF5555; - config.obfuscatedHiglightAlpha = 0.3F; - config.obfuscatedColorOutline = 0xFF5555; - config.obfuscatedOutlineAlpha = 0.5F; - config.deobfuscatedColor = 0x50FA7B; - config.deobfuscatedHiglightAlpha = 0.3F; - config.deobfuscatedColorOutline = 0x50FA7B; - config.deobfuscatedOutlineAlpha = 0.5F; - config.otherColorOutline = 0xB4B4B4; - config.otherOutlineAlpha = 0.0F; + config.obfuscatedColor = new AlphaColorEntry(0xFF5555, 0.3f); + config.obfuscatedColorOutline = new AlphaColorEntry(0xFF5555, 0.5f); + config.deobfuscatedColor = new AlphaColorEntry(0x50FA7B, 0.3f); + config.deobfuscatedColorOutline = new AlphaColorEntry(0x50FA7B, 0.5f); + config.proposedColor = new AlphaColorEntry(0x606366, 0.3f); + config.proposedColorOutline = new AlphaColorEntry(0x606366, 0.5f); + config.otherColorOutline = new AlphaColorEntry(0xB4B4B4, 0.0f); config.editorBackground = 0x282A36; config.highlightColor = 0xFF79C6; config.stringColor = 0xF1FA8C; @@ -103,16 +117,13 @@ public class Config { private final transient Gson gson; // transient to exclude it from being exposed - public Integer obfuscatedColor; - public float obfuscatedHiglightAlpha; - public Integer obfuscatedColorOutline; - public float obfuscatedOutlineAlpha; - public Integer deobfuscatedColor; - public float deobfuscatedHiglightAlpha; - public Integer deobfuscatedColorOutline; - public float deobfuscatedOutlineAlpha; - public Integer otherColorOutline; - public float otherOutlineAlpha; + public AlphaColorEntry obfuscatedColor; + public AlphaColorEntry obfuscatedColorOutline; + public AlphaColorEntry proposedColor; + public AlphaColorEntry proposedColorOutline; + public AlphaColorEntry deobfuscatedColor; + public AlphaColorEntry deobfuscatedColorOutline; + public AlphaColorEntry otherColorOutline; //Defaults found here: https://github.com/Sciss/SyntaxPane/blob/122da367ff7a5d31627a70c62a48a9f0f4f85a0a/src/main/resources/de/sciss/syntaxpane/defaultsyntaxkit/config.properties#L139 public Integer editorBackground; @@ -152,8 +163,18 @@ public class Config { public void loadConfig() throws IOException { if (!ENIGMA_DIR.exists()) ENIGMA_DIR.mkdirs(); File configFile = new File(ENIGMA_DIR, "config.json"); - if (configFile.exists()) gson.fromJson(Files.asCharSource(configFile, Charset.defaultCharset()).read(), Config.class); - else { + boolean loaded = false; + + if (configFile.exists()) { + try { + gson.fromJson(Files.asCharSource(configFile, Charset.defaultCharset()).read(), Config.class); + loaded = true; + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (!loaded) { this.reset(); Files.touch(configFile); } diff --git a/src/main/java/cuchaz/enigma/config/Themes.java b/src/main/java/cuchaz/enigma/config/Themes.java index 8a4c341..00324f4 100644 --- a/src/main/java/cuchaz/enigma/config/Themes.java +++ b/src/main/java/cuchaz/enigma/config/Themes.java @@ -1,15 +1,12 @@ package cuchaz.enigma.config; -import com.bulenkov.darcula.DarculaLaf; +import com.google.common.collect.ImmutableMap; import cuchaz.enigma.gui.Gui; -import cuchaz.enigma.gui.MinecraftSyntaxKit; -import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.OtherHighlightPainter; +import cuchaz.enigma.gui.EnigmaSyntaxKit; +import cuchaz.enigma.gui.highlight.BoxHighlightPainter; import de.sciss.syntaxpane.DefaultSyntaxKit; import javax.swing.*; -import java.awt.*; import java.io.IOException; public class Themes { @@ -27,12 +24,15 @@ public class Themes { } catch (IOException e) { e.printStackTrace(); } - MinecraftSyntaxKit.invalidate(); + EnigmaSyntaxKit.invalidate(); DefaultSyntaxKit.initKit(); - DefaultSyntaxKit.registerContentType("text/minecraft", MinecraftSyntaxKit.class.getName()); - gui.obfuscatedHighlightPainter = new ObfuscatedHighlightPainter(); - gui.deobfuscatedHighlightPainter = new DeobfuscatedHighlightPainter(); - gui.otherHighlightPainter = new OtherHighlightPainter(); + DefaultSyntaxKit.registerContentType("text/enigma-sources", EnigmaSyntaxKit.class.getName()); + gui.boxHighlightPainters = ImmutableMap.of( + "obfuscated", BoxHighlightPainter.create(Config.getInstance().obfuscatedColor, Config.getInstance().obfuscatedColorOutline), + "proposed", BoxHighlightPainter.create(Config.getInstance().proposedColor, Config.getInstance().proposedColorOutline), + "deobfuscated", BoxHighlightPainter.create(Config.getInstance().deobfuscatedColor, Config.getInstance().deobfuscatedColorOutline), + "other", BoxHighlightPainter.create(null, Config.getInstance().otherColorOutline) + ); gui.setEditorTheme(Config.getInstance().lookAndFeel); SwingUtilities.updateComponentTreeUI(gui.getFrame()); } diff --git a/src/main/java/cuchaz/enigma/gui/CodeReader.java b/src/main/java/cuchaz/enigma/gui/CodeReader.java index ac45b4a..137c730 100644 --- a/src/main/java/cuchaz/enigma/gui/CodeReader.java +++ b/src/main/java/cuchaz/enigma/gui/CodeReader.java @@ -143,6 +143,7 @@ public class CodeReader extends JEditorPane { { // decompile it + CompilationUnit sourceTree = deobfuscator.getSourceTree(classEntry.getOutermostClassName()); String source = deobfuscator.getSource(sourceTree); setCode(source); diff --git a/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java new file mode 100644 index 0000000..5ea0bc2 --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java @@ -0,0 +1,42 @@ +package cuchaz.enigma.gui; + +import cuchaz.enigma.config.Config; +import de.sciss.syntaxpane.components.LineNumbersRuler; +import de.sciss.syntaxpane.syntaxkits.JavaSyntaxKit; +import de.sciss.syntaxpane.util.Configuration; + +public class EnigmaSyntaxKit extends JavaSyntaxKit { + private static Configuration configuration = null; + + @Override + public Configuration getConfig() { + if(configuration == null){ + initConfig(super.getConfig(JavaSyntaxKit.class)); + } + return configuration; + } + + public void initConfig(Configuration baseConfig){ + configuration = baseConfig; + //See de.sciss.syntaxpane.TokenType + configuration.put("Style.KEYWORD", Config.getInstance().highlightColor + ", 0"); + configuration.put("Style.KEYWORD2", Config.getInstance().highlightColor + ", 3"); + configuration.put("Style.STRING", Config.getInstance().stringColor + ", 0"); + configuration.put("Style.STRING2", Config.getInstance().stringColor + ", 1"); + configuration.put("Style.NUMBER", Config.getInstance().numberColor + ", 1"); + configuration.put("Style.OPERATOR", Config.getInstance().operatorColor + ", 0"); + configuration.put("Style.DELIMITER", Config.getInstance().delimiterColor + ", 1"); + configuration.put("Style.TYPE", Config.getInstance().typeColor + ", 2"); + configuration.put("Style.TYPE2", Config.getInstance().typeColor + ", 1"); + configuration.put("Style.IDENTIFIER", Config.getInstance().identifierColor + ", 0"); + configuration.put("Style.DEFAULT", Config.getInstance().defaultTextColor + ", 0"); + configuration.put(LineNumbersRuler.PROPERTY_BACKGROUND, Config.getInstance().lineNumbersBackground + ""); + configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + ""); + configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + ""); + configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config + } + + public static void invalidate(){ + configuration = null; + } +} diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 06e7842..8ec58f9 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -22,9 +22,7 @@ import cuchaz.enigma.gui.elements.MenuBar; import cuchaz.enigma.gui.elements.PopupMenuBar; import cuchaz.enigma.gui.filechooser.FileChooserAny; import cuchaz.enigma.gui.filechooser.FileChooserFolder; -import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; -import cuchaz.enigma.gui.highlight.OtherHighlightPainter; +import cuchaz.enigma.gui.highlight.BoxHighlightPainter; import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; import cuchaz.enigma.gui.node.ClassSelectorPackageNode; import cuchaz.enigma.gui.panels.PanelDeobf; @@ -48,10 +46,8 @@ import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import java.util.List; -import java.util.Vector; import java.util.function.Function; public class Gui { @@ -75,9 +71,7 @@ public class Gui { private JPanel classesPanel; private JSplitPane splitClasses; private PanelIdentifier infoPanel; - public ObfuscatedHighlightPainter obfuscatedHighlightPainter; - public DeobfuscatedHighlightPainter deobfuscatedHighlightPainter; - public OtherHighlightPainter otherHighlightPainter; + public Map boxHighlightPainters; private SelectionHighlightPainter selectionHighlightPainter; private JTree inheritanceTree; private JTree implementationsTree; @@ -145,7 +139,7 @@ public class Gui { selectionHighlightPainter = new SelectionHighlightPainter(); this.editor = new PanelEditor(this); JScrollPane sourceScroller = new JScrollPane(this.editor); - this.editor.setContentType("text/minecraft"); + this.editor.setContentType("text/enigma-sources"); this.editor.setBackground(new Color(Config.getInstance().editorBackground)); DefaultSyntaxKit kit = (DefaultSyntaxKit) this.editor.getEditorKit(); kit.toggleComponent(this.editor, "de.sciss.syntaxpane.components.TokenMarker"); @@ -311,11 +305,11 @@ public class Gui { return this.controller; } - public void onStartOpenJar() { + public void onStartOpenJar(String message) { this.classesPanel.removeAll(); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); - panel.add(new JLabel("Loading...")); + panel.add(new JLabel(message)); this.classesPanel.add(panel); redraw(); @@ -407,20 +401,17 @@ public class Gui { showToken(sortedTokens.get(0)); } - public void setHighlightedTokens(Iterable obfuscatedTokens, Iterable deobfuscatedTokens, Iterable otherTokens) { - + public void setHighlightedTokens(Map> tokens) { // remove any old highlighters this.editor.getHighlighter().removeAllHighlights(); - // color things based on the index - if (obfuscatedTokens != null) { - setHighlightedTokens(obfuscatedTokens, obfuscatedHighlightPainter); - } - if (deobfuscatedTokens != null) { - setHighlightedTokens(deobfuscatedTokens, deobfuscatedHighlightPainter); - } - if (otherTokens != null) { - setHighlightedTokens(otherTokens, otherHighlightPainter); + if (boxHighlightPainters != null) { + for (String s : tokens.keySet()) { + BoxHighlightPainter painter = boxHighlightPainters.get(s); + if (painter != null) { + setHighlightedTokens(tokens.get(s), painter); + } + } } redraw(); @@ -582,7 +573,7 @@ public class Gui { // init the text box final JTextField text = new JTextField(); - text.setText(reference.getNamableName()); + text.setText(reference.getNameableName()); text.setPreferredSize(new Dimension(360, text.getPreferredSize().height)); text.addKeyListener(new KeyAdapter() { @Override @@ -633,7 +624,7 @@ public class Gui { // abort the rename JPanel panel = (JPanel) infoPanel.getComponent(0); panel.remove(panel.getComponentCount() - 1); - panel.add(Utils.unboldLabel(new JLabel(reference.getNamableName(), JLabel.LEFT))); + panel.add(Utils.unboldLabel(new JLabel(reference.getNameableName(), JLabel.LEFT))); this.editor.grabFocus(); diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 6e15bb0..e2f332d 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -11,13 +11,14 @@ package cuchaz.enigma.gui; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Queues; import com.strobel.decompiler.languages.java.ast.CompilationUnit; import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.*; +import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.config.Config; -import cuchaz.enigma.config.Themes; import cuchaz.enigma.gui.dialog.ProgressDialog; import cuchaz.enigma.mapping.*; import cuchaz.enigma.mapping.entry.ClassEntry; @@ -30,9 +31,7 @@ import cuchaz.enigma.utils.ReadableToken; import java.awt.event.ItemEvent; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Deque; -import java.util.List; +import java.util.*; import java.util.jar.JarFile; public class GuiController { @@ -58,8 +57,10 @@ public class GuiController { } public void openJar(final JarFile jar) throws IOException { - this.gui.onStartOpenJar(); - this.deobfuscator = new Deobfuscator(jar); + this.gui.onStartOpenJar("Loading JAR..."); + this.deobfuscator = new Deobfuscator(jar, (msg) -> { + this.gui.onStartOpenJar(msg); + }); this.gui.onFinishOpenJar(jar.getName()); refreshClasses(); } @@ -162,7 +163,7 @@ public class GuiController { } public boolean referenceIsRenameable(EntryReference deobfReference) { - return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference), true); + return this.deobfuscator.isRenameable(this.deobfuscator.obfuscateReference(deobfReference)); } public ClassInheritanceTreeNode getClassInheritance(ClassEntry deobfClassEntry) { @@ -334,29 +335,73 @@ public class GuiController { } String source = deobfuscator.getSource(sourceTree); index = deobfuscator.getSourceIndex(sourceTree, source); - gui.setSource(index.getSource()); - if (obfReference != null) { - showReference(obfReference); - } + + String sourceString = index.getSource(); // set the highlighted tokens List obfuscatedTokens = Lists.newArrayList(); + List proposedTokens = Lists.newArrayList(); List deobfuscatedTokens = Lists.newArrayList(); List otherTokens = Lists.newArrayList(); - for (Token token : index.referenceTokens()) { - EntryReference reference = index.getDeobfReference(token); + + int offset = 0; + Map tokenRemap = new IdentityHashMap<>(); + boolean remapped = false; + + for (Token inToken : index.referenceTokens()) { + EntryReference reference = index.getDeobfReference(inToken); + Token token = inToken.move(offset); + if (referenceIsRenameable(reference)) { - if (entryHasDeobfuscatedName(reference.getNameableEntry())) { - deobfuscatedTokens.add(token); - } else { - obfuscatedTokens.add(token); + boolean renamed = false; + + if (!entryHasDeobfuscatedName(reference.getNameableEntry())) { + Entry obfEntry = deobfuscator.obfuscateEntry(reference.getNameableEntry()); + if (obfEntry instanceof FieldEntry) { + for (EnigmaPlugin plugin : deobfuscator.getPlugins()) { + String proposal = plugin.proposeFieldName(obfEntry.getClassName(), obfEntry.getName(), ((FieldEntry) obfEntry).getDesc().toString()); + if (proposal != null) { + proposedTokens.add(token); + offset += token.getRenameOffset(proposal); + sourceString = token.rename(sourceString, proposal); + renamed = true; + remapped = true; + break; + } + } + } + } + + if (!renamed) { + if (entryHasDeobfuscatedName(reference.getNameableEntry())) { + deobfuscatedTokens.add(token); + } else { + obfuscatedTokens.add(token); + } } } else { otherTokens.add(token); } + + tokenRemap.put(inToken, token); + } + + if (remapped) { + index.remap(sourceString, tokenRemap); + } + + gui.setSource(sourceString); + if (obfReference != null) { + showReference(obfReference); } + gui.setEditorTheme(Config.getInstance().lookAndFeel); - gui.setHighlightedTokens(obfuscatedTokens, deobfuscatedTokens, otherTokens); + gui.setHighlightedTokens(ImmutableMap.of( + "obfuscated", obfuscatedTokens, + "proposed", proposedTokens, + "deobfuscated", deobfuscatedTokens, + "other", otherTokens + )); }).start(); } diff --git a/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java b/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java deleted file mode 100644 index d9fcee5..0000000 --- a/src/main/java/cuchaz/enigma/gui/MinecraftSyntaxKit.java +++ /dev/null @@ -1,42 +0,0 @@ -package cuchaz.enigma.gui; - -import cuchaz.enigma.config.Config; -import de.sciss.syntaxpane.components.LineNumbersRuler; -import de.sciss.syntaxpane.syntaxkits.JavaSyntaxKit; -import de.sciss.syntaxpane.util.Configuration; - -public class MinecraftSyntaxKit extends JavaSyntaxKit { - private static Configuration configuration = null; - - @Override - public Configuration getConfig() { - if(configuration == null){ - initConfig(super.getConfig(JavaSyntaxKit.class)); - } - return configuration; - } - - public void initConfig(Configuration baseConfig){ - configuration = baseConfig; - //See de.sciss.syntaxpane.TokenType - configuration.put("Style.KEYWORD", Config.getInstance().highlightColor + ", 0"); - configuration.put("Style.KEYWORD2", Config.getInstance().highlightColor + ", 3"); - configuration.put("Style.STRING", Config.getInstance().stringColor + ", 0"); - configuration.put("Style.STRING2", Config.getInstance().stringColor + ", 1"); - configuration.put("Style.NUMBER", Config.getInstance().numberColor + ", 1"); - configuration.put("Style.OPERATOR", Config.getInstance().operatorColor + ", 0"); - configuration.put("Style.DELIMITER", Config.getInstance().delimiterColor + ", 1"); - configuration.put("Style.TYPE", Config.getInstance().typeColor + ", 2"); - configuration.put("Style.TYPE2", Config.getInstance().typeColor + ", 1"); - configuration.put("Style.IDENTIFIER", Config.getInstance().identifierColor + ", 0"); - configuration.put("Style.DEFAULT", Config.getInstance().defaultTextColor + ", 0"); - configuration.put(LineNumbersRuler.PROPERTY_BACKGROUND, Config.getInstance().lineNumbersBackground + ""); - configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + ""); - configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + ""); - configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config - } - - public static void invalidate(){ - configuration = null; - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java index 976c215..10366ce 100644 --- a/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java +++ b/src/main/java/cuchaz/enigma/gui/highlight/BoxHighlightPainter.java @@ -11,13 +11,14 @@ package cuchaz.enigma.gui.highlight; +import cuchaz.enigma.config.Config; + import javax.swing.text.BadLocationException; import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; import java.awt.*; -public abstract class BoxHighlightPainter implements Highlighter.HighlightPainter { - +public class BoxHighlightPainter implements Highlighter.HighlightPainter { private Color fillColor; private Color borderColor; @@ -26,6 +27,10 @@ public abstract class BoxHighlightPainter implements Highlighter.HighlightPainte this.borderColor = borderColor; } + public static BoxHighlightPainter create(Config.AlphaColorEntry entry, Config.AlphaColorEntry entryOutline) { + return new BoxHighlightPainter(entry != null ? entry.get() : null, entryOutline != null ? entryOutline.get() : null); + } + public static Rectangle getBounds(JTextComponent text, int start, int end) { try { // determine the bounds of the text @@ -59,8 +64,4 @@ public abstract class BoxHighlightPainter implements Highlighter.HighlightPainte g.drawRoundRect(bounds.x, bounds.y, bounds.width, bounds.height, 4, 4); } - protected static Color getColor(int rgb, float alpha){ - Color baseColor = new Color(rgb); - return new Color(baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), (int)(255 * alpha)); - } } diff --git a/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java deleted file mode 100644 index 41aa97f..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/DeobfuscatedHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class DeobfuscatedHighlightPainter extends BoxHighlightPainter { - - public DeobfuscatedHighlightPainter() { - super(getColor(Config.getInstance().deobfuscatedColor, Config.getInstance().deobfuscatedHiglightAlpha), getColor(Config.getInstance().deobfuscatedColorOutline, Config.getInstance().deobfuscatedOutlineAlpha)); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java deleted file mode 100644 index d735874..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/ObfuscatedHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class ObfuscatedHighlightPainter extends BoxHighlightPainter { - - public ObfuscatedHighlightPainter() { - super(getColor(Config.getInstance().obfuscatedColor, Config.getInstance().obfuscatedHiglightAlpha), getColor(Config.getInstance().obfuscatedColorOutline, Config.getInstance().obfuscatedOutlineAlpha)); - } -} diff --git a/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java b/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java deleted file mode 100644 index f4ae235..0000000 --- a/src/main/java/cuchaz/enigma/gui/highlight/OtherHighlightPainter.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.gui.highlight; - -import cuchaz.enigma.config.Config; - -public class OtherHighlightPainter extends BoxHighlightPainter { - - public OtherHighlightPainter() { - super(null, getColor(Config.getInstance().otherColorOutline, Config.getInstance().otherOutlineAlpha)); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java index 99a6315..10fb921 100644 --- a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java +++ b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java @@ -20,6 +20,7 @@ import cuchaz.enigma.mapping.entry.*; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; public class DirectionalTranslator implements Translator { private final TranslationDirection direction; diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index 3ef1be5..c865079 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java @@ -15,6 +15,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import cuchaz.enigma.analysis.TranslationIndex; +import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.mapping.entry.MethodEntry; -- cgit v1.2.3