WEB-37928 Angular template - allow to choose which source of binding to navigate to.

This commit is contained in:
Piotr Tomiak
2019-04-05 10:28:42 +02:00
parent 03acb49b5a
commit c239cb0e30
5 changed files with 43 additions and 9 deletions
@@ -149,6 +149,8 @@ public class RngXmlAttributeDescriptor extends BasicXmlAttributeDescriptor {
return myElementDescriptor.getDeclaration(it.next());
}
@Override
@NotNull
public Collection<PsiElement> getDeclarations() {
return ContainerUtil.map2List(myDeclarations, locator -> myElementDescriptor.getDeclaration(locator));
}
@@ -227,4 +229,4 @@ public class RngXmlAttributeDescriptor extends BasicXmlAttributeDescriptor {
}
}};
}
}
}
@@ -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<PsiElement> getDeclarations() {
PsiElement declaration = getDeclaration();
return declaration != null ? Collections.singleton(declaration)
: Collections.emptyList();
}
}
@@ -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<PsiElement> getDeclarations() {
return delegate.getDeclarations();
}
@Override
public String getName(PsiElement context) {
return delegate.getName(context);
@@ -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<XmlAttributeDescriptor> myDescriptor = new NullableLazyValue<XmlAttributeDescriptor>() {
@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();
}
}
@@ -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());
}
}