package org.angularjs.codeInsight.refs; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiReferenceBase; import com.intellij.psi.ResolveResult; import com.intellij.psi.impl.source.resolve.ResolveCache; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Irina.Chernushina on 2/12/2016. */ public abstract class AngularPolyReferenceBase<T extends PsiElement> extends PsiReferenceBase<T> implements PsiPolyVariantReference { public AngularPolyReferenceBase(T element, TextRange rangeInElement, boolean soft) { super(element, rangeInElement, soft); } public AngularPolyReferenceBase(T element, TextRange rangeInElement) { super(element, rangeInElement); } public AngularPolyReferenceBase(T element, boolean soft) { super(element, soft); } public AngularPolyReferenceBase(@NotNull T element) { super(element); } @NotNull @Override public ResolveResult[] multiResolve(boolean incompleteCode) { return ResolveCache.getInstance(getElement().getProject()).resolveWithCaching(this, MyResolver.INSTANCE, false, false); } @Override public boolean isReferenceTo(PsiElement element) { final ResolveResult[] results = multiResolve(false); for (ResolveResult result : results) { if (getElement().getManager().areElementsEquivalent(result.getElement(), element)) { return true; } } return false; } @Nullable @Override public PsiElement resolve() { ResolveResult[] resolveResults = multiResolve(false); return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } @NotNull protected abstract ResolveResult[] resolveInner(); private static class MyResolver implements ResolveCache.PolyVariantResolver<PsiPolyVariantReference> { private final static MyResolver INSTANCE = new MyResolver(); @NotNull @Override public ResolveResult[] resolve(@NotNull PsiPolyVariantReference reference, boolean incompleteCode) { return ((AngularPolyReferenceBase) reference).resolveInner(); } } }