PsiElement (final XmlEntityDecl entityDecl, final PsiFile targetFile, final XmlEntityDecl.EntityContextType type, final XmlEntityRef entityRef) { CachedValue<PsiElement> value = entityRef.getUserData(PARSED_DECL_KEY); if (value == null) { value = CachedValuesManager.getManager(entityDecl.getProject()).createCachedValue(() -> { final PsiElement res = entityDecl.parse(targetFile, type, entityRef); if (res == null) return new CachedValueProvider.Result<>(null, targetFile); if (!entityDecl.isInternalReference()) XmlEntityCache.copyEntityCaches(res.getContainingFile(), targetFile); return new CachedValueProvider.Result<>(res, res.getUserData(XmlElement.DEPENDING_ELEMENT), entityDecl, targetFile, entityRef); }, false); value = ((XmlEntityRefImpl)entityRef).putUserDataIfAbsent(PARSED_DECL_KEY, value); } return value.getValue(); }