/*******************************************************************************
* Copyright (c) 2005 Contributors.
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alexandre Vasseur initial implementation
*******************************************************************************/
package org.codehaus.aspectwerkz.transform.inlining;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Attribute;
/**
* Adapters to handle annotation copy
* FIXME license EPL + FIXME field annotation + ctor annotation when all wrapped ?? [but why does it matters]
*
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class AsmCopyAdapter {
/**
* Copy annotation from one to another place
*/
public static class CopyAnnotationAdapter implements AnnotationVisitor {
private final AnnotationVisitor m_from;
private final AnnotationVisitor m_to;
public CopyAnnotationAdapter(AnnotationVisitor from, AnnotationVisitor copyTo) {
m_from = from;
m_to = copyTo;
}
public void visit(String name, Object value) {
m_from.visit(name, value);
m_to.visit(name, value);
}
public void visitEnum(String name, String desc, String value) {
m_from.visitEnum(name, desc, value);
m_to.visitEnum(name, desc, value);
}
public AnnotationVisitor visitAnnotation(String name, String desc) {
return new CopyAnnotationAdapter(
m_from.visitAnnotation(name, desc),
m_to.visitAnnotation(name, desc)
);
}
public AnnotationVisitor visitArray(String name) {
return new CopyAnnotationAdapter(
m_from.visitArray(name),
m_to.visitArray(name)
);
}
public void visitEnd() {
m_from.visitEnd();
m_to.visitEnd();
}
}
/**
* Copy all annotations of a method
* //FIXME needed ?
*/
public static class CopyMethodAnnotationElseNullAdapter extends AsmNullAdapter.NullMethodAdapter {
private final MethodVisitor m_copyTo;
public CopyMethodAnnotationElseNullAdapter(MethodVisitor copyTo) {
m_copyTo = copyTo;
}
public void visitAttribute(Attribute attr) {
m_copyTo.visitAttribute(attr);
}
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
return new CopyAnnotationAdapter(
AsmNullAdapter.NullAnnotationVisitor.NULL_ANNOTATION_ADAPTER,
m_copyTo.visitAnnotation(desc, visible)
);
}
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
return new CopyAnnotationAdapter(
AsmNullAdapter.NullAnnotationVisitor.NULL_ANNOTATION_ADAPTER,
m_copyTo.visitParameterAnnotation(parameter, desc, visible)
);
}
}
}