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;
    }
}