package org.angularjs.codeInsight.refs;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceBase;
import com.intellij.psi.impl.source.resolve.ResolveCache;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dennis.Ushakov
*/
public abstract class AngularJSReferenceBase<T extends PsiElement> extends PsiReferenceBase<T> {
public AngularJSReferenceBase(T element, TextRange textRange) {
super(element, textRange, true);
}
@Override
public PsiElement resolve() {
return ResolveCache.getInstance(getElement().getProject()).resolveWithCaching(this, MyResolver.INSTANCE, false, false);
}
@Nullable
public abstract PsiElement resolveInner();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AngularJSReferenceBase that = (AngularJSReferenceBase)o;
if (!myElement.equals(that.myElement)) return false;
return true;
}
@Override
public int hashCode() {
return myElement.hashCode();
}
private static class MyResolver implements ResolveCache.Resolver {
private static final MyResolver INSTANCE = new MyResolver();
@Nullable
public PsiElement resolve(@NotNull PsiReference ref, boolean incompleteCode) {
return ((AngularJSReferenceBase)ref).resolveInner();
}
}
}