boolean (@NotNull PsiConstructorCall place, @NotNull PsiClass constructorClass) { // indirect instantiation via anonymous class is ok if (place instanceof PsiNewExpression && ((PsiNewExpression)place).getAnonymousClass() != null) return false; PsiElement curElement = place; PsiClass containingClass = constructorClass.getContainingClass(); while (true) { PsiClass aClass = PsiTreeUtil.getParentOfType(curElement, PsiClass.class); if (aClass == null) return false; curElement = aClass; if ((aClass.isInheritor(constructorClass, true) || containingClass != null && aClass.isInheritor(containingClass, true)) && !JavaPsiFacade.getInstance(aClass.getProject()).arePackagesTheSame(aClass, constructorClass)) { return true; } } }