package glslplugin.lang.elements.reference;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import glslplugin.lang.elements.preprocessor.GLSLDefineDirective;
import glslplugin.lang.elements.preprocessor.GLSLRedefinedToken;
/**
*
* Created by abigail on 08/07/15.
*/
public class GLSLMacroReference extends GLSLReferenceBase<GLSLRedefinedToken, GLSLDefineDirective> {
public GLSLMacroReference(GLSLRedefinedToken source) {
super(source);
}
@Override
public GLSLDefineDirective resolve() {
PsiElement current = source.getPrevSibling();
if (current == null) current = source.getParent();
while (current != null) {
final GLSLDefineDirective found = resolveDeeperIn(current);
if(found != null)return found;
if (current.getPrevSibling() == null) {
current = current.getParent();
if (current instanceof PsiFile) return null;
} else {
current = current.getPrevSibling();
}
}
return null;
}
private GLSLDefineDirective resolveDeeperIn(PsiElement current){
while(current != null){
if (current instanceof GLSLDefineDirective) {
GLSLDefineDirective directive = (GLSLDefineDirective) current;
if (source.getName().equals(directive.getName())) return directive;
}else{
final GLSLDefineDirective deeper = resolveDeeperIn(current.getLastChild());
if(deeper != null)return deeper;
}
current = current.getPrevSibling();
}
return null;
}
}