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) --- .../enigma/analysis/SourceIndexClassVisitor.java | 2 -- .../cuchaz/enigma/mapping/ProcyonEntryFactory.java | 31 ++++++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) (limited to 'src/main') diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java index 06ce042b..2a212222 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java @@ -16,7 +16,6 @@ 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.*; public class SourceIndexClassVisitor extends SourceIndexVisitor { @@ -57,7 +56,6 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { MethodDefinition def = node.getUserData(Keys.METHOD_DEFINITION); BehaviorEntry behaviorEntry = ProcyonEntryFactory.getBehaviorEntry(def); AstNode tokenNode = node.getNameToken(); - if (behaviorEntry instanceof ConstructorEntry) { ConstructorEntry constructorEntry = (ConstructorEntry) behaviorEntry; if (constructorEntry.isStatic()) { diff --git a/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/ProcyonEntryFactory.java index 08dc8b18..8cbca13d 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