@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;
      }

      List pairs = node.values();
      for (Iterator it = pairs.iterator(); it.hasNext(); ) {
        MemberValuePair mvp = (MemberValuePair) it.next();
        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;
            List expressions = ai.expressions();
            for (Iterator it2 = expressions.iterator(); it2.hasNext(); ) {
              Expression e = (Expression) it2.next();
              addGroup(e.toString());
            }
          } else if (value instanceof SimpleName) {
            Object boundValue = value.resolveConstantExpressionValue();
            addGroup(boundValue.toString());
          } 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;
  }
 /*
  * @see ASTVisitor#visit(NormalAnnotation)
  * @since 3.0
  */
 public boolean visit(NormalAnnotation node) {
   this.fBuffer.append("@"); // $NON-NLS-1$
   node.getTypeName().accept(this);
   this.fBuffer.append("("); // $NON-NLS-1$
   for (Iterator it = node.values().iterator(); it.hasNext(); ) {
     MemberValuePair p = (MemberValuePair) it.next();
     p.accept(this);
     if (it.hasNext()) {
       this.fBuffer.append(","); // $NON-NLS-1$
     }
   }
   this.fBuffer.append(")"); // $NON-NLS-1$
   return false;
 }
  public boolean visit(NormalAnnotation annotation) {
    if (!isKnownAnnotation(annotation.getTypeName().getFullyQualifiedName())) {
      return false;
    }

    List values = annotation.values();

    if (null != values && !values.isEmpty()) {
      for (int i = 0; i < values.size(); i++) {
        MemberValuePair pair = (MemberValuePair) values.get(i);
        if ("parameters".equals(pair.getName().toString())) {
          Expression paramAttr = pair.getValue();
          if (paramAttr instanceof ArrayInitializer) {
            record((MethodDeclaration) annotation.getParent(), (ArrayInitializer) paramAttr);
          }
        }
      }
    }

    return false;
  }
  @Override
  public boolean visit(NormalAnnotation annotation) {
    String typeName = annotation.getTypeName().getFullyQualifiedName();
    if (!TEST_ANNOTATION.equals(typeName) && !TEST_ANNOTATION_FQN.equals(typeName)) {
      return false;
    }

    List values = annotation.values();

    if (null != values && !values.isEmpty()) {
      for (int i = 0; i < values.size(); i++) {
        MemberValuePair pair = (MemberValuePair) values.get(i);
        String name = pair.getName().toString();
        if (DEPENDS_ON_METHODS.equals(name)) {
          m_dependsOnMethods.addAll(extractValues(pair.getValue()));
        } else if (DEPENDS_ON_GROUPS.equals(name)) {
          m_dependsOnGroups.addAll(extractValues(pair.getValue()));
        }
      }
    }

    return false;
  }
 /* (non-Javadoc)
  * @see org.eclipse.jdt.internal.corext.dom.GenericVisitor#visit(org.eclipse.jdt.core.dom.MarkerAnnotation)
  */
 @Override
 public boolean visit(NormalAnnotation node) {
   typeRefFound(node.getTypeName());
   doVisitChildren(node.values());
   return false;
 }