private void genMetaForPty(
      MethodDeclaration astNode, final JstType jstType, final Annotation anno) {

    CustomType cType = getCustomType(jstType);
    MethodKey mtdKey = MethodKey.genMethodKey(astNode);
    CustomMethod cMtd = cType.getCustomMethod(mtdKey);
    if (cMtd == null) {
      cMtd = new CustomMethod(mtdKey);
      cType.addCustomMethod(cMtd);
    }

    cMtd.setIsProperty(true);

    if (anno instanceof NormalAnnotation) {
      NormalAnnotation normalAnno = (NormalAnnotation) anno;
      List<?> annos = normalAnno.values();
      MemberValuePair pair = (MemberValuePair) annos.get(0);
      String name = getValue(pair.getValue(), astNode, jstType);
      if (name != null) {
        cMtd.setJstName(name);
        return;
      }
    }

    String mtdName = cMtd.getJstName();
    if (mtdName.startsWith("get")) {
      mtdName = mtdName.substring(3, 4).toLowerCase() + mtdName.substring(4, mtdName.length());
      cMtd.setJstName(mtdName);
    } else if (mtdName.startsWith("set")) {
      mtdName = mtdName.substring(3, 4).toLowerCase() + mtdName.substring(4, mtdName.length());
      cMtd.setJstName(mtdName);
    }
  }
 /*
  * @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;
 }
  @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;
  }
  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;
  }
  private List<MemberValuePair> getAnnoMemberPairs(final Annotation anno) {

    if (!(anno instanceof NormalAnnotation)) {
      return Collections.emptyList();
    }

    NormalAnnotation nAnno = (NormalAnnotation) anno;
    MemberValuePair mvPair;
    String name;
    List<MemberValuePair> annoList = new ArrayList<MemberValuePair>();

    for (Object pair : nAnno.values()) {
      if (pair instanceof MemberValuePair) {
        mvPair = (MemberValuePair) pair;
        name = getName(mvPair);
        if (ANNO_NAME.equals(name) || ANNO_VALUE.equals(name)) {
          annoList.add(mvPair);
        }
      }
    }

    return annoList;
  }
 /* (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;
 }