ApiClassVisitor.java
/*
* Copyright (C) 2015 Uwe Plonus
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sw4j.apisniffer.visitor;
import javax.annotation.concurrent.NotThreadSafe;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.TypePath;
import org.sw4j.apisniffer.builder.ApiBuilder;
import org.sw4j.apisniffer.builder.TypeBuilder;
/**
*
* @author Uwe Plonus
*/
@NotThreadSafe
public final class ApiClassVisitor extends ClassVisitor {
private final ApiBuilder apiBuilder;
private TypeBuilder typeBuilder;
public ApiClassVisitor(ApiBuilder apiBuilder) {
super(Opcodes.ASM5);
this.apiBuilder = apiBuilder;
}
@Override
public void visit(int version, int access, String name, String signature, String superName,
String[] interfaces) {
if ((access & Opcodes.ACC_ANNOTATION) == Opcodes.ACC_ANNOTATION) {
typeBuilder = apiBuilder.createAnnotationTypeBuilder();
} else if ((access & Opcodes.ACC_INTERFACE) == Opcodes.ACC_INTERFACE) {
typeBuilder = apiBuilder.createInterfaceTypeBuilder();
} else if ((access & Opcodes.ACC_ENUM) == Opcodes.ACC_ENUM) {
typeBuilder = apiBuilder.createEnumTypeBuilder();
} else {
typeBuilder = apiBuilder.createClassTypeBuilder();
}
typeBuilder.setInternalName(name);
super.visit(version, access, name, signature, superName, interfaces);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature,
String[] exceptions) {
return super.visitMethod(access, name, desc, signature, exceptions);
}
@Override
public FieldVisitor visitField(int access, String name, String desc, String signature,
Object value) {
return super.visitField(access, name, desc, signature, value);
}
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
super.visitInnerClass(name, outerName, innerName, access);
}
@Override
public void visitAttribute(Attribute attr) {
super.visitAttribute(attr);
}
@Override
public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc,
boolean visible) {
return super.visitTypeAnnotation(typeRef, typePath, desc, visible);
}
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
return super.visitAnnotation(desc, visible);
}
@Override
public void visitOuterClass(String owner, String name, String desc) {
super.visitOuterClass(owner, name, desc);
}
@Override
public void visitEnd() {
super.visitEnd();
}
}