PsiMethod (final PsiElement parent) { if (parent instanceof PsiNameValuePair) { final PsiAnnotation annotation = PsiTreeUtil.getParentOfType(parent, PsiAnnotation.class); if (annotation != null) { final PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement(); if (referenceElement != null) { PsiElement resolved = referenceElement.resolve(); if (resolved != null) { final String name = ((PsiNameValuePair)parent).getName(); PsiMethod[] methods = ((PsiClass)resolved).findMethodsByName(name == null? PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME : name, false); if (methods.length == 1) { return methods[0]; } } } } } final PsiMethod first; if (parent.getParent() instanceof PsiCall) { first = ((PsiCall)parent.getParent()).resolveMethod(); } else { first = PsiTreeUtil.getParentOfType(parent, PsiMethod.class, false); } if (first == null || first.getContainingClass() == null) return null; final LinkedList<PsiMethod> methods = new LinkedList<>(); methods.add(first); while (!methods.isEmpty()) { final PsiMethod method = methods.removeFirst(); final PsiClass psiClass = method.getContainingClass(); if (psiClass != null && psiClass.getQualifiedName() != null) { return method; } else { ContainerUtil.addAll(methods, method.findSuperMethods()); } } return null; }