From 406b9a89318473571d27de60b8aa1b51f84af245 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 19 May 2018 17:06:26 +0200 Subject: Package updates --- src/main/java/cuchaz/enigma/Deobfuscator.java | 1 + .../java/cuchaz/enigma/TranslatingTypeLoader.java | 4 +- .../analysis/ClassImplementationsTreeNode.java | 4 +- .../enigma/analysis/ClassInheritanceTreeNode.java | 2 +- .../cuchaz/enigma/analysis/EntryReference.java | 6 +- .../java/cuchaz/enigma/analysis/EntryRenamer.java | 1 + .../enigma/analysis/FieldReferenceTreeNode.java | 3 + .../cuchaz/enigma/analysis/IndexClassVisitor.java | 2 +- .../enigma/analysis/IndexInnerClassVisitor.java | 2 +- .../enigma/analysis/IndexReferenceVisitor.java | 3 + src/main/java/cuchaz/enigma/analysis/JarIndex.java | 1 + .../analysis/MethodImplementationsTreeNode.java | 4 +- .../enigma/analysis/MethodInheritanceTreeNode.java | 4 +- .../enigma/analysis/MethodReferenceTreeNode.java | 3 + .../java/cuchaz/enigma/analysis/ParsedJar.java | 2 +- .../cuchaz/enigma/analysis/ReferenceTreeNode.java | 2 +- .../java/cuchaz/enigma/analysis/SourceIndex.java | 2 +- .../enigma/analysis/SourceIndexClassVisitor.java | 2 +- .../enigma/analysis/SourceIndexMethodVisitor.java | 1 + .../cuchaz/enigma/analysis/SourceIndexVisitor.java | 4 +- .../cuchaz/enigma/analysis/TranslationIndex.java | 1 + .../translators/TranslationClassVisitor.java | 1 + .../translators/TranslationMethodVisitor.java | 1 + src/main/java/cuchaz/enigma/gui/ClassSelector.java | 2 +- src/main/java/cuchaz/enigma/gui/CodeReader.java | 4 +- src/main/java/cuchaz/enigma/gui/Gui.java | 1 + src/main/java/cuchaz/enigma/gui/GuiController.java | 4 + .../java/cuchaz/enigma/gui/ScoredClassEntry.java | 2 +- .../enigma/gui/node/ClassSelectorClassNode.java | 2 +- .../java/cuchaz/enigma/gui/panels/PanelObf.java | 2 +- .../java/cuchaz/enigma/mapping/ClassDefEntry.java | 29 --- .../java/cuchaz/enigma/mapping/ClassEntry.java | 171 --------------- .../java/cuchaz/enigma/mapping/ClassMapping.java | 3 + .../enigma/mapping/DirectionalTranslator.java | 1 + src/main/java/cuchaz/enigma/mapping/Entry.java | 22 -- .../java/cuchaz/enigma/mapping/EntryFactory.java | 45 ---- .../java/cuchaz/enigma/mapping/FieldDefEntry.java | 34 --- .../java/cuchaz/enigma/mapping/FieldEntry.java | 76 ------- .../java/cuchaz/enigma/mapping/FieldMapping.java | 2 + .../enigma/mapping/LocalVariableDefEntry.java | 75 ------- .../cuchaz/enigma/mapping/LocalVariableEntry.java | 81 ------- .../enigma/mapping/LocalVariableMapping.java | 3 + src/main/java/cuchaz/enigma/mapping/Mappings.java | 2 + .../cuchaz/enigma/mapping/MappingsChecker.java | 4 + .../cuchaz/enigma/mapping/MappingsRenamer.java | 1 + .../cuchaz/enigma/mapping/MappingsSRGWriter.java | 1 + .../cuchaz/enigma/mapping/MappingsTinyReader.java | 1 + .../java/cuchaz/enigma/mapping/MemberMapping.java | 3 + .../java/cuchaz/enigma/mapping/MethodDefEntry.java | 35 --- .../cuchaz/enigma/mapping/MethodDescriptor.java | 1 + .../java/cuchaz/enigma/mapping/MethodEntry.java | 79 ------- .../java/cuchaz/enigma/mapping/MethodMapping.java | 2 + .../java/cuchaz/enigma/mapping/NameValidator.java | 1 + .../cuchaz/enigma/mapping/ProcyonEntryFactory.java | 69 ------ .../cuchaz/enigma/mapping/ReferencedEntryPool.java | 50 ----- .../java/cuchaz/enigma/mapping/Translator.java | 2 + src/main/java/cuchaz/enigma/mapping/Type.java | 235 --------------------- .../java/cuchaz/enigma/mapping/TypeDescriptor.java | 1 + .../cuchaz/enigma/mapping/entry/ClassDefEntry.java | 29 +++ .../cuchaz/enigma/mapping/entry/ClassEntry.java | 171 +++++++++++++++ .../java/cuchaz/enigma/mapping/entry/Entry.java | 22 ++ .../cuchaz/enigma/mapping/entry/EntryFactory.java | 49 +++++ .../cuchaz/enigma/mapping/entry/FieldDefEntry.java | 35 +++ .../cuchaz/enigma/mapping/entry/FieldEntry.java | 77 +++++++ .../mapping/entry/LocalVariableDefEntry.java | 76 +++++++ .../enigma/mapping/entry/LocalVariableEntry.java | 82 +++++++ .../enigma/mapping/entry/MethodDefEntry.java | 36 ++++ .../cuchaz/enigma/mapping/entry/MethodEntry.java | 80 +++++++ .../enigma/mapping/entry/ProcyonEntryFactory.java | 71 +++++++ .../enigma/mapping/entry/ReferencedEntryPool.java | 53 +++++ 70 files changed, 856 insertions(+), 1027 deletions(-) delete mode 100644 src/main/java/cuchaz/enigma/mapping/ClassDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/ClassEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/Entry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/EntryFactory.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/FieldDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/FieldEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/LocalVariableDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/MethodDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/MethodEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/ReferencedEntryPool.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/Type.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/Entry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java create mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java (limited to 'src/main/java/cuchaz') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index e1454c7e..3433ca9c 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -29,6 +29,7 @@ import cuchaz.enigma.analysis.*; import cuchaz.enigma.bytecode.ClassProtectifier; import cuchaz.enigma.bytecode.ClassPublifier; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.utils.Utils; import org.objectweb.asm.ClassWriter; diff --git a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java index c91070fc..3f1ff7a1 100644 --- a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java +++ b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java @@ -19,8 +19,8 @@ import com.strobel.assembler.metadata.ITypeLoader; import cuchaz.enigma.analysis.JarIndex; import cuchaz.enigma.analysis.ParsedJar; import cuchaz.enigma.bytecode.translators.TranslationClassVisitor; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.ReferencedEntryPool; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; import cuchaz.enigma.mapping.Translator; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; diff --git a/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java b/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java index d0e1ddbe..e876bb07 100644 --- a/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/ClassImplementationsTreeNode.java @@ -12,8 +12,8 @@ package cuchaz.enigma.analysis; import com.google.common.collect.Lists; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.MethodEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.mapping.Translator; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java index 8fd71b7f..b8ee17da 100644 --- a/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/ClassInheritanceTreeNode.java @@ -12,7 +12,7 @@ package cuchaz.enigma.analysis; import com.google.common.collect.Lists; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.mapping.Translator; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/EntryReference.java b/src/main/java/cuchaz/enigma/analysis/EntryReference.java index b972585a..101729d8 100644 --- a/src/main/java/cuchaz/enigma/analysis/EntryReference.java +++ b/src/main/java/cuchaz/enigma/analysis/EntryReference.java @@ -11,9 +11,9 @@ package cuchaz.enigma.analysis; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.Entry; -import cuchaz.enigma.mapping.MethodEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.Entry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.utils.Utils; import java.util.Arrays; diff --git a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java index b0bcc91e..656fa320 100644 --- a/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java +++ b/src/main/java/cuchaz/enigma/analysis/EntryRenamer.java @@ -15,6 +15,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import java.util.AbstractMap; import java.util.List; diff --git a/src/main/java/cuchaz/enigma/analysis/FieldReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/FieldReferenceTreeNode.java index 3e467dba..3d0e48b4 100644 --- a/src/main/java/cuchaz/enigma/analysis/FieldReferenceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/FieldReferenceTreeNode.java @@ -12,6 +12,9 @@ package cuchaz.enigma.analysis; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.FieldEntry; +import cuchaz.enigma.mapping.entry.MethodDefEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java index 97d6ffa2..7828fa94 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexClassVisitor.java @@ -1,6 +1,6 @@ package cuchaz.enigma.analysis; -import cuchaz.enigma.mapping.ClassDefEntry; +import cuchaz.enigma.mapping.entry.ClassDefEntry; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; diff --git a/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java index 621bd33b..04742278 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexInnerClassVisitor.java @@ -1,6 +1,6 @@ package cuchaz.enigma.analysis; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import org.objectweb.asm.ClassVisitor; public class IndexInnerClassVisitor extends ClassVisitor { diff --git a/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java index 552601b6..bd64bfc1 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java @@ -2,6 +2,9 @@ package cuchaz.enigma.analysis; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodDefEntry; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index 972d4fe0..54dd5068 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java @@ -14,6 +14,7 @@ package cuchaz.enigma.analysis; import com.google.common.collect.*; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import org.objectweb.asm.Opcodes; import java.util.*; diff --git a/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java index 6791b831..723fffed 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodImplementationsTreeNode.java @@ -12,8 +12,8 @@ package cuchaz.enigma.analysis; import com.google.common.collect.Lists; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.MethodEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.mapping.Translator; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java index f060ed9d..904e5945 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodInheritanceTreeNode.java @@ -12,8 +12,8 @@ package cuchaz.enigma.analysis; import com.google.common.collect.Lists; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.MethodEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.mapping.Translator; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java index 37b40730..15ae5153 100644 --- a/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/MethodReferenceTreeNode.java @@ -13,6 +13,9 @@ package cuchaz.enigma.analysis; import com.google.common.collect.Sets; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.Entry; +import cuchaz.enigma.mapping.entry.MethodDefEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; diff --git a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java index 78ef722d..fae58f80 100644 --- a/src/main/java/cuchaz/enigma/analysis/ParsedJar.java +++ b/src/main/java/cuchaz/enigma/analysis/ParsedJar.java @@ -11,7 +11,7 @@ package cuchaz.enigma.analysis; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.ClassNode; diff --git a/src/main/java/cuchaz/enigma/analysis/ReferenceTreeNode.java b/src/main/java/cuchaz/enigma/analysis/ReferenceTreeNode.java index 04693637..3950d165 100644 --- a/src/main/java/cuchaz/enigma/analysis/ReferenceTreeNode.java +++ b/src/main/java/cuchaz/enigma/analysis/ReferenceTreeNode.java @@ -11,7 +11,7 @@ package cuchaz.enigma.analysis; -import cuchaz.enigma.mapping.Entry; +import cuchaz.enigma.mapping.entry.Entry; public interface ReferenceTreeNode { E getEntry(); diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndex.java b/src/main/java/cuchaz/enigma/analysis/SourceIndex.java index 19250c8d..14b2e768 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndex.java @@ -18,7 +18,7 @@ import com.google.common.collect.Multimap; import com.strobel.decompiler.languages.Region; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.Identifier; -import cuchaz.enigma.mapping.Entry; +import cuchaz.enigma.mapping.entry.Entry; import java.util.Collection; import java.util.List; diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java index 015eaac6..1e2eed8d 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java @@ -17,7 +17,7 @@ import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.assembler.metadata.TypeReference; import com.strobel.decompiler.languages.TextLocation; import com.strobel.decompiler.languages.java.ast.*; -import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; public class SourceIndexClassVisitor extends SourceIndexVisitor { private final ReferencedEntryPool entryPool; diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java index 2a62241d..01e773b3 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java @@ -20,6 +20,7 @@ import com.strobel.assembler.metadata.TypeReference; import com.strobel.decompiler.languages.TextLocation; import com.strobel.decompiler.languages.java.ast.*; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexVisitor.java index 241b9f7a..176f2838 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexVisitor.java @@ -14,8 +14,8 @@ package cuchaz.enigma.analysis; import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.decompiler.languages.java.ast.*; import com.strobel.decompiler.patterns.Pattern; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.ReferencedEntryPool; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; public class SourceIndexVisitor implements IAstVisitor { private final ReferencedEntryPool entryPool; diff --git a/src/main/java/cuchaz/enigma/analysis/TranslationIndex.java b/src/main/java/cuchaz/enigma/analysis/TranslationIndex.java index 3cd80ffd..0c8ed9cd 100644 --- a/src/main/java/cuchaz/enigma/analysis/TranslationIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/TranslationIndex.java @@ -17,6 +17,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import java.util.Collection; import java.util.List; diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java index 24bfe24d..3f61c291 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java @@ -14,6 +14,7 @@ package cuchaz.enigma.bytecode.translators; import cuchaz.enigma.analysis.JarIndex; import cuchaz.enigma.bytecode.AccessFlags; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import org.objectweb.asm.*; import java.util.regex.Pattern; diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index e40becc4..b2192e47 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java @@ -1,6 +1,7 @@ package cuchaz.enigma.bytecode.translators; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import org.objectweb.asm.*; import java.util.Locale; diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java index ed84ef24..76e8c3fb 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassSelector.java +++ b/src/main/java/cuchaz/enigma/gui/ClassSelector.java @@ -17,7 +17,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import cuchaz.enigma.gui.node.ClassSelectorClassNode; import cuchaz.enigma.gui.node.ClassSelectorPackageNode; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.throwables.IllegalNameException; import javax.swing.*; diff --git a/src/main/java/cuchaz/enigma/gui/CodeReader.java b/src/main/java/cuchaz/enigma/gui/CodeReader.java index 97deaf3c..ac45b4a7 100644 --- a/src/main/java/cuchaz/enigma/gui/CodeReader.java +++ b/src/main/java/cuchaz/enigma/gui/CodeReader.java @@ -17,8 +17,8 @@ import cuchaz.enigma.analysis.EntryReference; import cuchaz.enigma.analysis.SourceIndex; import cuchaz.enigma.analysis.Token; import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; -import cuchaz.enigma.mapping.ClassEntry; -import cuchaz.enigma.mapping.Entry; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.Entry; import de.sciss.syntaxpane.DefaultSyntaxKit; import javax.swing.*; diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 5d9f7cbb..cfac8ad8 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java @@ -32,6 +32,7 @@ import cuchaz.enigma.gui.panels.PanelEditor; import cuchaz.enigma.gui.panels.PanelIdentifier; import cuchaz.enigma.gui.panels.PanelObf; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.utils.Utils; import de.sciss.syntaxpane.DefaultSyntaxKit; diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index a5528a73..837cff20 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java @@ -18,6 +18,10 @@ import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.analysis.*; import cuchaz.enigma.gui.dialog.ProgressDialog; import cuchaz.enigma.mapping.*; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.Entry; +import cuchaz.enigma.mapping.entry.FieldEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.throwables.MappingParseException; import cuchaz.enigma.utils.ReadableToken; diff --git a/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java b/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java index 1fd2fa85..34ec26ee 100644 --- a/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java +++ b/src/main/java/cuchaz/enigma/gui/ScoredClassEntry.java @@ -11,7 +11,7 @@ package cuchaz.enigma.gui; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; public class ScoredClassEntry extends ClassEntry { diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java index dc933cd5..a965a8fa 100644 --- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java +++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java @@ -11,7 +11,7 @@ package cuchaz.enigma.gui.node; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import javax.swing.tree.DefaultMutableTreeNode; diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java index 4bbd32bd..9eb8f8f8 100644 --- a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java +++ b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java @@ -2,7 +2,7 @@ package cuchaz.enigma.gui.panels; import cuchaz.enigma.gui.ClassSelector; import cuchaz.enigma.gui.Gui; -import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.entry.ClassEntry; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/cuchaz/enigma/mapping/ClassDefEntry.java b/src/main/java/cuchaz/enigma/mapping/ClassDefEntry.java deleted file mode 100644 index dc1b02e7..00000000 --- a/src/main/java/cuchaz/enigma/mapping/ClassDefEntry.java +++ /dev/null @@ -1,29 +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.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; - -public class ClassDefEntry extends ClassEntry { - private final AccessFlags access; - - public ClassDefEntry(String className, AccessFlags access) { - super(className); - Preconditions.checkNotNull(access, "Class access cannot be null"); - this.access = access; - } - - public AccessFlags getAccess() { - return access; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/ClassEntry.java b/src/main/java/cuchaz/enigma/mapping/ClassEntry.java deleted file mode 100644 index a49f8dd5..00000000 --- a/src/main/java/cuchaz/enigma/mapping/ClassEntry.java +++ /dev/null @@ -1,171 +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.mapping; - -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; - -import java.util.List; - -public class ClassEntry implements Entry { - - private final String name; - - public ClassEntry(String className) { - Preconditions.checkNotNull(className, "Class name cannot be null"); - - if (className.indexOf('.') >= 0) { - throw new IllegalArgumentException("Class name must be in JVM format. ie, path/to/package/class$inner : " + className); - } - - this.name = className; - - if (isInnerClass() && getInnermostClassName().indexOf('/') >= 0) { - throw new IllegalArgumentException("Inner class must not have a package: " + className); - } - } - - public ClassEntry(ClassEntry other) { - this.name = other.name; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public String getClassName() { - return this.name; - } - - @Override - public ClassEntry getOwnerClassEntry() { - return this; - } - - @Override - public ClassEntry updateOwnership(ClassEntry classEntry) { - return classEntry; - } - - @Override - public int hashCode() { - return this.name.hashCode(); - } - - @Override - public boolean equals(Object other) { - return other instanceof ClassEntry && equals((ClassEntry) other); - } - - public boolean equals(ClassEntry other) { - return other != null && this.name.equals(other.name); - } - - @Override - public String toString() { - return this.name; - } - - public boolean isInnerClass() { - return this.name.lastIndexOf('$') >= 0; - } - - public List getClassChainNames() { - return Lists.newArrayList(this.name.split("\\$")); - } - - public List getClassChain() { - List entries = Lists.newArrayList(); - StringBuilder buf = new StringBuilder(); - for (String name : getClassChainNames()) { - if (buf.length() > 0) { - buf.append("$"); - } - buf.append(name); - entries.add(new ClassEntry(buf.toString())); - } - return entries; - } - - public String getOutermostClassName() { - if (isInnerClass()) { - return this.name.substring(0, this.name.indexOf('$')); - } - return this.name; - } - - public ClassEntry getOutermostClassEntry() { - return new ClassEntry(getOutermostClassName()); - } - - public String getOuterClassName() { - if (!isInnerClass()) { - throw new Error("This is not an inner class!"); - } - return this.name.substring(0, this.name.lastIndexOf('$')); - } - - public ClassEntry getOuterClassEntry() { - return new ClassEntry(getOuterClassName()); - } - - public String getInnermostClassName() { - if (!isInnerClass()) { - throw new Error("This is not an inner class!"); - } - return this.name.substring(this.name.lastIndexOf('$') + 1); - } - - public boolean isInDefaultPackage() { - return this.name.indexOf('/') < 0; - } - - public String getPackageName() { - return getPackageName(this.name); - } - - public String getSimpleName() { - int pos = this.name.lastIndexOf('/'); - if (pos > 0) { - return this.name.substring(pos + 1); - } - return this.name; - } - - public static String getPackageName(String name) { - int pos = name.lastIndexOf('/'); - if (pos > 0) { - return name.substring(0, pos); - } - return null; - } - - public ClassEntry buildClassEntry(List classChain) { - assert (classChain.contains(this)); - StringBuilder buf = new StringBuilder(); - for (ClassEntry chainEntry : classChain) { - if (buf.length() == 0) { - buf.append(chainEntry.getName()); - } else { - buf.append("$"); - buf.append(chainEntry.isInnerClass() ? chainEntry.getInnermostClassName() : chainEntry.getSimpleName()); - } - - if (chainEntry == this) { - break; - } - } - return new ClassEntry(buf.toString()); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java index c782250d..d9de5678 100644 --- a/src/main/java/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/ClassMapping.java @@ -12,6 +12,9 @@ package cuchaz.enigma.mapping; import com.google.common.collect.Maps; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.FieldEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.throwables.MappingConflict; import java.util.ArrayList; diff --git a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java index 12832673..c9e2ab49 100644 --- a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java +++ b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java @@ -15,6 +15,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.bytecode.AccessFlags; +import cuchaz.enigma.mapping.entry.*; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/cuchaz/enigma/mapping/Entry.java b/src/main/java/cuchaz/enigma/mapping/Entry.java deleted file mode 100644 index eb783e96..00000000 --- a/src/main/java/cuchaz/enigma/mapping/Entry.java +++ /dev/null @@ -1,22 +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.mapping; - -public interface Entry { - String getName(); - - String getClassName(); - - ClassEntry getOwnerClassEntry(); - - Entry updateOwnership(ClassEntry classEntry); -} diff --git a/src/main/java/cuchaz/enigma/mapping/EntryFactory.java b/src/main/java/cuchaz/enigma/mapping/EntryFactory.java deleted file mode 100644 index c20f6f5f..00000000 --- a/src/main/java/cuchaz/enigma/mapping/EntryFactory.java +++ /dev/null @@ -1,45 +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.mapping; - -import cuchaz.enigma.analysis.JarIndex; - -public class EntryFactory { - public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) { - ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName()); - return obfClassEntry.buildClassEntry(jarIndex.getObfClassChain(obfClassEntry)); - } - - private static ClassEntry getObfClassEntry(ClassMapping classMapping) { - return new ClassEntry(classMapping.getObfFullName()); - } - - public static ClassEntry getDeobfClassEntry(ClassMapping classMapping) { - return new ClassEntry(classMapping.getDeobfName()); - } - - public static FieldEntry getObfFieldEntry(ClassMapping classMapping, FieldMapping fieldMapping) { - return new FieldEntry(getObfClassEntry(classMapping), fieldMapping.getObfName(), fieldMapping.getObfDesc()); - } - - public static MethodEntry getMethodEntry(ClassEntry classEntry, String name, MethodDescriptor desc) { - return new MethodEntry(classEntry, name, desc); - } - - public static MethodEntry getObfMethodEntry(ClassEntry classEntry, MethodMapping methodMapping) { - return getMethodEntry(classEntry, methodMapping.getObfName(), methodMapping.getObfDesc()); - } - - public static MethodEntry getObfMethodEntry(ClassMapping classMapping, MethodMapping methodMapping) { - return getObfMethodEntry(getObfClassEntry(classMapping), methodMapping); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/FieldDefEntry.java b/src/main/java/cuchaz/enigma/mapping/FieldDefEntry.java deleted file mode 100644 index 262c16c5..00000000 --- a/src/main/java/cuchaz/enigma/mapping/FieldDefEntry.java +++ /dev/null @@ -1,34 +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.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; - -public class FieldDefEntry extends FieldEntry { - private final AccessFlags access; - - public FieldDefEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc, AccessFlags access) { - super(ownerEntry, name, desc); - Preconditions.checkNotNull(access, "Field access cannot be null"); - this.access = access; - } - - public AccessFlags getAccess() { - return access; - } - - @Override - public FieldDefEntry updateOwnership(ClassEntry owner) { - return new FieldDefEntry(owner, this.name, this.desc, access); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/FieldEntry.java b/src/main/java/cuchaz/enigma/mapping/FieldEntry.java deleted file mode 100644 index c118ac05..00000000 --- a/src/main/java/cuchaz/enigma/mapping/FieldEntry.java +++ /dev/null @@ -1,76 +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.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.utils.Utils; - -public class FieldEntry implements Entry { - - protected final ClassEntry ownerEntry; - protected final String name; - protected final TypeDescriptor desc; - - // NOTE: this argument order is important for the MethodReader/MethodWriter - public FieldEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc) { - Preconditions.checkNotNull(ownerEntry, "Owner cannot be null"); - Preconditions.checkNotNull(name, "Field name cannot be null"); - Preconditions.checkNotNull(desc, "Field descriptor cannot be null"); - - this.ownerEntry = ownerEntry; - this.name = name; - this.desc = desc; - } - - @Override - public ClassEntry getOwnerClassEntry() { - return this.ownerEntry; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public String getClassName() { - return this.ownerEntry.getName(); - } - - public TypeDescriptor getDesc() { - return this.desc; - } - - @Override - public FieldEntry updateOwnership(ClassEntry owner) { - return new FieldEntry(owner, this.name, this.desc); - } - - @Override - public int hashCode() { - return Utils.combineHashesOrdered(this.ownerEntry, this.name, this.desc); - } - - @Override - public boolean equals(Object other) { - return other instanceof FieldEntry && equals((FieldEntry) other); - } - - public boolean equals(FieldEntry other) { - return this.ownerEntry.equals(other.ownerEntry) && this.name.equals(other.name) && this.desc.equals(other.desc); - } - - @Override - public String toString() { - return this.ownerEntry.getName() + "." + this.name + ":" + this.desc; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/FieldMapping.java b/src/main/java/cuchaz/enigma/mapping/FieldMapping.java index 3c46a37e..8fbe095b 100644 --- a/src/main/java/cuchaz/enigma/mapping/FieldMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/FieldMapping.java @@ -11,6 +11,8 @@ package cuchaz.enigma.mapping; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.FieldEntry; import cuchaz.enigma.throwables.IllegalNameException; public class FieldMapping implements Comparable, MemberMapping { diff --git a/src/main/java/cuchaz/enigma/mapping/LocalVariableDefEntry.java b/src/main/java/cuchaz/enigma/mapping/LocalVariableDefEntry.java deleted file mode 100644 index cc677c55..00000000 --- a/src/main/java/cuchaz/enigma/mapping/LocalVariableDefEntry.java +++ /dev/null @@ -1,75 +0,0 @@ -package cuchaz.enigma.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.utils.Utils; - -/** - * TypeDescriptor... - * Created by Thog - * 19/10/2016 - */ -public class LocalVariableDefEntry extends LocalVariableEntry { - - protected final MethodDefEntry ownerEntry; - protected final TypeDescriptor desc; - - public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name, TypeDescriptor desc) { - super(ownerEntry, index, name); - Preconditions.checkNotNull(desc, "Variable desc cannot be null"); - - this.ownerEntry = ownerEntry; - this.desc = desc; - } - - public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name) { - super(ownerEntry, index, name); - - this.ownerEntry = ownerEntry; - - int namedIndex = getNamedIndex(); - if (namedIndex < 0) { - this.desc = TypeDescriptor.of(ownerEntry.getOwnerClassEntry().getName()); - } else { - this.desc = ownerEntry.getDesc().getArgumentDescs().get(namedIndex); - } - } - - @Override - public MethodDefEntry getOwnerEntry() { - return this.ownerEntry; - } - - public TypeDescriptor getDesc() { - return desc; - } - - public int getNamedIndex() { - // If we're not static, "this" is bound to index 0 - int indexOffset = ownerEntry.getAccess().isStatic() ? 0 : 1; - return index - indexOffset; - } - - @Override - public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { - return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); - } - - @Override - public int hashCode() { - return Utils.combineHashesOrdered(this.ownerEntry, this.desc.hashCode(), this.name.hashCode(), Integer.hashCode(this.index)); - } - - @Override - public boolean equals(Object other) { - return other instanceof LocalVariableDefEntry && equals((LocalVariableDefEntry) other); - } - - public boolean equals(LocalVariableDefEntry other) { - return this.ownerEntry.equals(other.ownerEntry) && this.desc.equals(other.desc) && this.name.equals(other.name) && this.index == other.index; - } - - @Override - public String toString() { - return this.ownerEntry + "(" + this.index + ":" + this.name + ":" + this.desc + ")"; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java b/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java deleted file mode 100644 index dcfd0ff7..00000000 --- a/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java +++ /dev/null @@ -1,81 +0,0 @@ -package cuchaz.enigma.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.utils.Utils; - -/** - * TypeDescriptor... - * Created by Thog - * 19/10/2016 - */ -public class LocalVariableEntry implements Entry { - - protected final MethodEntry ownerEntry; - protected final String name; - protected final int index; - - public LocalVariableEntry(MethodEntry ownerEntry, int index, String name) { - Preconditions.checkNotNull(ownerEntry, "Variable owner cannot be null"); - Preconditions.checkNotNull(name, "Variable name cannot be null"); - Preconditions.checkArgument(index >= 0, "Index must be positive"); - - this.ownerEntry = ownerEntry; - this.name = name; - this.index = index; - } - - public MethodEntry getOwnerEntry() { - return this.ownerEntry; - } - - public int getIndex() { - return index; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public ClassEntry getOwnerClassEntry() { - return this.ownerEntry.getOwnerClassEntry(); - } - - @Override - public String getClassName() { - return this.ownerEntry.getClassName(); - } - - @Override - public LocalVariableEntry updateOwnership(ClassEntry classEntry) { - return new LocalVariableEntry(ownerEntry.updateOwnership(classEntry), index, name); - } - - public String getMethodName() { - return this.ownerEntry.getName(); - } - - public MethodDescriptor getMethodDesc() { - return this.ownerEntry.getDesc(); - } - - @Override - public int hashCode() { - return Utils.combineHashesOrdered(this.ownerEntry, this.name.hashCode(), Integer.hashCode(this.index)); - } - - @Override - public boolean equals(Object other) { - return other instanceof LocalVariableEntry && equals((LocalVariableEntry) other); - } - - public boolean equals(LocalVariableEntry other) { - return this.ownerEntry.equals(other.ownerEntry) && this.name.equals(other.name) && this.index == other.index; - } - - @Override - public String toString() { - return this.ownerEntry + "(" + this.index + ":" + this.name + ")"; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java b/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java index 193c566e..62dbcf31 100644 --- a/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/LocalVariableMapping.java @@ -11,6 +11,9 @@ package cuchaz.enigma.mapping; +import cuchaz.enigma.mapping.entry.LocalVariableEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; + public class LocalVariableMapping implements Comparable { private int index; diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index cc1ec9cc..9b907a9c 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java @@ -16,6 +16,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import cuchaz.enigma.analysis.TranslationIndex; import cuchaz.enigma.bytecode.AccessFlags; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.throwables.MappingConflict; import java.io.File; diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsChecker.java b/src/main/java/cuchaz/enigma/mapping/MappingsChecker.java index 4d5be2f6..a42f255a 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsChecker.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsChecker.java @@ -14,6 +14,10 @@ package cuchaz.enigma.mapping; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import cuchaz.enigma.analysis.JarIndex; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.EntryFactory; +import cuchaz.enigma.mapping.entry.FieldEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import java.util.Map; diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index e215a0fc..85b6d2ab 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java @@ -13,6 +13,7 @@ package cuchaz.enigma.mapping; import com.google.common.collect.Lists; import cuchaz.enigma.analysis.JarIndex; +import cuchaz.enigma.mapping.entry.*; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.throwables.MappingConflict; diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsSRGWriter.java b/src/main/java/cuchaz/enigma/mapping/MappingsSRGWriter.java index 95daa73f..32f0ee9f 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsSRGWriter.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsSRGWriter.java @@ -2,6 +2,7 @@ package cuchaz.enigma.mapping; import com.google.common.base.Charsets; import cuchaz.enigma.analysis.TranslationIndex; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; import java.io.*; import java.util.ArrayList; diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java index e635fa18..e5734a3a 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java @@ -2,6 +2,7 @@ package cuchaz.enigma.mapping; import com.google.common.base.Charsets; import com.google.common.collect.Maps; +import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.throwables.MappingConflict; import cuchaz.enigma.throwables.MappingParseException; diff --git a/src/main/java/cuchaz/enigma/mapping/MemberMapping.java b/src/main/java/cuchaz/enigma/mapping/MemberMapping.java index d4514d42..6effb91f 100644 --- a/src/main/java/cuchaz/enigma/mapping/MemberMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/MemberMapping.java @@ -11,6 +11,9 @@ package cuchaz.enigma.mapping; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.Entry; + public interface MemberMapping { T getObfEntry(ClassEntry classEntry); diff --git a/src/main/java/cuchaz/enigma/mapping/MethodDefEntry.java b/src/main/java/cuchaz/enigma/mapping/MethodDefEntry.java deleted file mode 100644 index d6a160d5..00000000 --- a/src/main/java/cuchaz/enigma/mapping/MethodDefEntry.java +++ /dev/null @@ -1,35 +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.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; - -public class MethodDefEntry extends MethodEntry { - - private final AccessFlags access; - - public MethodDefEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor, AccessFlags access) { - super(classEntry, name, descriptor); - Preconditions.checkNotNull(access, "Method access cannot be null"); - this.access = access; - } - - public AccessFlags getAccess() { - return access; - } - - @Override - public MethodDefEntry updateOwnership(ClassEntry classEntry) { - return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, access); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java b/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java index 210ada07..b56d1d48 100644 --- a/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java +++ b/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java @@ -12,6 +12,7 @@ package cuchaz.enigma.mapping; import com.google.common.collect.Lists; +import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.utils.Utils; import java.util.ArrayList; diff --git a/src/main/java/cuchaz/enigma/mapping/MethodEntry.java b/src/main/java/cuchaz/enigma/mapping/MethodEntry.java deleted file mode 100644 index f8a5ff15..00000000 --- a/src/main/java/cuchaz/enigma/mapping/MethodEntry.java +++ /dev/null @@ -1,79 +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.mapping; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.utils.Utils; - -public class MethodEntry implements Entry { - - protected final ClassEntry classEntry; - protected final String name; - protected final MethodDescriptor descriptor; - - public MethodEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor) { - Preconditions.checkNotNull(classEntry, "Class cannot be null"); - Preconditions.checkNotNull(name, "Method name cannot be null"); - Preconditions.checkNotNull(descriptor, "Method descriptor cannot be null"); - - this.classEntry = classEntry; - this.name = name; - this.descriptor = descriptor; - } - - @Override - public ClassEntry getOwnerClassEntry() { - return this.classEntry; - } - - @Override - public String getName() { - return this.name; - } - - public MethodDescriptor getDesc() { - return this.descriptor; - } - - public boolean isConstructor() { - return name.equals("") || name.equals(""); - } - - @Override - public String getClassName() { - return this.classEntry.getName(); - } - - @Override - public MethodEntry updateOwnership(ClassEntry classEntry) { - return new MethodEntry(new ClassEntry(classEntry.getName()), name, descriptor); - } - - @Override - public int hashCode() { - return Utils.combineHashesOrdered(this.classEntry, this.name, this.descriptor); - } - - @Override - public boolean equals(Object other) { - return other instanceof MethodEntry && equals((MethodEntry) other); - } - - public boolean equals(MethodEntry other) { - return this.classEntry.equals(other.getOwnerClassEntry()) && this.name.equals(other.getName()) && this.descriptor.equals(other.getDesc()); - } - - @Override - public String toString() { - return this.classEntry.getName() + "." + this.name + this.descriptor; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java index 2f7fe53c..363bab80 100644 --- a/src/main/java/cuchaz/enigma/mapping/MethodMapping.java +++ b/src/main/java/cuchaz/enigma/mapping/MethodMapping.java @@ -13,6 +13,8 @@ package cuchaz.enigma.mapping; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; +import cuchaz.enigma.mapping.entry.ClassEntry; +import cuchaz.enigma.mapping.entry.MethodEntry; import cuchaz.enigma.throwables.IllegalNameException; import cuchaz.enigma.throwables.MappingConflict; diff --git a/src/main/java/cuchaz/enigma/mapping/NameValidator.java b/src/main/java/cuchaz/enigma/mapping/NameValidator.java index f178093d..9273c9bc 100644 --- a/src/main/java/cuchaz/enigma/mapping/NameValidator.java +++ b/src/main/java/cuchaz/enigma/mapping/NameValidator.java @@ -11,6 +11,7 @@ package cuchaz.enigma.mapping; +import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.throwables.IllegalNameException; import java.util.Arrays; diff --git a/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java deleted file mode 100644 index 93006564..00000000 --- a/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java +++ /dev/null @@ -1,69 +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.mapping; - -import com.strobel.assembler.metadata.*; -import cuchaz.enigma.bytecode.AccessFlags; - -import java.util.List; - -public class ProcyonEntryFactory { - private final ReferencedEntryPool entryPool; - - public ProcyonEntryFactory(ReferencedEntryPool entryPool) { - this.entryPool = entryPool; - } - - private String getErasedSignature(MemberReference def) { - if (!(def instanceof MethodReference)) - return def.getErasedSignature(); - MethodReference methodReference = (MethodReference) def; - StringBuilder builder = new StringBuilder("("); - for (ParameterDefinition param : methodReference.getParameters()) { - TypeReference paramType = param.getParameterType(); - if (paramType.getErasedSignature().equals("Ljava/lang/Object;") && paramType.hasExtendsBound() && paramType.getExtendsBound() instanceof CompoundTypeReference) { - List interfaces = ((CompoundTypeReference) paramType.getExtendsBound()).getInterfaces(); - interfaces.forEach((inter) -> builder.append(inter.getErasedSignature())); - } else - builder.append(paramType.getErasedSignature()); - } - builder.append(")"); - - TypeReference returnType = methodReference.getReturnType(); - if (returnType.getErasedSignature().equals("Ljava/lang/Object;") && returnType.hasExtendsBound() && returnType.getExtendsBound() instanceof CompoundTypeReference) { - List interfaces = ((CompoundTypeReference) returnType.getExtendsBound()).getInterfaces(); - interfaces.forEach((inter) -> builder.append(inter.getErasedSignature())); - } else - builder.append(returnType.getErasedSignature()); - return builder.toString(); - } - - public FieldEntry getFieldEntry(MemberReference def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return entryPool.getField(classEntry, def.getName(), def.getErasedSignature()); - } - - public FieldDefEntry getFieldDefEntry(FieldDefinition def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return new FieldDefEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); - } - - public MethodEntry getMethodEntry(MemberReference def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return entryPool.getMethod(classEntry, def.getName(), getErasedSignature(def)); - } - - public MethodDefEntry getMethodDefEntry(MethodDefinition def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/ReferencedEntryPool.java b/src/main/java/cuchaz/enigma/mapping/ReferencedEntryPool.java deleted file mode 100644 index 2abc76c6..00000000 --- a/src/main/java/cuchaz/enigma/mapping/ReferencedEntryPool.java +++ /dev/null @@ -1,50 +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.mapping; - -import java.util.HashMap; -import java.util.Map; - -public class ReferencedEntryPool { - private final Map classEntries = new HashMap<>(); - private final Map> methodEntries = new HashMap<>(); - private final Map> fieldEntries = new HashMap<>(); - - public ClassEntry getClass(String name) { - return this.classEntries.computeIfAbsent(name, s -> new ClassEntry(name)); - } - - public MethodEntry getMethod(ClassEntry ownerEntry, String name, String desc) { - return getMethod(ownerEntry, name, new MethodDescriptor(desc)); - } - - public MethodEntry getMethod(ClassEntry ownerEntry, String name, MethodDescriptor desc) { - String key = name + desc.toString(); - return getClassMethods(ownerEntry.getName()).computeIfAbsent(key, s -> new MethodEntry(ownerEntry, name, desc)); - } - - public FieldEntry getField(ClassEntry ownerEntry, String name, String desc) { - return getField(ownerEntry, name, new TypeDescriptor(desc)); - } - - public FieldEntry getField(ClassEntry ownerEntry, String name, TypeDescriptor desc) { - return getClassFields(ownerEntry.getName()).computeIfAbsent(name, s -> new FieldEntry(ownerEntry, name, desc)); - } - - private Map getClassMethods(String name) { - return methodEntries.computeIfAbsent(name, s -> new HashMap<>()); - } - - private Map getClassFields(String name) { - return fieldEntries.computeIfAbsent(name, s -> new HashMap<>()); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/Translator.java b/src/main/java/cuchaz/enigma/mapping/Translator.java index 59bdf1a3..ab55a02d 100644 --- a/src/main/java/cuchaz/enigma/mapping/Translator.java +++ b/src/main/java/cuchaz/enigma/mapping/Translator.java @@ -11,6 +11,8 @@ package cuchaz.enigma.mapping; +import cuchaz.enigma.mapping.entry.*; + public interface Translator { ClassEntry getTranslatedClass(ClassEntry entry); diff --git a/src/main/java/cuchaz/enigma/mapping/Type.java b/src/main/java/cuchaz/enigma/mapping/Type.java deleted file mode 100644 index 609bd64e..00000000 --- a/src/main/java/cuchaz/enigma/mapping/Type.java +++ /dev/null @@ -1,235 +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.mapping; - -import com.google.common.collect.Maps; - -import java.util.Map; - -public class Type { - - protected String name; - - public Type(String name) { - - // don't deal with generics - // this is just for raw jvm types - if (name.charAt(0) == 'T' || name.indexOf('<') >= 0 || name.indexOf('>') >= 0) { - throw new IllegalArgumentException("don't use with generic types or templates: " + name); - } - - this.name = name; - } - - public Type(Type other, ClassNameReplacer replacer) { - this.name = other.name; - if (other.isClass()) { - String replacedName = replacer.replace(other.getClassEntry().getClassName()); - if (replacedName != null) { - this.name = "L" + replacedName + ";"; - } - } else if (other.isArray() && other.hasClass()) { - String replacedName = replacer.replace(other.getClassEntry().getClassName()); - if (replacedName != null) { - this.name = Type.getArrayPrefix(other.getArrayDimension()) + "L" + replacedName + ";"; - } - } - } - - public static String parseFirst(String in) { - - if (in == null || in.length() <= 0) { - throw new IllegalArgumentException("No type to parse, input is empty!"); - } - - // read one type from the input - - char c = in.charAt(0); - - // first check for void - if (c == 'V') { - return "V"; - } - - // then check for primitives - Primitive primitive = Primitive.get(c); - if (primitive != null) { - return in.substring(0, 1); - } - - // then check for classes - if (c == 'L') { - return readClass(in); - } - - // then check for templates - if (c == 'T') { - return readClass(in); - } - - // then check for arrays - int dim = countArrayDimension(in); - if (dim > 0) { - String arrayType = Type.parseFirst(in.substring(dim)); - return in.substring(0, dim + arrayType.length()); - } - - throw new IllegalArgumentException("don't know how to parse: " + in); - } - - private static String getArrayPrefix(int dimension) { - StringBuilder buf = new StringBuilder(); - for (int i = 0; i < dimension; i++) { - buf.append("["); - } - return buf.toString(); - } - - private static int countArrayDimension(String in) { - int i = 0; - while (i < in.length() && in.charAt(i) == '[') - i++; - return i; - } - - private static String readClass(String in) { - // read all the characters in the buffer until we hit a ';' - // include the parameters too - StringBuilder buf = new StringBuilder(); - int depth = 0; - for (int i = 0; i < in.length(); i++) { - char c = in.charAt(i); - buf.append(c); - - if (c == '<') { - depth++; - } else if (c == '>') { - depth--; - } else if (depth == 0 && c == ';') { - return buf.toString(); - } - } - return null; - } - - @Override - public String toString() { - return this.name; - } - - public boolean isVoid() { - return this.name.length() == 1 && this.name.charAt(0) == 'V'; - } - - public boolean isPrimitive() { - return this.name.length() == 1 && Primitive.get(this.name.charAt(0)) != null; - } - - public Primitive getPrimitive() { - if (!isPrimitive()) { - throw new IllegalStateException("not a primitive"); - } - return Primitive.get(this.name.charAt(0)); - } - - public boolean isClass() { - return this.name.charAt(0) == 'L' && this.name.charAt(this.name.length() - 1) == ';'; - } - - public ClassEntry getClassEntry() { - if (isClass()) { - String name = this.name.substring(1, this.name.length() - 1); - - int pos = name.indexOf('<'); - if (pos >= 0) { - // remove the parameters from the class name - name = name.substring(0, pos); - } - - return new ClassEntry(name); - - } else if (isArray() && getArrayType().isClass()) { - return getArrayType().getClassEntry(); - } else { - throw new IllegalStateException("type doesn't have a class"); - } - } - - public boolean isArray() { - return this.name.charAt(0) == '['; - } - - public int getArrayDimension() { - if (!isArray()) { - throw new IllegalStateException("not an array"); - } - return countArrayDimension(this.name); - } - - public Type getArrayType() { - if (!isArray()) { - throw new IllegalStateException("not an array"); - } - return new Type(this.name.substring(getArrayDimension(), this.name.length())); - } - - public boolean hasClass() { - return isClass() || (isArray() && getArrayType().hasClass()); - } - - @Override - public boolean equals(Object other) { - return other instanceof Type && equals((Type) other); - } - - public boolean equals(Type other) { - return this.name.equals(other.name); - } - - public int hashCode() { - return this.name.hashCode(); - } - - public enum Primitive { - Byte('B'), - Character('C'), - Short('S'), - Integer('I'), - Long('J'), - Float('F'), - Double('D'), - Boolean('Z'); - - private static final Map lookup; - - static { - lookup = Maps.newTreeMap(); - for (Primitive val : values()) { - lookup.put(val.getCode(), val); - } - } - - private char code; - - Primitive(char code) { - this.code = code; - } - - public static Primitive get(char code) { - return lookup.get(code); - } - - public char getCode() { - return this.code; - } - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java index 9c0fe6d5..58fa6513 100644 --- a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java +++ b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java @@ -12,6 +12,7 @@ package cuchaz.enigma.mapping; import com.google.common.collect.Maps; +import cuchaz.enigma.mapping.entry.ClassEntry; import java.util.Map; import java.util.function.Function; diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java new file mode 100644 index 00000000..75e7f1bd --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.bytecode.AccessFlags; + +public class ClassDefEntry extends ClassEntry { + private final AccessFlags access; + + public ClassDefEntry(String className, AccessFlags access) { + super(className); + Preconditions.checkNotNull(access, "Class access cannot be null"); + this.access = access; + } + + public AccessFlags getAccess() { + return access; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java new file mode 100644 index 00000000..fc604d82 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + +import java.util.List; + +public class ClassEntry implements Entry { + + private final String name; + + public ClassEntry(String className) { + Preconditions.checkNotNull(className, "Class name cannot be null"); + + if (className.indexOf('.') >= 0) { + throw new IllegalArgumentException("Class name must be in JVM format. ie, path/to/package/class$inner : " + className); + } + + this.name = className; + + if (isInnerClass() && getInnermostClassName().indexOf('/') >= 0) { + throw new IllegalArgumentException("Inner class must not have a package: " + className); + } + } + + public ClassEntry(ClassEntry other) { + this.name = other.name; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getClassName() { + return this.name; + } + + @Override + public ClassEntry getOwnerClassEntry() { + return this; + } + + @Override + public ClassEntry updateOwnership(ClassEntry classEntry) { + return classEntry; + } + + @Override + public int hashCode() { + return this.name.hashCode(); + } + + @Override + public boolean equals(Object other) { + return other instanceof ClassEntry && equals((ClassEntry) other); + } + + public boolean equals(ClassEntry other) { + return other != null && this.name.equals(other.name); + } + + @Override + public String toString() { + return this.name; + } + + public boolean isInnerClass() { + return this.name.lastIndexOf('$') >= 0; + } + + public List getClassChainNames() { + return Lists.newArrayList(this.name.split("\\$")); + } + + public List getClassChain() { + List entries = Lists.newArrayList(); + StringBuilder buf = new StringBuilder(); + for (String name : getClassChainNames()) { + if (buf.length() > 0) { + buf.append("$"); + } + buf.append(name); + entries.add(new ClassEntry(buf.toString())); + } + return entries; + } + + public String getOutermostClassName() { + if (isInnerClass()) { + return this.name.substring(0, this.name.indexOf('$')); + } + return this.name; + } + + public ClassEntry getOutermostClassEntry() { + return new ClassEntry(getOutermostClassName()); + } + + public String getOuterClassName() { + if (!isInnerClass()) { + throw new Error("This is not an inner class!"); + } + return this.name.substring(0, this.name.lastIndexOf('$')); + } + + public ClassEntry getOuterClassEntry() { + return new ClassEntry(getOuterClassName()); + } + + public String getInnermostClassName() { + if (!isInnerClass()) { + throw new Error("This is not an inner class!"); + } + return this.name.substring(this.name.lastIndexOf('$') + 1); + } + + public boolean isInDefaultPackage() { + return this.name.indexOf('/') < 0; + } + + public String getPackageName() { + return getPackageName(this.name); + } + + public String getSimpleName() { + int pos = this.name.lastIndexOf('/'); + if (pos > 0) { + return this.name.substring(pos + 1); + } + return this.name; + } + + public static String getPackageName(String name) { + int pos = name.lastIndexOf('/'); + if (pos > 0) { + return name.substring(0, pos); + } + return null; + } + + public ClassEntry buildClassEntry(List classChain) { + assert (classChain.contains(this)); + StringBuilder buf = new StringBuilder(); + for (ClassEntry chainEntry : classChain) { + if (buf.length() == 0) { + buf.append(chainEntry.getName()); + } else { + buf.append("$"); + buf.append(chainEntry.isInnerClass() ? chainEntry.getInnermostClassName() : chainEntry.getSimpleName()); + } + + if (chainEntry == this) { + break; + } + } + return new ClassEntry(buf.toString()); + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/Entry.java b/src/main/java/cuchaz/enigma/mapping/entry/Entry.java new file mode 100644 index 00000000..b612140f --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/Entry.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * 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.mapping.entry; + +public interface Entry { + String getName(); + + String getClassName(); + + ClassEntry getOwnerClassEntry(); + + Entry updateOwnership(ClassEntry classEntry); +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java b/src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java new file mode 100644 index 00000000..5bd159f4 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * 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.mapping.entry; + +import cuchaz.enigma.analysis.JarIndex; +import cuchaz.enigma.mapping.ClassMapping; +import cuchaz.enigma.mapping.FieldMapping; +import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.mapping.MethodMapping; + +public class EntryFactory { + public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) { + ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName()); + return obfClassEntry.buildClassEntry(jarIndex.getObfClassChain(obfClassEntry)); + } + + private static ClassEntry getObfClassEntry(ClassMapping classMapping) { + return new ClassEntry(classMapping.getObfFullName()); + } + + public static ClassEntry getDeobfClassEntry(ClassMapping classMapping) { + return new ClassEntry(classMapping.getDeobfName()); + } + + public static FieldEntry getObfFieldEntry(ClassMapping classMapping, FieldMapping fieldMapping) { + return new FieldEntry(getObfClassEntry(classMapping), fieldMapping.getObfName(), fieldMapping.getObfDesc()); + } + + public static MethodEntry getMethodEntry(ClassEntry classEntry, String name, MethodDescriptor desc) { + return new MethodEntry(classEntry, name, desc); + } + + public static MethodEntry getObfMethodEntry(ClassEntry classEntry, MethodMapping methodMapping) { + return getMethodEntry(classEntry, methodMapping.getObfName(), methodMapping.getObfDesc()); + } + + public static MethodEntry getObfMethodEntry(ClassMapping classMapping, MethodMapping methodMapping) { + return getObfMethodEntry(getObfClassEntry(classMapping), methodMapping); + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java new file mode 100644 index 00000000..78ea5f76 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.bytecode.AccessFlags; +import cuchaz.enigma.mapping.TypeDescriptor; + +public class FieldDefEntry extends FieldEntry { + private final AccessFlags access; + + public FieldDefEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc, AccessFlags access) { + super(ownerEntry, name, desc); + Preconditions.checkNotNull(access, "Field access cannot be null"); + this.access = access; + } + + public AccessFlags getAccess() { + return access; + } + + @Override + public FieldDefEntry updateOwnership(ClassEntry owner) { + return new FieldDefEntry(owner, this.name, this.desc, access); + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java new file mode 100644 index 00000000..b6e1554d --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.mapping.TypeDescriptor; +import cuchaz.enigma.utils.Utils; + +public class FieldEntry implements Entry { + + protected final ClassEntry ownerEntry; + protected final String name; + protected final TypeDescriptor desc; + + // NOTE: this argument order is important for the MethodReader/MethodWriter + public FieldEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc) { + Preconditions.checkNotNull(ownerEntry, "Owner cannot be null"); + Preconditions.checkNotNull(name, "Field name cannot be null"); + Preconditions.checkNotNull(desc, "Field descriptor cannot be null"); + + this.ownerEntry = ownerEntry; + this.name = name; + this.desc = desc; + } + + @Override + public ClassEntry getOwnerClassEntry() { + return this.ownerEntry; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getClassName() { + return this.ownerEntry.getName(); + } + + public TypeDescriptor getDesc() { + return this.desc; + } + + @Override + public FieldEntry updateOwnership(ClassEntry owner) { + return new FieldEntry(owner, this.name, this.desc); + } + + @Override + public int hashCode() { + return Utils.combineHashesOrdered(this.ownerEntry, this.name, this.desc); + } + + @Override + public boolean equals(Object other) { + return other instanceof FieldEntry && equals((FieldEntry) other); + } + + public boolean equals(FieldEntry other) { + return this.ownerEntry.equals(other.ownerEntry) && this.name.equals(other.name) && this.desc.equals(other.desc); + } + + @Override + public String toString() { + return this.ownerEntry.getName() + "." + this.name + ":" + this.desc; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java new file mode 100644 index 00000000..0c4f3c17 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java @@ -0,0 +1,76 @@ +package cuchaz.enigma.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.mapping.TypeDescriptor; +import cuchaz.enigma.utils.Utils; + +/** + * TypeDescriptor... + * Created by Thog + * 19/10/2016 + */ +public class LocalVariableDefEntry extends LocalVariableEntry { + + protected final MethodDefEntry ownerEntry; + protected final TypeDescriptor desc; + + public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name, TypeDescriptor desc) { + super(ownerEntry, index, name); + Preconditions.checkNotNull(desc, "Variable desc cannot be null"); + + this.ownerEntry = ownerEntry; + this.desc = desc; + } + + public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name) { + super(ownerEntry, index, name); + + this.ownerEntry = ownerEntry; + + int namedIndex = getNamedIndex(); + if (namedIndex < 0) { + this.desc = TypeDescriptor.of(ownerEntry.getOwnerClassEntry().getName()); + } else { + this.desc = ownerEntry.getDesc().getArgumentDescs().get(namedIndex); + } + } + + @Override + public MethodDefEntry getOwnerEntry() { + return this.ownerEntry; + } + + public TypeDescriptor getDesc() { + return desc; + } + + public int getNamedIndex() { + // If we're not static, "this" is bound to index 0 + int indexOffset = ownerEntry.getAccess().isStatic() ? 0 : 1; + return index - indexOffset; + } + + @Override + public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { + return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, desc); + } + + @Override + public int hashCode() { + return Utils.combineHashesOrdered(this.ownerEntry, this.desc.hashCode(), this.name.hashCode(), Integer.hashCode(this.index)); + } + + @Override + public boolean equals(Object other) { + return other instanceof LocalVariableDefEntry && equals((LocalVariableDefEntry) other); + } + + public boolean equals(LocalVariableDefEntry other) { + return this.ownerEntry.equals(other.ownerEntry) && this.desc.equals(other.desc) && this.name.equals(other.name) && this.index == other.index; + } + + @Override + public String toString() { + return this.ownerEntry + "(" + this.index + ":" + this.name + ":" + this.desc + ")"; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java new file mode 100644 index 00000000..a794d0a0 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java @@ -0,0 +1,82 @@ +package cuchaz.enigma.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.utils.Utils; + +/** + * TypeDescriptor... + * Created by Thog + * 19/10/2016 + */ +public class LocalVariableEntry implements Entry { + + protected final MethodEntry ownerEntry; + protected final String name; + protected final int index; + + public LocalVariableEntry(MethodEntry ownerEntry, int index, String name) { + Preconditions.checkNotNull(ownerEntry, "Variable owner cannot be null"); + Preconditions.checkNotNull(name, "Variable name cannot be null"); + Preconditions.checkArgument(index >= 0, "Index must be positive"); + + this.ownerEntry = ownerEntry; + this.name = name; + this.index = index; + } + + public MethodEntry getOwnerEntry() { + return this.ownerEntry; + } + + public int getIndex() { + return index; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public ClassEntry getOwnerClassEntry() { + return this.ownerEntry.getOwnerClassEntry(); + } + + @Override + public String getClassName() { + return this.ownerEntry.getClassName(); + } + + @Override + public LocalVariableEntry updateOwnership(ClassEntry classEntry) { + return new LocalVariableEntry(ownerEntry.updateOwnership(classEntry), index, name); + } + + public String getMethodName() { + return this.ownerEntry.getName(); + } + + public MethodDescriptor getMethodDesc() { + return this.ownerEntry.getDesc(); + } + + @Override + public int hashCode() { + return Utils.combineHashesOrdered(this.ownerEntry, this.name.hashCode(), Integer.hashCode(this.index)); + } + + @Override + public boolean equals(Object other) { + return other instanceof LocalVariableEntry && equals((LocalVariableEntry) other); + } + + public boolean equals(LocalVariableEntry other) { + return this.ownerEntry.equals(other.ownerEntry) && this.name.equals(other.name) && this.index == other.index; + } + + @Override + public String toString() { + return this.ownerEntry + "(" + this.index + ":" + this.name + ")"; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java new file mode 100644 index 00000000..1d2c094d --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.bytecode.AccessFlags; +import cuchaz.enigma.mapping.MethodDescriptor; + +public class MethodDefEntry extends MethodEntry { + + private final AccessFlags access; + + public MethodDefEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor, AccessFlags access) { + super(classEntry, name, descriptor); + Preconditions.checkNotNull(access, "Method access cannot be null"); + this.access = access; + } + + public AccessFlags getAccess() { + return access; + } + + @Override + public MethodDefEntry updateOwnership(ClassEntry classEntry) { + return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, access); + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java new file mode 100644 index 00000000..1abc5b12 --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.google.common.base.Preconditions; +import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.utils.Utils; + +public class MethodEntry implements Entry { + + protected final ClassEntry classEntry; + protected final String name; + protected final MethodDescriptor descriptor; + + public MethodEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor) { + Preconditions.checkNotNull(classEntry, "Class cannot be null"); + Preconditions.checkNotNull(name, "Method name cannot be null"); + Preconditions.checkNotNull(descriptor, "Method descriptor cannot be null"); + + this.classEntry = classEntry; + this.name = name; + this.descriptor = descriptor; + } + + @Override + public ClassEntry getOwnerClassEntry() { + return this.classEntry; + } + + @Override + public String getName() { + return this.name; + } + + public MethodDescriptor getDesc() { + return this.descriptor; + } + + public boolean isConstructor() { + return name.equals("") || name.equals(""); + } + + @Override + public String getClassName() { + return this.classEntry.getName(); + } + + @Override + public MethodEntry updateOwnership(ClassEntry classEntry) { + return new MethodEntry(new ClassEntry(classEntry.getName()), name, descriptor); + } + + @Override + public int hashCode() { + return Utils.combineHashesOrdered(this.classEntry, this.name, this.descriptor); + } + + @Override + public boolean equals(Object other) { + return other instanceof MethodEntry && equals((MethodEntry) other); + } + + public boolean equals(MethodEntry other) { + return this.classEntry.equals(other.getOwnerClassEntry()) && this.name.equals(other.getName()) && this.descriptor.equals(other.getDesc()); + } + + @Override + public String toString() { + return this.classEntry.getName() + "." + this.name + this.descriptor; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java new file mode 100644 index 00000000..e42a334e --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * 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.mapping.entry; + +import com.strobel.assembler.metadata.*; +import cuchaz.enigma.bytecode.AccessFlags; +import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.mapping.TypeDescriptor; + +import java.util.List; + +public class ProcyonEntryFactory { + private final ReferencedEntryPool entryPool; + + public ProcyonEntryFactory(ReferencedEntryPool entryPool) { + this.entryPool = entryPool; + } + + private String getErasedSignature(MemberReference def) { + if (!(def instanceof MethodReference)) + return def.getErasedSignature(); + MethodReference methodReference = (MethodReference) def; + StringBuilder builder = new StringBuilder("("); + for (ParameterDefinition param : methodReference.getParameters()) { + TypeReference paramType = param.getParameterType(); + if (paramType.getErasedSignature().equals("Ljava/lang/Object;") && paramType.hasExtendsBound() && paramType.getExtendsBound() instanceof CompoundTypeReference) { + List interfaces = ((CompoundTypeReference) paramType.getExtendsBound()).getInterfaces(); + interfaces.forEach((inter) -> builder.append(inter.getErasedSignature())); + } else + builder.append(paramType.getErasedSignature()); + } + builder.append(")"); + + TypeReference returnType = methodReference.getReturnType(); + if (returnType.getErasedSignature().equals("Ljava/lang/Object;") && returnType.hasExtendsBound() && returnType.getExtendsBound() instanceof CompoundTypeReference) { + List interfaces = ((CompoundTypeReference) returnType.getExtendsBound()).getInterfaces(); + interfaces.forEach((inter) -> builder.append(inter.getErasedSignature())); + } else + builder.append(returnType.getErasedSignature()); + return builder.toString(); + } + + public FieldEntry getFieldEntry(MemberReference def) { + ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); + return entryPool.getField(classEntry, def.getName(), def.getErasedSignature()); + } + + public FieldDefEntry getFieldDefEntry(FieldDefinition def) { + ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); + return new FieldDefEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); + } + + public MethodEntry getMethodEntry(MemberReference def) { + ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); + return entryPool.getMethod(classEntry, def.getName(), getErasedSignature(def)); + } + + public MethodDefEntry getMethodDefEntry(MethodDefinition def) { + ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); + return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java b/src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java new file mode 100644 index 00000000..338d209e --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * 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.mapping.entry; + +import cuchaz.enigma.mapping.MethodDescriptor; +import cuchaz.enigma.mapping.TypeDescriptor; + +import java.util.HashMap; +import java.util.Map; + +public class ReferencedEntryPool { + private final Map classEntries = new HashMap<>(); + private final Map> methodEntries = new HashMap<>(); + private final Map> fieldEntries = new HashMap<>(); + + public ClassEntry getClass(String name) { + return this.classEntries.computeIfAbsent(name, s -> new ClassEntry(name)); + } + + public MethodEntry getMethod(ClassEntry ownerEntry, String name, String desc) { + return getMethod(ownerEntry, name, new MethodDescriptor(desc)); + } + + public MethodEntry getMethod(ClassEntry ownerEntry, String name, MethodDescriptor desc) { + String key = name + desc.toString(); + return getClassMethods(ownerEntry.getName()).computeIfAbsent(key, s -> new MethodEntry(ownerEntry, name, desc)); + } + + public FieldEntry getField(ClassEntry ownerEntry, String name, String desc) { + return getField(ownerEntry, name, new TypeDescriptor(desc)); + } + + public FieldEntry getField(ClassEntry ownerEntry, String name, TypeDescriptor desc) { + return getClassFields(ownerEntry.getName()).computeIfAbsent(name, s -> new FieldEntry(ownerEntry, name, desc)); + } + + private Map getClassMethods(String name) { + return methodEntries.computeIfAbsent(name, s -> new HashMap<>()); + } + + private Map getClassFields(String name) { + return fieldEntries.computeIfAbsent(name, s -> new HashMap<>()); + } +} -- cgit v1.2.3