19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.tools.layoutlib.create; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.AnnotationVisitor; 20f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbyeimport org.objectweb.asm.ClassVisitor; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.ClassWriter; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.FieldVisitor; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.Label; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.MethodVisitor; 25f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbyeimport org.objectweb.asm.Opcodes; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.Type; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.signature.SignatureReader; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.signature.SignatureVisitor; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.objectweb.asm.signature.SignatureWriter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class visitor renames a class from a given old name to a given new name. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The class visitor will also rename all inner classes and references in the methods. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 35f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For inner classes, this handles only the case where the outer class name changes. 37f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye * The inner class name should remain the same. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 39f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbyepublic class RenameClassAdapter extends ClassVisitor { 40f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String mOldName; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String mNewName; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mOldBase; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mNewBase; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a class visitor that renames a class from a given old name to a given new name. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The class visitor will also rename all inner classes and references in the methods. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The names must be full qualified internal ASM names (e.g. com/blah/MyClass$InnerClass). 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RenameClassAdapter(ClassWriter cv, String oldName, String newName) { 53f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye super(Opcodes.ASM4, cv); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOldBase = mOldName = oldName; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNewBase = mNewName = newName; 56f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = mOldName.indexOf('$'); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos > 0) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOldBase = mOldName.substring(0, pos); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = mNewName.indexOf('$'); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos > 0) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNewBase = mNewName.substring(0, pos); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert (mOldBase == null && mNewBase == null) || (mOldBase != null && mNewBase != null); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames a type descriptor, e.g. "Lcom.package.MyClass;" 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the type doesn't need to be renamed, returns the input string as-is. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameTypeDesc(String desc) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (desc == null) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return renameType(Type.getType(desc)); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object element, e.g. "[Lcom.package.MyClass;" 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the type doesn't need to be renamed, returns the internal name of the input type. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameType(Type type) { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type.getSort() == Type.OBJECT) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String in = type.getInternalName(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "L" + renameInternalType(in) + ";"; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type.getSort() == Type.ARRAY) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = type.getDimensions(); n > 0; n--) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('['); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(renameType(type.getElementType())); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return type.getDescriptor(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object element, e.g. "[Lcom.package.MyClass;". 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is like renameType() except that it returns a Type object. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the type doesn't need to be renamed, returns the input type object. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type renameTypeAsType(Type type) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type.getSort() == Type.OBJECT) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String in = type.getInternalName(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String newIn = renameInternalType(in); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newIn != in) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Type.getType("L" + newIn + ";"); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type.getSort() == Type.ARRAY) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = type.getDimensions(); n > 0; n--) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('['); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(renameType(type.getElementType())); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Type.getType(sb.toString()); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return type; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames an internal type name, e.g. "com.package.MyClass". 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the type doesn't need to be renamed, returns the input string as-is. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The internal type of some of the MethodVisitor turns out to be a type 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descriptor sometimes so descriptors are renamed too. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameInternalType(String type) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type.equals(mOldName)) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNewName; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOldBase != mOldName && type.equals(mOldBase)) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNewBase; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 153f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = type.indexOf('$'); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos == mOldBase.length() && type.startsWith(mOldBase)) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNewBase + type.substring(pos); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The internal type of some of the MethodVisitor turns out to be a type 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // descriptor sometimes. This is the case with visitTypeInsn(type) and 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // visitMethodInsn(owner). We try to detect it and adjust it here. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type.indexOf(';') > 0) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = renameTypeDesc(type); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return type; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames a method descriptor, i.e. applies renameType to all arguments and to the 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return value. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameMethodDesc(String desc) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (desc == null) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type[] args = Type.getArgumentTypes(desc); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder("("); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Type arg : args) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = renameType(arg); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(')'); 186f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Type ret = Type.getReturnType(desc); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = renameType(ret); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 194f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 196f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye * Renames the ClassSignature handled by ClassVisitor.visit 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the MethodTypeSignature handled by ClassVisitor.visitMethod. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameTypeSignature(String sig) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sig == null) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureReader reader = new SignatureReader(sig); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureWriter writer = new SignatureWriter(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reader.accept(new RenameSignatureAdapter(writer)); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig = writer.toString(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sig; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Renames the FieldTypeSignature handled by ClassVisitor.visitField 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or MethodVisitor.visitLocalVariable. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String renameFieldSignature(String sig) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sig == null) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureReader reader = new SignatureReader(sig); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureWriter writer = new SignatureWriter(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reader.acceptType(new RenameSignatureAdapter(writer)); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig = writer.toString(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sig; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 226f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //---------------------------------- 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Methods from the ClassAdapter 229f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visit(int version, int access, String name, String signature, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String superName, String[] interfaces) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = renameInternalType(name); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project superName = renameInternalType(superName); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signature = renameTypeSignature(signature); 236f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visit(version, access, name, signature, superName, interfaces); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitInnerClass(String name, String outerName, String innerName, int access) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert outerName.equals(mOldName); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outerName = renameInternalType(outerName); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = outerName + "$" + innerName; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitInnerClass(name, outerName, innerName, access); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MethodVisitor visitMethod(int access, String name, String desc, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String signature, String[] exceptions) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameMethodDesc(desc); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signature = renameTypeSignature(signature); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MethodVisitor mw = super.visitMethod(access, name, desc, signature, exceptions); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameMethodAdapter(mw); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.visitAnnotation(desc, visible); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 262f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FieldVisitor visitField(int access, String name, String desc, 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String signature, Object value) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signature = renameFieldSignature(signature); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.visitField(access, name, desc, signature, value); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 270f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 271f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //---------------------------------- 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A method visitor that renames all references from an old class name to a new class name. 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 277f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye public class RenameMethodAdapter extends MethodVisitor { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a method visitor that renames all references from a given old name to a given new 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * name. The method visitor will also rename all inner classes. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The names must be full qualified internal ASM names (e.g. com/blah/MyClass$InnerClass). 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RenameMethodAdapter(MethodVisitor mv) { 285f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye super(Opcodes.ASM4, mv); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 291f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.visitAnnotation(desc, visible); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.visitParameterAnnotation(parameter, desc, visible); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitTypeInsn(int opcode, String type) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = renameInternalType(type); 305f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitTypeInsn(opcode, type); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitFieldInsn(int opcode, String owner, String name, String desc) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = renameInternalType(owner); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitFieldInsn(opcode, owner, name, desc); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitMethodInsn(int opcode, String owner, String name, String desc) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = renameInternalType(owner); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameMethodDesc(desc); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitMethodInsn(opcode, owner, name, desc); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 324f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitLdcInsn(Object cst) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If cst is a Type, this means the code is trying to pull the .class constant 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for this class, so it needs to be renamed too. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cst instanceof Type) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cst = renameTypeAsType((Type) cst); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitLdcInsn(cst); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitMultiANewArrayInsn(String desc, int dims) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 338f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitMultiANewArrayInsn(desc, dims); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type = renameInternalType(type); 345f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitTryCatchBlock(start, end, handler, type); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitLocalVariable(String name, String desc, String signature, 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Label start, Label end, int index) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desc = renameTypeDesc(desc); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signature = renameFieldSignature(signature); 354f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.visitLocalVariable(name, desc, signature, start, end, index); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //---------------------------------- 361f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 362f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye public class RenameSignatureAdapter extends SignatureVisitor { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final SignatureVisitor mSv; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RenameSignatureAdapter(SignatureVisitor sv) { 367f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye super(Opcodes.ASM4); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv = sv; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 371f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitClassType(String name) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = renameInternalType(name); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitClassType(name); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 377f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitInnerClassType(String name) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = renameInternalType(name); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitInnerClassType(name); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 383f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitArrayType() { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitArrayType(); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitBaseType(char descriptor) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitBaseType(descriptor); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 394f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitClassBound() { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitClassBound(); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 400f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitEnd() { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitEnd(); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 405f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitExceptionType() { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitExceptionType(); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 411f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitFormalTypeParameter(String name) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitFormalTypeParameter(name); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 416f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitInterface() { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitInterface(); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 422f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitInterfaceBound() { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitInterfaceBound(); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 428f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitParameterType() { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitParameterType(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 434f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitReturnType() { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitReturnType(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 440f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitSuperclass() { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitSuperclass(); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 446f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitTypeArgument() { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitTypeArgument(); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 451f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SignatureVisitor visitTypeArgument(char wildcard) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SignatureVisitor sv = mSv.visitTypeArgument(wildcard); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RenameSignatureAdapter(sv); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 457f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye @Override 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void visitTypeVariable(String name) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSv.visitTypeVariable(name); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 461f7270ba9083e5b0069f73fc88aec439ab439275bTor Norbye 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 464