From bfb3fad7e65ce5ebfa349c0ad3c2da49d9b1f4cc Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 18 Mar 2015 23:38:11 -0400 Subject: translate class references hidden inside type parameters --- src/cuchaz/enigma/bytecode/ClassRenamer.java | 102 +++++++++++++++++++-------- 1 file changed, 71 insertions(+), 31 deletions(-) diff --git a/src/cuchaz/enigma/bytecode/ClassRenamer.java b/src/cuchaz/enigma/bytecode/ClassRenamer.java index 8d25e72..e708b9d 100644 --- a/src/cuchaz/enigma/bytecode/ClassRenamer.java +++ b/src/cuchaz/enigma/bytecode/ClassRenamer.java @@ -39,6 +39,7 @@ import javassist.bytecode.SignatureAttribute.NestedClassType; import javassist.bytecode.SignatureAttribute.ObjectType; import javassist.bytecode.SignatureAttribute.Type; import javassist.bytecode.SignatureAttribute.TypeArgument; +import javassist.bytecode.SignatureAttribute.TypeParameter; import javassist.bytecode.SignatureAttribute.TypeVariable; import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.ClassNameReplacer; @@ -164,9 +165,9 @@ public class ClassRenamer { // rename the class name itself last // NOTE: don't use the map here, because setName() calls the buggy SignatureAttribute.renameClass() // we only want to replace exactly this class name - String newName = replacer.replace(Descriptor.toJvmName(c.getName())); + String newName = renameClassName(c.getName(), map); if (newName != null) { - c.setName(Descriptor.toJavaName(newName)); + c.setName(newName); } // replace simple names in the InnerClasses attribute too @@ -284,7 +285,11 @@ public class ClassRenamer { private static String renameClassSignature(String signature, ReplacerClassMap map) { try { - return getSignature(renameType(SignatureAttribute.toClassSignature(signature), map)); + ClassSignature type = renameType(SignatureAttribute.toClassSignature(signature), map); + if (type != null) { + return type.encode(); + } + return null; } catch (BadBytecode ex) { throw new Error("Can't parse field signature: " + signature); } @@ -292,7 +297,11 @@ public class ClassRenamer { private static String renameFieldSignature(String signature, ReplacerClassMap map) { try { - return getSignature(renameType(SignatureAttribute.toFieldSignature(signature), map)); + ObjectType type = renameType(SignatureAttribute.toFieldSignature(signature), map); + if (type != null) { + return type.encode(); + } + return null; } catch (BadBytecode ex) { throw new Error("Can't parse class signature: " + signature); } @@ -300,7 +309,11 @@ public class ClassRenamer { private static String renameMethodSignature(String signature, ReplacerClassMap map) { try { - return getSignature(renameType(SignatureAttribute.toMethodSignature(signature), map)); + MethodSignature type = renameType(SignatureAttribute.toMethodSignature(signature), map); + if (type != null) { + return type.encode(); + } + return null; } catch (BadBytecode ex) { throw new Error("Can't parse method signature: " + signature); } @@ -308,9 +321,17 @@ public class ClassRenamer { private static ClassSignature renameType(ClassSignature type, ReplacerClassMap map) { - // NOTE: don't have to translate type parameters + TypeParameter[] typeParamTypes = type.getParameters(); + if (typeParamTypes != null) { + typeParamTypes = Arrays.copyOf(typeParamTypes, typeParamTypes.length); + for (int i=0; i