/*
 * 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.impl.symbols;

import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.sylvanaar.idea.Lua.lang.parser.LuaElementTypes;
import com.sylvanaar.idea.Lua.lang.psi.LuaReferenceElement;
import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaExpression;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaCompoundIdentifier;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaGlobal;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaSymbol;
import com.sylvanaar.idea.Lua.lang.psi.util.LuaPsiUtils;
import com.sylvanaar.idea.Lua.lang.psi.visitor.LuaElementVisitor;
import org.jetbrains.annotations.NotNull;

/**
 * Created by IntelliJ IDEA.
 * User: Jon S Akhtar
 * Date: 2/5/11
 * Time: 12:35 PM
 */
public class LuaCompoundReferenceElementImpl extends LuaReferenceElementImpl implements LuaReferenceElement, LuaExpression {

    public LuaCompoundReferenceElementImpl(ASTNode node) {
        super(node);
    }

    @Override
    public void accept(LuaElementVisitor visitor) {
        visitor.visitCompoundReference(this);
    }

    @Override
    public void accept(@NotNull PsiElementVisitor visitor) {
        if (visitor instanceof LuaElementVisitor) {
            ((LuaElementVisitor) visitor).visitCompoundReference(this);
        } else {
            visitor.visitElement(this);
        }
    }

    @Override
    public boolean isSameKind(LuaSymbol symbol) {
        return symbol instanceof LuaCompoundIdentifier;
    }

    public PsiElement getElement() {
        return findChildByType(LuaElementTypes.GETTABLE);
    }

    public PsiReference getReference() {
        return this;
    }

    @Override
    public String toString() {
        return "Compound Reference: " + getText();
    }

    @Override
    public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState state,
                                       PsiElement lastParent, @NotNull PsiElement place) {
        return LuaPsiUtils.processChildDeclarations(this, processor, state, lastParent, place);
    }

    @NotNull
    public String getCanonicalText() {
        LuaCompoundIdentifier element = (LuaCompoundIdentifier) getElement();

        if (element.getScopeIdentifier() instanceof LuaGlobal)
            return ((LuaGlobal) element.getScopeIdentifier()).getModuleName() + element.getText();

        return getText();
    }
}

@@ -702,24 +702,75 @@
 g.ASTNode;%0D%0A
+import com.intellij.openapi.util.text.StringUtil;%0D%0A
 import com.i
@@ -3123,40 +3123,111 @@
     
-if (element.getScopeIdentifier()
+final PsiElement scopeIdentifier = element.getScopeIdentifier();%0D%0A        %0D%0A        if (scopeIdentifier
  ins
@@ -3244,16 +3244,18 @@
 aGlobal)
+ %7B
 %0D%0A      
@@ -3260,22 +3260,41 @@
         
-return
+final String moduleName =
  ((LuaGl
@@ -3299,28 +3299,17 @@
 Global) 
-element.getS
+s
 copeIden
@@ -3314,18 +3314,16 @@
 entifier
-()
 ).getMod
@@ -3331,16 +3331,110 @@
 leName()
+;%0D%0A            if (StringUtil.isNotEmpty(moduleName))%0D%0A                return moduleName + %22.%22
  + eleme
@@ -3443,24 +3443,35 @@
 .getText();%0D
+%0A        %7D%0D
 %0A%0D%0A        r

fix resolution between module globals and compound identifiers