void (@NotNull PsiElement element, @NotNull PsiFile hostPsiFile, boolean probeUp, @NotNull PsiLanguageInjectionHost.InjectedPsiVisitor visitor) { element = skipNonInjectablePsi(element, probeUp); if (element == null) return; InjectedLanguageManagerImpl injectedManager = InjectedLanguageManagerImpl.getInstanceImpl(hostPsiFile.getProject()); InjectionResult result = null; PsiElement current; for (current = element; current != null && current != hostPsiFile && !(current instanceof PsiDirectory); ) { ProgressManager.checkCanceled(); if ("EL".equals(current.getLanguage().getID())) break; result = SoftReference.deref(current.getUserData(INJECTED_PSI)); if (result == null || !result.isModCountUpToDate() || !result.isValid()) { result = injectedManager.processInPlaceInjectorsFor(hostPsiFile, current); preventResultFromGCWhileInjectedPsiIsReachable(result); } current = current.getParent(); if (result != null) { if (result.files != null) { for (PsiFile injectedPsiFile : result.files) { Place place = getShreds(injectedPsiFile); if (place.isValid()) { // check that injections found intersect with queried element boolean intersects = intersects(element, place); if (intersects) { visitor.visit(injectedPsiFile, place); } } } } if (result.references != null && visitor instanceof InjectedReferenceVisitor refVisitor) { for (Pair<ReferenceInjector, Place> pair : result.references) { Place place = pair.getSecond(); if (place.isValid()) { // check that injections found intersect with queried element boolean intersects = intersects(element, place); if (intersects) { ReferenceInjector injector = pair.getFirst(); refVisitor.visitInjectedReference(injector, place); } } } } break; // found injection, stop } if (!probeUp) { break; } } if (element != current && (probeUp || result != null)) { cacheResults(element, current, hostPsiFile, result); } }