1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.tools.layoutlib.create; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.VisibleForTesting; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.VisibleForTesting.Visibility; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.AnnotationVisitor; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.Attribute; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.ClassVisitor; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.FieldVisitor; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.MethodVisitor; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.objectweb.asm.Opcodes; 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Indicates if a class contains any native methods. 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class ClassHasNativeVisitor extends ClassVisitor { 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public ClassHasNativeVisitor() { 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski super(Opcodes.ASM4); 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private boolean mHasNativeMethods = false; 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean hasNativeMethods() { 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mHasNativeMethods; 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @VisibleForTesting(visibility=Visibility.PRIVATE) 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski protected void setHasNativeMethods(boolean hasNativeMethods, String methodName) { 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mHasNativeMethods = hasNativeMethods; 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visit(int version, int access, String name, String signature, 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String superName, String[] interfaces) { 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visitAttribute(Attribute attr) { 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visitEnd() { 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public FieldVisitor visitField(int access, String name, String desc, 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String signature, Object value) { 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visitInnerClass(String name, String outerName, 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String innerName, int access) { 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public MethodVisitor visitMethod(int access, String name, String desc, 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String signature, String[] exceptions) { 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if ((access & Opcodes.ACC_NATIVE) != 0) { 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski setHasNativeMethods(true, name); 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visitOuterClass(String owner, String name, String desc) { 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void visitSource(String source, String debug) { 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 103