/*
* Copyright 2011 Jon S Akhtar (Sylvanaar)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sylvanaar.idea.Lua.lang.psi.resolve.processors;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveState;
import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocSymbolReference;
import com.sylvanaar.idea.Lua.lang.psi.LuaReferenceElement;
import com.sylvanaar.idea.Lua.lang.psi.impl.symbols.LuaCompoundReferenceElementImpl;
import com.sylvanaar.idea.Lua.lang.psi.resolve.LuaResolveResultImpl;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaGlobal;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaSymbol;
import java.util.HashSet;
import java.util.Set;
/**
* @author ilyas
*/
public class SymbolResolveProcessor extends ResolveProcessor {
private final Set<PsiElement> myProcessedElements = new HashSet<PsiElement>();
private final PsiElement myPlace;
private final boolean incompleteCode;
public SymbolResolveProcessor(String myName, PsiElement myPlace, boolean incompleteCode) {
super(myName);
this.myPlace = myPlace;
this.incompleteCode = incompleteCode;
}
public boolean isFilter() {
return filter;
}
public void setFilter(boolean filter) {
this.filter = filter;
}
private boolean filter = true;
public boolean execute(PsiElement element, ResolveState resolveState) {
if (element instanceof LuaSymbol && !myProcessedElements.contains(element)) {
LuaSymbol namedElement = (LuaSymbol) element;
boolean isAccessible = isAccessible(namedElement);
if (!filter || isAccessible)
myCandidates.add(new LuaResolveResultImpl(namedElement, true));
myProcessedElements.add(namedElement);
return !filter || !isAccessible || ((PsiReference)myPlace).getElement() instanceof LuaGlobal;
}
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;
}
// public boolean shouldProcess(DeclaractionKind kind) {
// return true;
// }
protected boolean isAccessible(LuaSymbol namedElement) {
if (myName == null) return true;
if (myPlace instanceof LuaCompoundReferenceElementImpl) {
return myName.equals(namedElement.getName());
} else if (myPlace instanceof LuaDocSymbolReference) {
return myName.equals(namedElement.getName());
} else if (myPlace instanceof LuaReferenceElement) {
return myName.equals(namedElement.getName()) && namedElement.isSameKind((LuaSymbol) ((LuaReferenceElement) myPlace).getElement());
}
return myName.equals(namedElement.getName());
}
}