From 00fcd0550fcdda621c2e4662f6ddd55ce673b931 Mon Sep 17 00:00:00 2001 From: Gegy Date: Thu, 24 Jan 2019 14:48:32 +0200 Subject: [WIP] Mapping rework (#91) * Move packages * Mapping & entry refactor: first pass * Fix deobf -> obf tree remapping * Resolve various issues * Give all entries the potential for parents and treat inner classes as children * Deobf UI tree elements * Tests pass * Sort mapping output * Fix delta tracking * Index separation and first pass for #97 * Keep track of remapped jar index * Fix child entries not being remapped * Drop non-root entries * Track dropped mappings * Fix enigma mapping ordering * EntryTreeNode interface * Small tweaks * Naive full index remap on rename * Entries can resolve to more than one root entry * Support alternative resolution strategies * Bridge method resolution * Tests pass * Fix mappings being used where there are none * Fix methods with different descriptors being considered unique. closes #89 --- .../cuchaz/enigma/mapping/entry/ClassDefEntry.java | 38 ----- .../cuchaz/enigma/mapping/entry/ClassEntry.java | 175 --------------------- .../java/cuchaz/enigma/mapping/entry/DefEntry.java | 7 - .../java/cuchaz/enigma/mapping/entry/Entry.java | 22 --- .../cuchaz/enigma/mapping/entry/EntryFactory.java | 49 ------ .../cuchaz/enigma/mapping/entry/FieldDefEntry.java | 44 ------ .../cuchaz/enigma/mapping/entry/FieldEntry.java | 77 --------- .../mapping/entry/LocalVariableDefEntry.java | 61 ------- .../enigma/mapping/entry/LocalVariableEntry.java | 93 ----------- .../enigma/mapping/entry/MethodDefEntry.java | 61 ------- .../cuchaz/enigma/mapping/entry/MethodEntry.java | 80 ---------- .../enigma/mapping/entry/ProcyonEntryFactory.java | 48 ------ .../enigma/mapping/entry/ReferencedEntryPool.java | 59 ------- 13 files changed, 814 deletions(-) delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/DefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/Entry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java delete mode 100644 src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java (limited to 'src/main/java/cuchaz/enigma/mapping/entry') diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java deleted file mode 100644 index df72e7e..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java +++ /dev/null @@ -1,38 +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.entry; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; -import cuchaz.enigma.mapping.Signature; - -public class ClassDefEntry extends ClassEntry implements DefEntry { - private final AccessFlags access; - private final Signature signature; - - public ClassDefEntry(String className, Signature signature, AccessFlags access) { - super(className); - Preconditions.checkNotNull(signature, "Class signature cannot be null"); - Preconditions.checkNotNull(access, "Class access cannot be null"); - this.signature = signature; - this.access = access; - } - - public Signature getSignature() { - return signature; - } - - @Override - 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 deleted file mode 100644 index c795825..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/ClassEntry.java +++ /dev/null @@ -1,175 +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.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 isArray() { - return this.name.lastIndexOf('[') >= 0; - } - - 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/DefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/DefEntry.java deleted file mode 100644 index 43ad027..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/DefEntry.java +++ /dev/null @@ -1,7 +0,0 @@ -package cuchaz.enigma.mapping.entry; - -import cuchaz.enigma.bytecode.AccessFlags; - -public interface DefEntry extends Entry { - AccessFlags getAccess(); -} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/Entry.java b/src/main/java/cuchaz/enigma/mapping/entry/Entry.java deleted file mode 100644 index b612140..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/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.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 deleted file mode 100644 index 5bd159f..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/EntryFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.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 deleted file mode 100644 index 223410f..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java +++ /dev/null @@ -1,44 +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.entry; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; -import cuchaz.enigma.mapping.Signature; -import cuchaz.enigma.mapping.TypeDescriptor; - -public class FieldDefEntry extends FieldEntry implements DefEntry { - private final AccessFlags access; - private final Signature signature; - - public FieldDefEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc, Signature signature, AccessFlags access) { - super(ownerEntry, name, desc); - Preconditions.checkNotNull(access, "Field access cannot be null"); - Preconditions.checkNotNull(signature, "Field signature cannot be null"); - this.access = access; - this.signature = signature; - } - - @Override - public AccessFlags getAccess() { - return access; - } - - public Signature getSignature() { - return signature; - } - - @Override - public FieldDefEntry updateOwnership(ClassEntry owner) { - return new FieldDefEntry(owner, this.name, this.desc, signature, access); - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java deleted file mode 100644 index b6e1554..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/FieldEntry.java +++ /dev/null @@ -1,77 +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.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 deleted file mode 100644 index d186664..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableDefEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -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) { - this(ownerEntry, index, name, true, desc); - } - - public LocalVariableDefEntry(MethodDefEntry ownerEntry, int index, String name, boolean parameter, TypeDescriptor desc) { - super(ownerEntry, index, name, parameter); - Preconditions.checkNotNull(desc, "Variable desc cannot be null"); - - this.ownerEntry = ownerEntry; - this.desc = desc; - } - - @Override - public MethodDefEntry getOwnerEntry() { - return this.ownerEntry; - } - - public TypeDescriptor getDesc() { - return desc; - } - - @Override - public LocalVariableDefEntry updateOwnership(ClassEntry classEntry) { - return new LocalVariableDefEntry(ownerEntry.updateOwnership(classEntry), index, name, parameter, 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 deleted file mode 100644 index 3507b25..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/LocalVariableEntry.java +++ /dev/null @@ -1,93 +0,0 @@ -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; - protected final boolean parameter; - - @Deprecated - public LocalVariableEntry(MethodEntry ownerEntry, int index, String name) { - this(ownerEntry, index, name, true); - } - - public LocalVariableEntry(MethodEntry ownerEntry, int index, String name, boolean parameter) { - 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; - this.parameter = parameter; - } - - public boolean isParameter() { - return this.parameter; - } - - 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, parameter); - } - - 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 deleted file mode 100644 index fa9e668..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java +++ /dev/null @@ -1,61 +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.entry; - -import com.google.common.base.Preconditions; -import cuchaz.enigma.bytecode.AccessFlags; -import cuchaz.enigma.mapping.MethodDescriptor; -import cuchaz.enigma.mapping.Signature; - -public class MethodDefEntry extends MethodEntry implements DefEntry { - - private final AccessFlags access; - private final Signature signature; - - public MethodDefEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor, Signature signature, AccessFlags access) { - super(classEntry, name, descriptor); - Preconditions.checkNotNull(access, "Method access cannot be null"); - Preconditions.checkNotNull(signature, "Method signature cannot be null"); - this.access = access; - this.signature = signature; - } - - @Override - public AccessFlags getAccess() { - return access; - } - - public Signature getSignature() { - return signature; - } - - @Override - public MethodDefEntry updateOwnership(ClassEntry classEntry) { - return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, signature, access); - } - - public int getArgumentIndex(ClassDefEntry ownerEntry, int localVariableIndex) { - int argumentIndex = localVariableIndex; - - // Enum constructors have an implicit "name" and "ordinal" parameter as well as "this" - if (ownerEntry.getAccess().isEnum() && getName().startsWith("<")) { - argumentIndex -= 2; - } - - // If we're not static, "this" is bound to index 0 - if (!getAccess().isStatic()) { - argumentIndex -= 1; - } - - return argumentIndex; - } -} diff --git a/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java deleted file mode 100644 index 1abc5b1..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/MethodEntry.java +++ /dev/null @@ -1,80 +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.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 deleted file mode 100644 index 73770c5..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java +++ /dev/null @@ -1,48 +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.entry; - -import com.strobel.assembler.metadata.FieldDefinition; -import com.strobel.assembler.metadata.MemberReference; -import com.strobel.assembler.metadata.MethodDefinition; -import cuchaz.enigma.bytecode.AccessFlags; -import cuchaz.enigma.mapping.MethodDescriptor; -import cuchaz.enigma.mapping.Signature; -import cuchaz.enigma.mapping.TypeDescriptor; - -public class ProcyonEntryFactory { - private final ReferencedEntryPool entryPool; - - public ProcyonEntryFactory(ReferencedEntryPool entryPool) { - this.entryPool = entryPool; - } - - 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()), Signature.createTypedSignature(def.getSignature()), new AccessFlags(def.getModifiers())); - } - - public MethodEntry getMethodEntry(MemberReference def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return entryPool.getMethod(classEntry, def.getName(), def.getErasedSignature()); - } - - public MethodDefEntry getMethodDefEntry(MethodDefinition def) { - ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); - return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), Signature.createSignature(def.getSignature()), 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 deleted file mode 100644 index 12b3955..0000000 --- a/src/main/java/cuchaz/enigma/mapping/entry/ReferencedEntryPool.java +++ /dev/null @@ -1,59 +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.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) { - // TODO: FIXME - I'm a hack! - if ("[T".equals(name) || "[[T".equals(name) || "[[[T".equals(name)) { - name = name.replaceAll("T", "Ljava/lang/Object;"); - } - - final String computeName = name; - return this.classEntries.computeIfAbsent(name, s -> new ClassEntry(computeName)); - } - - 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