boolean (final XmlFile element, PsiScopeProcessor processor, ResolveState state, PsiElement lastParent, PsiElement place) { CachedValue<XmlTag[]> myCachedScriptTags = element.getUserData(CachedScriptTagsKey); if (myCachedScriptTags == null) { myCachedScriptTags = CachedValuesManager.getManager(element.getProject()) .createCachedValue(() -> { final List<XmlTag> scriptTags = new ArrayList<>(); final XmlDocument document = HtmlPsiUtil.getRealXmlDocument(element.getDocument()); if (document != null) { PsiElementProcessor psiElementProcessor = new PsiElementProcessor() { @Override public boolean execute(final @NotNull PsiElement element1) { if (element1 instanceof XmlTag tag) { if (HtmlUtil.SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) { final XmlElementDescriptor descriptor = tag.getDescriptor(); if (descriptor != null && HtmlUtil.SCRIPT_TAG_NAME.equals(descriptor.getName())) { scriptTags.add(tag); } } } return true; } }; XmlPsiUtil.processXmlElements(document, psiElementProcessor, true); } return new CachedValueProvider.Result<>(scriptTags.toArray(XmlTag.EMPTY), element); }, false); element.putUserData(CachedScriptTagsKey, myCachedScriptTags); } if (ProcessingDeclarationsFlag.get() != null) return true; try { ProcessingDeclarationsFlag.set(""); for (XmlTag tag : myCachedScriptTags.getValue()) { final XmlTagChild[] children = tag.getValue().getChildren(); for (XmlTagChild child : children) { if (!child.processDeclarations(processor, state, null, place)) return false; } if (tag.getAttributeValue("src") != null) { final XmlAttribute attribute = tag.getAttribute("src", null); if (attribute != null) { final PsiFile psiFile = FileReferenceUtil.findFile(attribute.getValueElement()); if (psiFile != null && psiFile.isValid()) { if (!psiFile.processDeclarations(processor, state, null, place)) { return false; } } } } } } finally { ProcessingDeclarationsFlag.set(null); } return true; }