@Override
  public PsiAnnotationMemberValue getDefaultValue() {
    PsiMethodStub stub = getStub();
    if (stub != null) {
      String text = stub.getDefaultValueText();
      if (StringUtil.isEmpty(text)) return null;

      PsiAnnotationMemberValue value = dereference(myCachedDefaultValue);
      if (value != null) {
        return value;
      }

      value = JavaPsiFacade.getElementFactory(getProject()).createAnnotationFromText("@Foo(" + text + ")", this).findAttributeValue(null);
      myCachedDefaultValue = new SoftReference<>(value);
      return value;
    }

    myCachedDefaultValue = null;

    boolean expectedDefault = false;
    TreeElement childNode = getNode().getFirstChildNode();
    while (childNode != null) {
      IElementType type = childNode.getElementType();
      if (type == JavaTokenType.DEFAULT_KEYWORD) {
        expectedDefault = true;
      }
      else if (expectedDefault && ElementType.ANNOTATION_MEMBER_VALUE_BIT_SET.contains(type)) {
        return (PsiAnnotationMemberValue)childNode.getPsi();
      }

      childNode = childNode.getTreeNext();
    }
    return null;
  }
@Override
  public PsiAnnotationMemberValue getDefaultValue()