PsiAnnotationMemberValue (@NotNull PsiElement element, @NotNull ClsElementImpl parent) { if (element instanceof PsiExpression) { return psiToClsExpression((PsiExpression)element, parent); } else if (element instanceof PsiArrayInitializerMemberValue) { PsiAnnotationMemberValue[] initializers = ((PsiArrayInitializerMemberValue)element).getInitializers(); PsiAnnotationMemberValue[] clsInitializers = new PsiAnnotationMemberValue[initializers.length]; ClsArrayInitializerMemberValueImpl arrayValue = new ClsArrayInitializerMemberValueImpl(parent, clsInitializers); for (int i = 0; i < initializers.length; i++) { clsInitializers[i] = getMemberValue(initializers[i], arrayValue); } return arrayValue; } else if (element instanceof PsiAnnotation) { final PsiAnnotation psiAnnotation = (PsiAnnotation)element; final PsiJavaCodeReferenceElement referenceElement = psiAnnotation.getNameReferenceElement(); assert referenceElement != null : psiAnnotation; final String canonicalText = referenceElement.getText(); // class file has FQNs return new ClsAnnotationValueImpl(parent) { @Override protected ClsJavaCodeReferenceElementImpl createReference() { return new ClsJavaCodeReferenceElementImpl(this, canonicalText); } @Override protected ClsAnnotationParameterListImpl createParameterList() { PsiNameValuePair[] psiAttributes = psiAnnotation.getParameterList().getAttributes(); return new ClsAnnotationParameterListImpl(this, psiAttributes); } @Override public PsiAnnotationOwner getOwner() { return (PsiAnnotationOwner)getParent(); } }; } else { LOG.error("Unexpected source element for annotation member value: " + element); return null; } }