void (PsiElement context, PsiClassType baseType, Processor<? super PsiClass> inheritorsProcessor) { Set<String> usedNames = new HashSet<>(); PsiElementFactory factory = JavaPsiFacade.getElementFactory(context.getProject()); PsiElement each = context; while (true) { PsiTypeParameterListOwner typed = PsiTreeUtil.getParentOfType(each, PsiTypeParameterListOwner.class); if (typed == null) break; for (PsiTypeParameter parameter : typed.getTypeParameters()) { if (baseType.isAssignableFrom(factory.createType(parameter)) && usedNames.add(parameter.getName())) { inheritorsProcessor.process(CompletionUtil.getOriginalOrSelf(parameter)); } } each = typed; } }