void (@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) { if (!EP_NAME.hasAnyExtensions(context.getProject())) { return; } final PsiFile containingFile = ((InjectionRegistrarImpl)registrar).getHostPsiFile(); Project project = containingFile.getProject(); long modificationCount = PsiManager.getInstance(project).getModificationTracker().getModificationCount(); Pair<PsiElement, PsiElement[]> pair = computeAnchorAndOperands(context); PsiElement anchor = pair.first; PsiElement[] operands = pair.second; Integer noInjectionTimestamp = anchor.getUserData(NO_CONCAT_INJECTION_TIMESTAMP); InjectionResult result; ParameterizedCachedValue<InjectionResult, PsiElement> data = null; if (operands.length == 0 || noInjectionTimestamp != null && noInjectionTimestamp == modificationCount) { result = null; } else { data = anchor.getUserData(INJECTED_PSI_IN_CONCATENATION); result = data == null ? null : data.getValue(context); if (result == null || !result.isValid()) { result = doCompute(containingFile, project, anchor, operands); } } if (result != null) { ((InjectionRegistrarImpl)registrar).addToResults(result); if (data == null) { CachedValueProvider.Result<InjectionResult> cachedResult = CachedValueProvider.Result.create(result, getInstance(myProject)); data = CachedValuesManager.getManager(project).createParameterizedCachedValue( context1 -> { PsiFile containingFile1 = context1.getContainingFile(); Project project1 = containingFile1.getProject(); Pair<PsiElement, PsiElement[]> pair1 = computeAnchorAndOperands(context1); InjectionResult result1 = pair1.second.length == 0 ? null : doCompute(containingFile1, project1, pair1.first, pair1.second); return result1 == null ? null : CachedValueProvider.Result.create(result1, getInstance(myProject)); }, false); ((PsiParameterizedCachedValue<InjectionResult, PsiElement>)data).setValue(cachedResult); anchor.putUserData(INJECTED_PSI_IN_CONCATENATION, data); if (anchor.getUserData(NO_CONCAT_INJECTION_TIMESTAMP) != null) { anchor.putUserData(NO_CONCAT_INJECTION_TIMESTAMP, null); } } } else { // cache no-injection flag if (anchor.getUserData(INJECTED_PSI_IN_CONCATENATION) != null) { anchor.putUserData(INJECTED_PSI_IN_CONCATENATION, null); } anchor.putUserData(NO_CONCAT_INJECTION_TIMESTAMP, (int)modificationCount); } }