Set<PsiClass> (Set<PsiClass> classes) { HashSet<PsiClass> sealedUpperClasses = new HashSet<>(); Set<PsiClass> visited = new HashSet<>(); Queue<PsiClass> nonVisited = new ArrayDeque<>(classes); while (!nonVisited.isEmpty()) { PsiClass polled = nonVisited.poll(); if (!visited.add(polled)) { continue; } PsiClassType[] types = polled.getSuperTypes(); for (PsiClassType type : types) { PsiClass superClass = PsiUtil.resolveClassInClassTypeOnly(TypeConversionUtil.erasure(type)); if (isAbstractSealed(superClass)) { nonVisited.add(superClass); sealedUpperClasses.add(superClass); } } } return sealedUpperClasses; }