blob: 3198b0aee193cc0e5cf656d0b7bf06d17ccf986c [file] [log] [blame]
/*
* Copyright 2005 Sascha Weinreuter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.lang.xpath.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.util.IncorrectOperationException;
import org.intellij.lang.xpath.context.ContextProvider;
import org.intellij.lang.xpath.context.NamespaceContext;
import org.intellij.lang.xpath.psi.PrefixReference;
import org.intellij.lang.xpath.psi.QNameElement;
import org.intellij.lang.xpath.psi.XPathNodeTest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
class PrefixReferenceImpl extends ReferenceBase implements PrefixReference {
public PrefixReferenceImpl(QNameElement element, ASTNode nameNode) {
super(element, nameNode);
}
@Nullable
public PsiElement resolve() {
final ContextProvider provider = getElement().getXPathContext();
final NamespaceContext namespaceContext = provider.getNamespaceContext();
if (namespaceContext != null) {
return namespaceContext.resolve(getCanonicalText(), provider.getContextElement());
} else {
return null;
}
}
@SuppressWarnings({"ConstantConditions"})
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
final XPathNodeTest expr =
(XPathNodeTest)XPathChangeUtil.createExpression(getElement(), newElementName + ":x").getFirstChild().getChildren()[1];
final ASTNode nameNode = getNameNode();
nameNode.getTreeParent().replaceChild(nameNode, ((PrefixedNameImpl)expr.getQName()).getPrefixNode());
return getElement();
}
@NotNull
public Object[] getVariants() {
// handled in XPathCompletionData
return EMPTY_ARRAY;
}
public boolean isSoft() {
if ("*".equals(getPrefix())) {
return true;
}
final ContextProvider context = getElement().getXPathContext();
if (context instanceof ContextProvider.DefaultProvider) return true;
return !canResolve();
}
public String getPrefix() {
return getCanonicalText();
}
public boolean isUnresolved() {
if (!canResolve()) return true;
if (resolve() != null) {
return false;
}
final ContextProvider provider = getElement().getXPathContext();
final NamespaceContext namespaceContext = provider.getNamespaceContext();
assert namespaceContext != null;
final String prefix = getCanonicalText();
return !namespaceContext.getKnownPrefixes(provider.getContextElement()).contains(prefix);
}
private boolean canResolve() {
final NamespaceContext namespaceContext = getElement().getXPathContext().getNamespaceContext();
return namespaceContext != null && !"xml".equals(getCanonicalText());
}
}