Set<PsiClass> (@NotNull PsiClass psiClass) { return CachedValuesManager.getCachedValue(psiClass, () -> { Set<PsiClass> result = new HashSet<>(); Set<PsiClass> visitedClasses = new HashSet<>(); Queue<PsiClass> notVisitedClasses = new LinkedList<>(); notVisitedClasses.add(psiClass); while (!notVisitedClasses.isEmpty()) { PsiClass notVisitedClass = notVisitedClasses.poll(); if (!isAbstractSealed(notVisitedClass) || visitedClasses.contains(notVisitedClass)) continue; visitedClasses.add(notVisitedClass); Collection<PsiClass> permittedClasses = PatternsInSwitchBlockHighlightingModel.getPermittedClasses(psiClass); result.addAll(permittedClasses); notVisitedClasses.addAll(permittedClasses); } return CachedValueProvider.Result.create(result, PsiModificationTracker.MODIFICATION_COUNT); }); }