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);
    }
  }
  private void process(
      MethodDeclaration astNode,
      final JstType jstType,
      final Annotation anno,
      final CustomType cType,
      final CustomInfo cInfo) {
    MethodKey mtdKey = MethodKey.genMethodKey(astNode);
    CustomMethod cMtd = cType.getCustomMethod(mtdKey);
    if (cMtd == null) {
      cMtd = new CustomMethod(mtdKey);
      cType.addCustomMethod(cMtd);
    }

    String name;
    String value = null;
    if (anno instanceof NormalAnnotation) {
      List<MemberValuePair> annos = getAnnoMemberPairs(anno);
      if (annos.size() > 0) {
        for (MemberValuePair pair : annos) {
          name = getName(pair);
          if (ANNO_NAME.equals(name) || ANNO_VALUE.equals(name)) {
            if (pair.getValue() instanceof QualifiedName) {
              value = getValue((QualifiedName) pair.getValue(), astNode, jstType);
            } else {
              value = getValue(pair.getValue(), astNode, jstType);
            }
            break;
          }
        }
      }
    } else if (anno instanceof SingleMemberAnnotation) {
      value = getValue(((SingleMemberAnnotation) anno).getValue(), astNode, jstType);
      cInfo.setName(value);
    } else if (cInfo.isMappedToJS() || cInfo.isMappedToVJO()) {
      value = astNode.getName().toString();
    }

    if (value == null) {
      return;
    }

    cMtd.setAttr(cInfo.getAttr());
    int index = value.lastIndexOf(".");
    if (index > 0) {
      cMtd.setJstOwnerTypeName(value.substring(0, index));
      cMtd.setJstName(value.substring(index + 1));
      cInfo.setName(value);
    } else {
      cMtd.setJstName(value);
      cInfo.setName(value);
    }
  }
  private void process(
      AbstractTypeDeclaration astNode,
      final JstType jstType,
      final Annotation anno,
      final CustomType cType,
      final CustomInfo cInfo) {
    String name;
    String value = null;
    if (anno instanceof NormalAnnotation) {
      List<MemberValuePair> annos = getAnnoMemberPairs(anno);
      if (annos.size() > 0) {
        for (MemberValuePair pair : annos) {
          name = getName(pair);
          if (ANNO_NAME.equals(name) || ANNO_VALUE.equals(name)) {
            if (pair.getValue() instanceof QualifiedName) {
              value = getValue((QualifiedName) pair.getValue(), astNode, jstType);
            } else {
              value = getValue(pair.getValue(), astNode, jstType);
            }
            break;
          }
        }
        cInfo.setName(value);
      }
    } else if (anno instanceof SingleMemberAnnotation) {
      value = getValue(((SingleMemberAnnotation) anno).getValue(), astNode, jstType);
      cInfo.setName(value);
    } else {
      value = astNode.getName().toString();
    }

    if (value == null) {
      return;
    }
    cType.setAttr(cInfo.getAttr());
    cType.setJstName(value);
  }
  private void process(
      FieldDeclaration astNode,
      final JstType jstType,
      final Annotation anno,
      final CustomType cType,
      final CustomInfo cInfo) {

    String value = null;
    if (anno instanceof NormalAnnotation) {
      List<MemberValuePair> annos = getAnnoMemberPairs(anno);
      String name;
      if (annos.size() > 0) {
        for (MemberValuePair pair : annos) {
          name = getName(pair);
          if (ANNO_NAME.equals(name) || ANNO_VALUE.equals(name)) {
            if (pair.getValue() instanceof QualifiedName) {
              value = getValue((QualifiedName) pair.getValue(), astNode, jstType);
            } else {
              value = getValue(pair.getValue(), astNode, jstType);
            }
            cInfo.setName(value);
            break;
          }
        }
      }
    } else if (anno instanceof SingleMemberAnnotation) {
      value = getValue(((SingleMemberAnnotation) anno).getValue(), astNode, jstType);
      cInfo.setName(value);
    }

    if (value == null) {
      return;
    }

    String fName = null;
    String tName = null;

    if (value != null) {
      cInfo.setName(value);
      int index = value.lastIndexOf(".");
      if (index < 0) {
        fName = value;
      } else {
        fName = value.substring(index + 1, value.length());
        tName = value.substring(0, index);
      }
    }

    VariableDeclarationFragment v;
    String vName;
    CustomField cField;
    for (Object o : astNode.fragments()) {
      if (o instanceof VariableDeclarationFragment) {
        v = (VariableDeclarationFragment) o;
        vName = v.getName().toString();
        cField = cType.getCustomField(vName);
        if (cField == null) {
          cField = new CustomField(vName);
          cType.addCustomField(cField);
        }
        cField.setAttr(cInfo.getAttr());
        cField.setJstName(fName);
        cField.setJstOwnerTypeName(tName);
      }
    }
  }