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