From 8e7453727ff059c8f1db7f89f6793d22cbd5e6fc Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 19 May 2018 18:02:29 +0200 Subject: Annotation + inner class translation --- .../java/cuchaz/enigma/mapping/DirectionalTranslator.java | 2 +- src/main/java/cuchaz/enigma/mapping/Mappings.java | 2 +- src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java | 2 +- src/main/java/cuchaz/enigma/mapping/Translator.java | 13 +++++++++++++ src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java | 9 ++++++--- 5 files changed, 22 insertions(+), 6 deletions(-) (limited to 'src/main/java/cuchaz/enigma/mapping') diff --git a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java index c9e2ab4..196bbd6 100644 --- a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java +++ b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java @@ -185,7 +185,7 @@ public class DirectionalTranslator implements Translator { } // TODO: Translating arguments calls method translation.. Can we refactor the code in such a way that we don't need this? MethodEntry translatedOwner = getTranslatedMethod(entry.getOwnerEntry()); - return new LocalVariableEntry(translatedOwner, entry.getIndex(), translatedArgumentName); + return new LocalVariableEntry(translatedOwner != null ? translatedOwner : entry.getOwnerEntry(), entry.getIndex(), translatedArgumentName); } @Override diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index 9b907a9..79d9f10 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java @@ -156,7 +156,7 @@ public class Mappings { for (MethodMapping methodMapping : classMapping.methods()) { for (TypeDescriptor desc : methodMapping.getObfDesc().types()) { if (desc.containsType()) { - classNames.add(desc.getOwnerEntry().getClassName()); + classNames.add(desc.getTypeEntry().getClassName()); } } } diff --git a/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java b/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java index b56d1d4..0fc0351 100644 --- a/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java +++ b/src/main/java/cuchaz/enigma/mapping/MethodDescriptor.java @@ -97,7 +97,7 @@ public class MethodDescriptor { public boolean hasClass(ClassEntry classEntry) { for (TypeDescriptor desc : types()) { - if (desc.containsType() && desc.getOwnerEntry().equals(classEntry)) { + if (desc.containsType() && desc.getTypeEntry().equals(classEntry)) { return true; } } diff --git a/src/main/java/cuchaz/enigma/mapping/Translator.java b/src/main/java/cuchaz/enigma/mapping/Translator.java index ab55a02..6373da7 100644 --- a/src/main/java/cuchaz/enigma/mapping/Translator.java +++ b/src/main/java/cuchaz/enigma/mapping/Translator.java @@ -12,6 +12,7 @@ package cuchaz.enigma.mapping; import cuchaz.enigma.mapping.entry.*; +import org.objectweb.asm.Type; public interface Translator { ClassEntry getTranslatedClass(ClassEntry entry); @@ -34,6 +35,18 @@ public interface Translator { MethodDescriptor getTranslatedMethodDesc(MethodDescriptor descriptor); + default Type getTranslatedType(Type type) { + String descString = type.getDescriptor(); + // If this is a method + if (descString.contains("(")) { + MethodDescriptor descriptor = new MethodDescriptor(descString); + return Type.getMethodType(getTranslatedMethodDesc(descriptor).toString()); + } else { + TypeDescriptor descriptor = new TypeDescriptor(descString); + return Type.getType(getTranslatedTypeDesc(descriptor).toString()); + } + } + @SuppressWarnings("unchecked") default T getTranslatedEntry(T entry) { if (entry instanceof ClassDefEntry) { diff --git a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java index 58fa651..b7b1255 100644 --- a/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java +++ b/src/main/java/cuchaz/enigma/mapping/TypeDescriptor.java @@ -11,6 +11,7 @@ package cuchaz.enigma.mapping; +import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import cuchaz.enigma.mapping.entry.ClassEntry; @@ -22,6 +23,8 @@ public class TypeDescriptor { protected final String desc; public TypeDescriptor(String desc) { + Preconditions.checkNotNull(desc, "Desc cannot be null"); + // don't deal with generics // this is just for raw jvm types if (desc.charAt(0) == 'T' || desc.indexOf('<') >= 0 || desc.indexOf('>') >= 0) { @@ -127,7 +130,7 @@ public class TypeDescriptor { return this.desc.charAt(0) == 'L' && this.desc.charAt(this.desc.length() - 1) == ';'; } - public ClassEntry getOwnerEntry() { + public ClassEntry getTypeEntry() { if (isType()) { String name = this.desc.substring(1, this.desc.length() - 1); @@ -140,7 +143,7 @@ public class TypeDescriptor { return new ClassEntry(name); } else if (isArray() && getArrayType().isType()) { - return getArrayType().getOwnerEntry(); + return getArrayType().getTypeEntry(); } else { throw new IllegalStateException("desc doesn't have a class"); } @@ -185,7 +188,7 @@ public class TypeDescriptor { public TypeDescriptor remap(Function remapper) { String desc = this.desc; if (isType() || (isArray() && containsType())) { - String replacedName = remapper.apply(this.getOwnerEntry().getName()); + String replacedName = remapper.apply(this.getTypeEntry().getName()); if (replacedName != null) { if (this.isType()) { desc = "L" + replacedName + ";"; -- cgit v1.2.3