package org.jetbrains.plugins.clojure.psi.resolve.processors;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.NameHint;
import org.jetbrains.plugins.clojure.psi.impl.list.ListDeclarations;
import org.jetbrains.plugins.clojure.psi.resolve.ClojureResolveResultImpl;
import java.util.HashSet;
import java.util.Set;
/**
* @author ilyas
*/
public class SymbolResolveProcessor extends ResolveProcessor implements NameHint {
private final Set<PsiElement> myProcessedElements = new HashSet<PsiElement>();
private final PsiElement myPlace;
private final boolean incompleteCode;
public SymbolResolveProcessor(String myName, PsiElement myPlace, boolean incompleteCode, ResolveKind[] kinds) {
super(myName, kinds);
this.myPlace = myPlace;
this.incompleteCode = incompleteCode;
}
public boolean execute(PsiElement element, ResolveState resolveState) {
if (element instanceof PsiNamedElement && !myProcessedElements.contains(element)) {
if (!kindMatches((PsiNamedElement) element)) return true;
PsiNamedElement namedElement = (PsiNamedElement) element;
boolean isAccessible = isAccessible(namedElement);
myCandidates.add(new ClojureResolveResultImpl(namedElement, isAccessible));
myProcessedElements.add(namedElement);
return !ListDeclarations.isLocal(element);
//todo specify as it's possible!
}
return true;
}
/*
todo: add ElementClassHints
*/
public <T> T getHint(Key<T> hintKey) {
if (hintKey == NameHint.KEY && myName != null) {
return (T) this;
}
return null;
}
public PsiElement getPlace() {
return myPlace;
}
public String getName(ResolveState resolveState) {
return myName;
}
protected boolean isAccessible(PsiNamedElement namedElement) {
//todo implement me
return true;
}
public boolean shouldProcess(DeclarationKind kind) {
return true;
}
}