103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta/* 203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Copyright (C) 2013 The Android Open Source Project 303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * you may not use this file except in compliance with the License. 603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * You may obtain a copy of the License at 703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * http://www.apache.org/licenses/LICENSE-2.0 903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 1003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Unless required by applicable law or agreed to in writing, software 1103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS, 1203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * See the License for the specific language governing permissions and 1403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * limitations under the License. 1503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 1603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 1703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptapackage com.android.tools.layoutlib.create; 1803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 1903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.AnnotationVisitor; 2003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.ClassVisitor; 2103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.FieldVisitor; 2203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.Label; 2303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.MethodVisitor; 2403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.Opcodes; 2503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.Type; 2603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.signature.SignatureReader; 2703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.signature.SignatureVisitor; 2803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport org.objectweb.asm.signature.SignatureWriter; 2903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 3003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta/** 3103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Provides the common code for RenameClassAdapter and RefactorClassAdapter. It 3203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * goes through the complete class and finds references to other classes. It 3303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * then calls {@link #renameInternalType(String)} to convert the className to 3403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * the new value, if need be. 3503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 3603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptapublic abstract class AbstractClassAdapter extends ClassVisitor { 3703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 3803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 3903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns the new FQCN for the class, if the reference to this class needs 4003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * to be updated. Else, it returns the same string. 4103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * @param name Old FQCN 4203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * @return New FQCN if it needs to be renamed, else the old FQCN 4303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 4403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta abstract String renameInternalType(String name); 4503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 4603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public AbstractClassAdapter(ClassVisitor cv) { 4703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super(Opcodes.ASM4, cv); 4803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 4903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 5003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 5103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames a type descriptor, e.g. "Lcom.package.MyClass;" 5203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * If the type doesn't need to be renamed, returns the input string as-is. 5303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 5403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String renameTypeDesc(String desc) { 5503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (desc == null) { 5603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return null; 5703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 5803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 5903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return renameType(Type.getType(desc)); 6003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 6103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 6203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 6303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an 6403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * object element, e.g. "[Lcom.package.MyClass;" 6503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * If the type doesn't need to be renamed, returns the internal name of the input type. 6603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 6703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String renameType(Type type) { 6803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (type == null) { 6903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return null; 7003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 7103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 7203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (type.getSort() == Type.OBJECT) { 7303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String in = type.getInternalName(); 7403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return "L" + renameInternalType(in) + ";"; 7503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (type.getSort() == Type.ARRAY) { 7603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta StringBuilder sb = new StringBuilder(); 7703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta for (int n = type.getDimensions(); n > 0; n--) { 7803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append('['); 7903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 8003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append(renameType(type.getElementType())); 8103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return sb.toString(); 8203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 8303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return type.getDescriptor(); 8403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 8503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 8603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 8703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an 8803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * object element, e.g. "[Lcom.package.MyClass;". 8903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * This is like renameType() except that it returns a Type object. 9003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * If the type doesn't need to be renamed, returns the input type object. 9103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 9203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta Type renameTypeAsType(Type type) { 9303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (type == null) { 9403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return null; 9503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 9603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 9703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (type.getSort() == Type.OBJECT) { 9803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String in = type.getInternalName(); 9903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String newIn = renameInternalType(in); 100d2a411840c58eaee05499bab0190e3f3656e2e84Deepanshu Gupta if (!newIn.equals(in)) { 10103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Type.getType("L" + newIn + ";"); 10203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 10303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (type.getSort() == Type.ARRAY) { 10403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta StringBuilder sb = new StringBuilder(); 10503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta for (int n = type.getDimensions(); n > 0; n--) { 10603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append('['); 10703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 10803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append(renameType(type.getElementType())); 10903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Type.getType(sb.toString()); 11003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 11103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return type; 11203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 11303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 11403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 11503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames a method descriptor, i.e. applies renameType to all arguments and to the 11603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * return value. 11703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 11803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String renameMethodDesc(String desc) { 11903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (desc == null) { 12003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return null; 12103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 12203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 12303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta Type[] args = Type.getArgumentTypes(desc); 12403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 12503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta StringBuilder sb = new StringBuilder("("); 12603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta for (Type arg : args) { 12703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String name = renameType(arg); 12803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append(name); 12903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 13003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append(')'); 13103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 13203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta Type ret = Type.getReturnType(desc); 13303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String name = renameType(ret); 13403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sb.append(name); 13503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 13603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return sb.toString(); 13703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 13803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 13903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 14003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 14103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames the ClassSignature handled by ClassVisitor.visit 14203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * or the MethodTypeSignature handled by ClassVisitor.visitMethod. 14303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 14403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String renameTypeSignature(String sig) { 14503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (sig == null) { 14603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return null; 14703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 14803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureReader reader = new SignatureReader(sig); 14903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureWriter writer = new SignatureWriter(); 15003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta reader.accept(new RenameSignatureAdapter(writer)); 15103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta sig = writer.toString(); 15203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return sig; 15303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 15403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 15503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 15603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 15703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Renames the FieldTypeSignature handled by ClassVisitor.visitField 15803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * or MethodVisitor.visitLocalVariable. 15903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 16003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String renameFieldSignature(String sig) { 16103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return renameTypeSignature(sig); 16203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 16303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 16403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 16503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta //---------------------------------- 16603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta // Methods from the ClassAdapter 16703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 16803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 16903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visit(int version, int access, String name, String signature, 17003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String superName, String[] interfaces) { 17103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta name = renameInternalType(name); 17203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta superName = renameInternalType(superName); 17303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta signature = renameTypeSignature(signature); 17403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (interfaces != null) { 17503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta for (int i = 0; i < interfaces.length; ++i) { 17603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta interfaces[i] = renameInternalType(interfaces[i]); 17703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 17803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 17903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 1806a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta /* Java 7 verifies the StackMapTable of a class if its version number is greater than 50.0. 1816a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta * However, the check is disabled if the class version number is 50.0 or less. Generation 1826a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta * of the StackMapTable requires a rewrite using the tree API of ASM. As a workaround, 1836a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta * we rewrite the version number of the class to be 50.0 1846a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta * 1856a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta * http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6693236 1866a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta */ 1876a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta if (version > 50) { 1886a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta version = 50; 1896a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta } 1906a08225cee197e5baf80dd06dae46988db284122Deepanshu Gupta 19103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visit(version, access, name, signature, superName, interfaces); 19203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 19303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 19403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 19503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitInnerClass(String name, String outerName, String innerName, int access) { 19603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta name = renameInternalType(name); 19703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta outerName = renameInternalType(outerName); 19803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitInnerClass(name, outerName, innerName, access); 19903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 20003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 20103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 20203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitOuterClass(String owner, String name, String desc) { 20303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitOuterClass(renameInternalType(owner), name, renameTypeDesc(desc)); 20403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 20503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 20603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 20703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public MethodVisitor visitMethod(int access, String name, String desc, 20803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String signature, String[] exceptions) { 20903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameMethodDesc(desc); 21003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta signature = renameTypeSignature(signature); 21103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta MethodVisitor mw = super.visitMethod(access, name, desc, signature, exceptions); 21203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameMethodAdapter(mw); 21303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 21403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 21503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 21603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 21703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 21803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return super.visitAnnotation(desc, visible); 21903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 22003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 22103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 22203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public FieldVisitor visitField(int access, String name, String desc, 22303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta String signature, Object value) { 22403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 22503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return super.visitField(access, name, desc, signature, value); 22603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 22703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 22803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 22903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta //---------------------------------- 23003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 23103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 23203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * A method visitor that renames all references from an old class name to a new class name. 23303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 23403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public class RenameMethodAdapter extends MethodVisitor { 23503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 23603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 23703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Creates a method visitor that renames all references from a given old name to a given new 23803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * name. The method visitor will also rename all inner classes. 23903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * The names must be full qualified internal ASM names (e.g. com/blah/MyClass$InnerClass). 24003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 24103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public RenameMethodAdapter(MethodVisitor mv) { 24203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super(Opcodes.ASM4, mv); 24303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 24403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 24503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 24603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 24703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 24803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 24903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return super.visitAnnotation(desc, visible); 25003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 25103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 25203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 25303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { 25403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 25503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 25603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return super.visitParameterAnnotation(parameter, desc, visible); 25703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 25803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 25903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 26003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitTypeInsn(int opcode, String type) { 26103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta // The type sometimes turns out to be a type descriptor. We try to detect it and fix. 26203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (type.indexOf(';') > 0) { 26303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta type = renameTypeDesc(type); 26403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else { 26503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta type = renameInternalType(type); 26603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 26703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitTypeInsn(opcode, type); 26803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 26903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 27003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 27103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitFieldInsn(int opcode, String owner, String name, String desc) { 27203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta owner = renameInternalType(owner); 27303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 27403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 27503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitFieldInsn(opcode, owner, name, desc); 27603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 27703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 27803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 27903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitMethodInsn(int opcode, String owner, String name, String desc) { 28003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta // The owner sometimes turns out to be a type descriptor. We try to detect it and fix. 28103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (owner.indexOf(';') > 0) { 28203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta owner = renameTypeDesc(owner); 28303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else { 28403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta owner = renameInternalType(owner); 28503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 28603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameMethodDesc(desc); 28703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 28803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitMethodInsn(opcode, owner, name, desc); 28903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 29003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 29103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 29203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitLdcInsn(Object cst) { 29303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta // If cst is a Type, this means the code is trying to pull the .class constant 29403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta // for this class, so it needs to be renamed too. 29503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (cst instanceof Type) { 29603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta cst = renameTypeAsType((Type) cst); 29703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 29803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitLdcInsn(cst); 29903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 30003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 30103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 30203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitMultiANewArrayInsn(String desc, int dims) { 30303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 30403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 30503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitMultiANewArrayInsn(desc, dims); 30603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 30703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 30803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 30903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { 31003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta type = renameInternalType(type); 31103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 31203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitTryCatchBlock(start, end, handler, type); 31303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 31403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 31503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 31603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitLocalVariable(String name, String desc, String signature, 31703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta Label start, Label end, int index) { 31803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta desc = renameTypeDesc(desc); 31903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta signature = renameFieldSignature(signature); 32003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 32103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super.visitLocalVariable(name, desc, signature, start, end, index); 32203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 32303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 32403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 32503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 32603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta //---------------------------------- 32703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 32803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public class RenameSignatureAdapter extends SignatureVisitor { 32903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 33003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta private final SignatureVisitor mSv; 33103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 33203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public RenameSignatureAdapter(SignatureVisitor sv) { 33303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta super(Opcodes.ASM4); 33403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv = sv; 33503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 33603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 33703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 33803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitClassType(String name) { 33903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta name = renameInternalType(name); 34003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitClassType(name); 34103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 34203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 34303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 34403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitInnerClassType(String name) { 34503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta name = renameInternalType(name); 34603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitInnerClassType(name); 34703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 34803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 34903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 35003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitArrayType() { 35103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitArrayType(); 35203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 35303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 35403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 35503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 35603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitBaseType(char descriptor) { 35703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitBaseType(descriptor); 35803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 35903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 36003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 36103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitClassBound() { 36203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitClassBound(); 36303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 36403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 36503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 36603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 36703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitEnd() { 36803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitEnd(); 36903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 37003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 37103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 37203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitExceptionType() { 37303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitExceptionType(); 37403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 37503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 37603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 37703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 37803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitFormalTypeParameter(String name) { 37903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitFormalTypeParameter(name); 38003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 38103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 38203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 38303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitInterface() { 38403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitInterface(); 38503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 38603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 38703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 38803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 38903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitInterfaceBound() { 39003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitInterfaceBound(); 39103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 39203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 39303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 39403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 39503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitParameterType() { 39603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitParameterType(); 39703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 39803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 39903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 40003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 40103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitReturnType() { 40203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitReturnType(); 40303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 40403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 40503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 40603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 40703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitSuperclass() { 40803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitSuperclass(); 40903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 41003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 41103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 41203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 41303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitTypeArgument() { 41403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitTypeArgument(); 41503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 41603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 41703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 41803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public SignatureVisitor visitTypeArgument(char wildcard) { 41903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta SignatureVisitor sv = mSv.visitTypeArgument(wildcard); 42003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return new RenameSignatureAdapter(sv); 42103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 42203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 42303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta @Override 42403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public void visitTypeVariable(String name) { 42503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta mSv.visitTypeVariable(name); 42603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 42703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 42803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 42903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta} 430