PsiElementVisitor (@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { return new XmlElementVisitor() { private Boolean isXml; private boolean isXmlFile(XmlElement element) { if (isXml == null) { final PsiFile file = element.getContainingFile(); isXml = file instanceof XmlFile && !InjectedLanguageManager.getInstance(element.getProject()).isInjectedFragment(file); } return isXml.booleanValue(); } @Override public void visitXmlToken(final @NotNull XmlToken token) { if (isXmlFile(token) && token.getTokenType() == XmlTokenType.XML_NAME) { PsiElement element = token.getPrevSibling(); while(element instanceof PsiWhiteSpace) element = element.getPrevSibling(); if (element instanceof XmlToken && ((XmlToken)element).getTokenType() == XmlTokenType.XML_START_TAG_START) { PsiElement parent = element.getParent(); if (parent instanceof XmlTag tag && !(token.getNextSibling() instanceof OuterLanguageElement)) { checkUnboundNamespacePrefix(tag, tag, tag.getNamespacePrefix(), token, holder, isOnTheFly); } } } } @Override public void visitXmlAttribute(final @NotNull XmlAttribute attribute) { if (!isXmlFile(attribute)) { return; } final String namespace = attribute.getNamespace(); if (attribute.isNamespaceDeclaration() || XmlUtil.XML_SCHEMA_INSTANCE_URI.equals(namespace)) { return; } XmlTag tag = attribute.getParent(); if (tag == null) return; XmlElementDescriptor elementDescriptor = tag.getDescriptor(); if (elementDescriptor == null || elementDescriptor instanceof AnyXmlElementDescriptor) { return; } final String name = attribute.getName(); checkUnboundNamespacePrefix(attribute, tag, XmlUtil.findPrefixByQualifiedName(name), null, holder, isOnTheFly); } @Override public void visitXmlAttributeValue(@NotNull XmlAttributeValue value) { PsiReference[] references = value.getReferences(); for (PsiReference reference : references) { if (reference instanceof SchemaPrefixReference) { if (!XML.equals(((SchemaPrefixReference)reference).getNamespacePrefix()) && reference.resolve() == null) { holder.registerProblem(reference, XmlAnalysisBundle.message("xml.inspections.unbound.namespace", ((SchemaPrefixReference)reference).getNamespacePrefix()), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); } } } } }; }