List<PsiType> (@NotNull PsiElement context, @NotNull PsiType type) { return CachedValuesManager.getCachedValue(context, () -> { Map<PsiType, List<PsiType>> result = ConcurrentFactoryMap.createMap(descriptionType -> { PsiType capturedToplevel = PsiUtil.captureToplevelWildcards(descriptionType, context); ClassResolveResult resolve = PsiUtil.resolveGenericsClassInType(capturedToplevel); PsiClass selectorClass = resolve.getElement(); PsiSubstitutor substitutor = resolve.getSubstitutor(); if (selectorClass == null) return null; return ContainerUtil.map(selectorClass.getRecordComponents(), component -> substitutor.substitute(component.getType())); }); return CachedValueProvider.Result.create(result, PsiModificationTracker.MODIFICATION_COUNT); }).get(type); }