package org.testng.eclipse.launch.components;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ArrayInitializer;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MarkerAnnotation;
import org.eclipse.jdt.core.dom.MemberValuePair;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import java.util.List;
/**
* An AST visitor to collect all the groups defined in a compilation unit.
* This visitor extends JavaDocVisitor so it's able to visit both annotations
* and javadoc annotations, so maybe it should actually be renamed.
*
* @author cbeust
*/
public class AnnotationVisitor extends BaseVisitor {
// Deprecated, remove
private static final String JDK15_ANNOTATION = "jdk15";
@Override
public boolean visit(MethodDeclaration node) {
if(m_typeIsTest) {
addTestMethod(node, JDK15_ANNOTATION);
// return false; // no need to continue
}
return true;
}
@Override
public boolean visit(MarkerAnnotation node) {
ASTNode parent = node.getParent();
if (isTestAnnotation(node.getTypeName().toString())) {
if (parent instanceof MethodDeclaration) {
addTestMethod((MethodDeclaration) parent, JDK15_ANNOTATION);
}
else if (parent instanceof TypeDeclaration) { // TESTNG-24
m_typeIsTest = true;
m_annotationType = JDK15_ANNOTATION;
}
}
else if (isFactoryAnnotation(node.getTypeName().toString())) {
if (parent instanceof MethodDeclaration) {
m_annotationType = JDK15_ANNOTATION;
addFactoryMethod((MethodDeclaration) parent, JDK15_ANNOTATION);
}
}
return false;
}
@Override
public boolean visit(NormalAnnotation node) {
//
// Test method?
//
if(isTestAnnotation(node.getTypeName().toString())) {
ASTNode parent = node.getParent();
if (parent instanceof MethodDeclaration) {
addTestMethod((MethodDeclaration) parent, JDK15_ANNOTATION);
} else if(parent instanceof TypeDeclaration) {
m_typeIsTest = true;
m_annotationType = JDK15_ANNOTATION;
}
@SuppressWarnings("unchecked")
List<MemberValuePair> pairs = node.values();
for (MemberValuePair mvp : pairs) {
Name attribute = mvp.getName();
String name = attribute.getFullyQualifiedName();
if ("groups".equals(name)) {
Expression value = mvp.getValue();
// Array?
if (value instanceof ArrayInitializer) {
ArrayInitializer ai = (ArrayInitializer) value;
@SuppressWarnings("unchecked")
List<Expression> expressions = ai.expressions();
for (Expression e : expressions) {
Object v = e.resolveConstantExpressionValue();
String g = v != null ? v.toString() : e.toString();
addGroup(g);
}
}
else if (value instanceof Name) {
Object v = value.resolveConstantExpressionValue();
String boundValue = v != null ? v.toString() : value.toString();
addGroup(boundValue);
}
else if(value instanceof StringLiteral) {
addGroup(value.toString());
}
}
}
}
else if (isFactoryAnnotation(node.getTypeName().toString())) {
if (node.getParent() instanceof MethodDeclaration) {
m_annotationType = JDK15_ANNOTATION;
addFactoryMethod((MethodDeclaration) node.getParent(), JDK15_ANNOTATION);
}
}
return false;
}
public boolean isTestAnnotation(String annotation) {
return "Test".equals(annotation) || annotation.endsWith(".Test");
}
public boolean isFactoryAnnotation(String annotation) {
return "Factory".equals(annotation) || annotation.endsWith(".Factory");
}
public static void ppp(String s) {
System.out.println("[AnnotationVisitor] " + s);
}
}