package org.jetbrains.plugins.clojure.psi.resolve.processors;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.scope.ElementClassHint;
import com.intellij.psi.scope.NameHint;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.util.containers.HashSet;
import org.jetbrains.plugins.clojure.psi.resolve.ClojureResolveResult;
/**
* @author ilyas
*/
public abstract class ResolveProcessor implements PsiScopeProcessor, NameHint, ElementClassHint {
protected HashSet<ClojureResolveResult> myCandidates = new HashSet<ClojureResolveResult>();
protected final String myName;
private final ResolveKind[] myKinds;
public ResolveProcessor(String myName, ResolveKind[] kinds) {
this.myName = myName;
myKinds = kinds;
}
public ClojureResolveResult[] getCandidates() {
return myCandidates.toArray(new ClojureResolveResult[myCandidates.size()]);
}
public <T> T getHint(Class<T> hintClass) {
if (NameHint.class == hintClass && myName != null) {
return (T) this;
} else if (ElementClassHint.class == hintClass) {
return (T) this;
}
return null;
}
public void handleEvent(Event event, Object o) {
}
public boolean kindMatches(PsiNamedElement element) {
if (element instanceof PsiClass) {
return hasKind(ResolveKind.JAVA_CLASS);
} else if (element instanceof PsiPackage) {
return hasKind(ResolveKind.NAMESPACE);
} else {
return hasKind(ResolveKind.OTHER);
}
}
private boolean hasKind(ResolveKind kind) {
for (ResolveKind myKind : myKinds) {
if (myKind == kind) return true;
}
return false;
}
public boolean hasCandidates() {
return myCandidates.size() > 0;
}
}