diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java index 5dff9425ab90..8b767cf79eb5 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngXmlAttributeDescriptor.java @@ -149,6 +149,8 @@ public class RngXmlAttributeDescriptor extends BasicXmlAttributeDescriptor { return myElementDescriptor.getDeclaration(it.next()); } + @Override + @NotNull public Collection getDeclarations() { return ContainerUtil.map2List(myDeclarations, locator -> myElementDescriptor.getDeclaration(locator)); } @@ -227,4 +229,4 @@ public class RngXmlAttributeDescriptor extends BasicXmlAttributeDescriptor { } }}; } -} \ No newline at end of file +} diff --git a/xml/xml-psi-api/src/com/intellij/xml/XmlAttributeDescriptor.java b/xml/xml-psi-api/src/com/intellij/xml/XmlAttributeDescriptor.java index 5e37f41cca5e..ec80ed7f6e81 100644 --- a/xml/xml-psi-api/src/com/intellij/xml/XmlAttributeDescriptor.java +++ b/xml/xml-psi-api/src/com/intellij/xml/XmlAttributeDescriptor.java @@ -16,11 +16,16 @@ package com.intellij.xml; +import com.intellij.psi.PsiElement; import com.intellij.psi.meta.PsiMetaData; import com.intellij.psi.xml.XmlElement; import com.intellij.util.ArrayFactory; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; +import java.util.Collections; + /** * @author Mike */ @@ -43,4 +48,11 @@ public interface XmlAttributeDescriptor extends PsiMetaData { @Nullable String validateValue(XmlElement context, String value); + + @NotNull + default Collection getDeclarations() { + PsiElement declaration = getDeclaration(); + return declaration != null ? Collections.singleton(declaration) + : Collections.emptyList(); + } } diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java index b4fed2fdd29f..e55162acd4b7 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java @@ -20,6 +20,9 @@ import com.intellij.psi.xml.XmlElement; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.impl.BasicXmlAttributeDescriptor; import com.intellij.xml.impl.XmlEnumerationDescriptor; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; /** * @author Maxim.Mossienko @@ -80,6 +83,12 @@ public class HtmlAttributeDescriptorImpl extends BasicXmlAttributeDescriptor { return delegate.getDeclaration(); } + @NotNull + @Override + public Collection getDeclarations() { + return delegate.getDeclarations(); + } + @Override public String getName(PsiElement context) { return delegate.getName(context); diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeReference.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeReference.java index e2811448c6b8..2a38e17e3bd9 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeReference.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeReference.java @@ -18,19 +18,19 @@ package com.intellij.psi.impl.source.xml; import com.intellij.openapi.util.NullableLazyValue; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReference; +import com.intellij.psi.*; import com.intellij.psi.meta.PsiMetaOwner; import com.intellij.psi.xml.XmlAttribute; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.impl.XmlAttributeDescriptorEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class XmlAttributeReference implements PsiReference { +public class XmlAttributeReference implements PsiPolyVariantReference { private final NullableLazyValue myDescriptor = new NullableLazyValue() { @Override protected XmlAttributeDescriptor compute() { @@ -70,6 +70,13 @@ public class XmlAttributeReference implements PsiReference { return myAttribute.getName(); } + @NotNull + @Override + public ResolveResult[] multiResolve(boolean incompleteCode) { + final XmlAttributeDescriptor descriptor = getDescriptor(); + return descriptor != null ? PsiElementResolveResult.createResults(descriptor.getDeclarations()) + : ResolveResult.EMPTY_ARRAY; + } @Override public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException { String newName = newElementName; @@ -97,7 +104,9 @@ public class XmlAttributeReference implements PsiReference { @Override public boolean isReferenceTo(@NotNull PsiElement element) { - return myAttribute.getManager().areElementsEquivalent(element, resolve()); + PsiManager manager = getElement().getManager(); + return ContainerUtil.exists(multiResolve(false), result -> + result.isValidResult() && manager.areElementsEquivalent(element, result.getElement())); } @Override @@ -112,7 +121,7 @@ public class XmlAttributeReference implements PsiReference { } @Nullable - private XmlAttributeDescriptor getDescriptor() { + protected XmlAttributeDescriptor getDescriptor() { return myDescriptor.getValue(); } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java index 190da919ec2f..951a37240ec5 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java @@ -22,6 +22,8 @@ import com.intellij.util.ArrayUtilRt; import com.intellij.xml.XmlAttributeDescriptor; import org.jetbrains.annotations.Nullable; +import static com.intellij.util.containers.ContainerUtil.getFirstItem; + public abstract class BasicXmlAttributeDescriptor extends XmlEnumerationDescriptor implements XmlAttributeDescriptor { @Override public String validateValue(XmlElement context, String value) { @@ -51,12 +53,12 @@ public abstract class BasicXmlAttributeDescriptor extends XmlEnumerationDescript @Override protected PsiElement getEnumeratedValueDeclaration(XmlElement xmlElement, String value) { String[] values = getEnumeratedValues(); - if (values == null || values.length == 0) return getDeclaration(); - return ArrayUtilRt.find(values, value) != -1 ? getDeclaration() : null; + if (values == null || values.length == 0) return getFirstItem(getDeclarations()); + return ArrayUtilRt.find(values, value) != -1 ? getFirstItem(getDeclarations()) : null; } @Override protected PsiElement getDefaultValueDeclaration() { - return getDeclaration(); + return getFirstItem(getDeclarations()); } }