From 591f44c85c392ecf281039a9f3c52673c11d9584 Mon Sep 17 00:00:00 2001 From: Thog Date: Wed, 7 Sep 2016 16:58:12 +0200 Subject: Follow Javassist signature instead of ignoring generic classes (Fix #19) --- .../cuchaz/enigma/mapping/ProcyonEntryFactory.java | 31 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'src/main/java/cuchaz/enigma/mapping') diff --git a/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java index 08dc8b1..8cbca13 100644 --- a/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java +++ b/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java @@ -10,19 +10,40 @@ ******************************************************************************/ package cuchaz.enigma.mapping; -import com.strobel.assembler.metadata.FieldDefinition; -import com.strobel.assembler.metadata.MemberReference; -import com.strobel.assembler.metadata.MethodDefinition; -import com.strobel.assembler.metadata.MethodReference; +import com.strobel.assembler.metadata.*; + +import java.util.List; public class ProcyonEntryFactory { + private static 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(")"); + builder.append(methodReference.getReturnType().getErasedSignature()); + return builder.toString(); + } + public static FieldEntry getFieldEntry(MemberReference def) { return new FieldEntry(new ClassEntry(def.getDeclaringType().getInternalName()), def.getName(), new Type(def.getErasedSignature())); } public static MethodEntry getMethodEntry(MemberReference def) { - return new MethodEntry(new ClassEntry(def.getDeclaringType().getInternalName()), def.getName(), new Signature(def.getErasedSignature())); + return new MethodEntry(new ClassEntry(def.getDeclaringType().getInternalName()), def.getName(), new Signature(getErasedSignature(def))); } public static ConstructorEntry getConstructorEntry(MethodReference def) { -- cgit v1.2.3