boolean (@NotNull PsiManager manager, @NotNull PsiClass candidateClass, @NotNull PsiClass baseClass, boolean checkDeep, @Nullable Set<PsiClass> checkedClasses) { if (candidateClass instanceof PsiAnonymousClass) { final PsiClass baseCandidateClass = ((PsiAnonymousClass)candidateClass).getBaseClassType().resolve(); if (baseCandidateClass != null) { if (!checkDeep) { return manager.areElementsEquivalent(baseCandidateClass, baseClass); } return InheritanceUtil.isInheritorOrSelf(baseCandidateClass, baseClass, true); } return false; } if(checkDeep && LOG.isDebugEnabled()){ LOG.debug("Using uncached version for " + candidateClass.getQualifiedName() + " and " + baseClass); } JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject()); if (hasObjectQualifiedName(baseClass)) { PsiClass objectClass = facade.findClass(CommonClassNames.JAVA_LANG_OBJECT, candidateClass.getResolveScope()); if (manager.areElementsEquivalent(baseClass, objectClass)) { if (manager.areElementsEquivalent(candidateClass, objectClass)) return false; if (checkDeep || candidateClass.isInterface()) return true; return manager.areElementsEquivalent(candidateClass.getSuperClass(), objectClass); } } if (!checkDeep) { if (candidateClass instanceof PsiCompiledElement) { String baseQName = baseClass.getQualifiedName(); if (baseQName == null) return false; if (CommonClassNames.JAVA_LANG_ENUM.equals(baseQName) && candidateClass.isEnum()) { return facade.findClass(baseQName, candidateClass.getResolveScope()) != null; } if (CommonClassNames.JAVA_LANG_ANNOTATION_ANNOTATION.equals(baseQName) && candidateClass.isAnnotationType()) { return facade.findClass(baseQName, candidateClass.getResolveScope()) != null; } boolean isCandidateInterface = candidateClass.isInterface(); boolean isBaseInterface = baseClass.isInterface(); if (isCandidateInterface == isBaseInterface && checkReferenceListWithQualifiedNamesInClsClass(baseQName, candidateClass.getExtendsList(), facade)) { return true; } return isBaseInterface && !isCandidateInterface && checkReferenceListWithQualifiedNamesInClsClass(baseQName, candidateClass.getImplementsList(), facade); } boolean isCandidateInterface = candidateClass.isInterface(); boolean isBaseInterface = baseClass.isInterface(); String baseName = baseClass.getName(); if (isCandidateInterface == isBaseInterface) { return PsiClassImplUtil.isInExtendsList(candidateClass, baseClass, baseName, manager); } if (!isCandidateInterface) { return PsiClassImplUtil.isInReferenceList(candidateClass.getImplementsList(), baseClass, baseName, manager); } return false; } return isInheritorWithoutCaching(manager, candidateClass, baseClass, checkedClasses); }