IDEA-51134: Refactor / rename could work for JSP taglib prefix

This commit is contained in:
Dmitry Avdeev
2010-07-09 16:41:39 +04:00
parent a38aac8e68
commit bdec4ca4e5
5 changed files with 31 additions and 17 deletions
@@ -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;
}
@@ -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());
}
}
@@ -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<XmlElement> {
private final NullableLazyValue<SchemaPrefix> myPrefix = new NullableLazyValue<SchemaPrefix>() {
@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<XmlElement> {
public SchemaPrefixReference(XmlElement element, TextRange range, String name) {
super(element, range, true);
myName = name;
}
public String getNamespacePrefix() {
@@ -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<String> guessNamespace(final PsiFile file, String tagName) {
@@ -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;