diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnboundNsPrefixInspection.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnboundNsPrefixInspection.java index 5ae358adbe44..80dee4e99f90 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnboundNsPrefixInspection.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlUnboundNsPrefixInspection.java @@ -116,7 +116,7 @@ public class XmlUnboundNsPrefixInspection extends XmlSuppressableInspectionTool if (!HighlightLevelUtil.shouldInspect(containingFile)) return; final XmlExtension extension = XmlExtension.getExtension(containingFile); - if (extension.isPrefixDeclared(context, namespacePrefix)) { + if (extension.getPrefixDeclaration(context, namespacePrefix) != null) { return; } diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefix.java b/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefix.java index af375f14da16..54c10e76fd95 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefix.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefix.java @@ -20,6 +20,7 @@ import com.intellij.psi.impl.RenameableFakePsiElement; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlFile; import com.intellij.util.Icons; import org.jetbrains.annotations.NotNull; @@ -73,6 +74,7 @@ public class SchemaPrefix extends RenameableFakePsiElement { @NotNull @Override public SearchScope getUseScope() { - return new LocalSearchScope(getDeclaration().getParent()); + XmlAttribute declaration = getDeclaration(); + return new LocalSearchScope(declaration.isNamespaceDeclaration() ? declaration.getParent() : ((XmlFile)declaration.getContainingFile()).getDocument()); } } diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java b/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java index ecff86ab0f34..0cf3ce3aa5ab 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java @@ -19,12 +19,13 @@ import com.intellij.openapi.util.NullableLazyValue; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceBase; -import com.intellij.psi.xml.XmlAttribute; -import com.intellij.psi.xml.XmlElement; -import com.intellij.psi.xml.XmlTag; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.SearchScope; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.*; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; -import com.intellij.xml.util.XmlUtil; +import com.intellij.xml.XmlExtension; import org.jetbrains.annotations.NotNull; /** @@ -35,16 +36,26 @@ public class SchemaPrefixReference extends PsiReferenceBase { private final NullableLazyValue myPrefix = new NullableLazyValue() { @Override protected SchemaPrefix compute() { - if (myElement instanceof XmlAttribute && ((XmlAttribute)myElement).isNamespaceDeclaration()) { + if (myElement instanceof XmlAttribute && (((XmlAttribute)myElement).isNamespaceDeclaration())) { return new SchemaPrefix((XmlAttribute)myElement, getRangeInElement(), myName); } + else if (myElement instanceof XmlAttributeValue && + ((XmlAttribute)((XmlAttributeValue)myElement).getParent()).getLocalName().equals("prefix")) { + return new SchemaPrefix((XmlAttribute)myElement.getParent(), getRangeInElement().shiftRight(myElement.getStartOffsetInParent()), myName) { + @NotNull + @Override + public SearchScope getUseScope() { + return new LocalSearchScope(((XmlFile)myElement.getContainingFile()).getDocument()); + } + }; + } else { - final PsiElement declaration = XmlUtil.findNamespaceDeclaration(myElement, myName); - if (declaration instanceof XmlAttribute) { - final XmlAttribute attribute = (XmlAttribute)declaration; - final String prefix = attribute.getNamespacePrefix(); + XmlExtension extension = XmlExtension.getExtension(myElement.getContainingFile()); + final XmlAttribute declaration = extension.getPrefixDeclaration(PsiTreeUtil.getParentOfType(myElement, XmlTag.class, false), myName); + if (declaration != null) { + final String prefix = declaration.getNamespacePrefix(); final TextRange textRange = TextRange.from(prefix.length() + 1, myName.length()); - return new SchemaPrefix(attribute, textRange, myName); + return new SchemaPrefix(declaration, textRange, myName); } } return null; @@ -56,7 +67,6 @@ public class SchemaPrefixReference extends PsiReferenceBase { public SchemaPrefixReference(XmlElement element, TextRange range, String name) { super(element, range, true); myName = name; - } public String getNamespacePrefix() { diff --git a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java index 59bce65596ba..678ecb4599a8 100644 --- a/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java +++ b/xml/impl/src/com/intellij/xml/DefaultXmlExtension.java @@ -242,15 +242,16 @@ public class DefaultXmlExtension extends XmlExtension { } } - public boolean isPrefixDeclared(final XmlTag context, String namespacePrefix) { + public XmlAttribute getPrefixDeclaration(final XmlTag context, String namespacePrefix) { @NonNls String nsDeclarationAttrName = null; for(XmlTag t = context; t != null; t = t.getParentTag()) { if (t.hasNamespaceDeclarations()) { if (nsDeclarationAttrName == null) nsDeclarationAttrName = namespacePrefix.length() > 0 ? "xmlns:"+namespacePrefix:"xmlns"; - if (t.getAttributeValue(nsDeclarationAttrName) != null) return true; + XmlAttribute attribute = t.getAttribute(nsDeclarationAttrName); + if (attribute != null) return attribute; } } - return false; + return null; } private static Set guessNamespace(final PsiFile file, String tagName) { diff --git a/xml/impl/src/com/intellij/xml/XmlExtension.java b/xml/impl/src/com/intellij/xml/XmlExtension.java index 1fee3bc24319..a2b39f8edc60 100644 --- a/xml/impl/src/com/intellij/xml/XmlExtension.java +++ b/xml/impl/src/com/intellij/xml/XmlExtension.java @@ -153,7 +153,8 @@ public abstract class XmlExtension { return HighlightInfoType.ERROR; } - public abstract boolean isPrefixDeclared(final XmlTag context, String namespacePrefix); + @Nullable + public abstract XmlAttribute getPrefixDeclaration(final XmlTag context, String namespacePrefix); public boolean shouldBeHighlightedAsTag(XmlTag tag) { return true;