From 406b9a89318473571d27de60b8aa1b51f84af245 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 19 May 2018 17:06:26 +0200 Subject: Package updates --- .../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 +++++ 40 files changed, 809 insertions(+), 1001 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/enigma/mapping') 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 dc1b02e..0000000 --- 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 a49f8dd..0000000 --- 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
- * 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 c20f6f5..0000000
--- 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 262c16c..0000000
--- 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 c118ac0..0000000
--- 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 3c46a37..8fbe095 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
- * 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 210ada0..b56d1d4 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 f8a5ff1..0000000
--- 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("
- * 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
- * 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
- * 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
+ * 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 0000000..fc604d8
--- /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
+ * 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 0000000..5bd159f
--- /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 0000000..78ea5f7
--- /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 0000000..b6e1554
--- /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 0000000..0c4f3c1
--- /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 0000000..a794d0a
--- /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 0000000..1d2c094
--- /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 0000000..1abc5b1
--- /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("
+ * 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
+ * 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