/*
* Copyright 2010 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.statements;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.sylvanaar.idea.Lua.lang.luadoc.psi.api.LuaDocComment;
import com.sylvanaar.idea.Lua.lang.luadoc.psi.impl.LuaDocCommentUtil;
import com.sylvanaar.idea.Lua.lang.parser.LuaElementTypes;
import com.sylvanaar.idea.Lua.lang.psi.LuaPsiFile;
import com.sylvanaar.idea.Lua.lang.psi.LuaReferenceElement;
import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaParameterList;
import com.sylvanaar.idea.Lua.lang.psi.impl.symbols.LuaCompoundIdentifierImpl;
import com.sylvanaar.idea.Lua.lang.psi.impl.symbols.LuaImpliedSelfParameterImpl;
import com.sylvanaar.idea.Lua.lang.psi.statements.LuaBlock;
import com.sylvanaar.idea.Lua.lang.psi.statements.LuaFunctionDefinitionStatement;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaGlobalDeclaration;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaParameter;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaSymbol;
import com.sylvanaar.idea.Lua.lang.psi.visitor.LuaElementVisitor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Created by IntelliJ IDEA.
* User: Jon S Akhtar
* Date: Jun 10, 2010
* Time: 10:40:55 AM
*/
public class LuaFunctionDefinitionStatementImpl extends LuaStatementElementImpl implements LuaFunctionDefinitionStatement/*, PsiModifierList */ {
private boolean definesSelf = false;
public LuaFunctionDefinitionStatementImpl(ASTNode node) {
super(node);
assert getBlock() != null;
}
public void accept(LuaElementVisitor visitor) {
visitor.visitFunctionDef(this);
}
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof LuaElementVisitor) {
((LuaElementVisitor) visitor).visitFunctionDef(this);
} else {
visitor.visitElement(this);
}
}
public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState resolveState, PsiElement lastParent, @NotNull PsiElement place) {
LuaSymbol v = getIdentifier();
if (v != null && (v instanceof LuaGlobalDeclaration || (v instanceof LuaCompoundIdentifierImpl && ((LuaCompoundIdentifierImpl) v).isCompoundDeclaration())))
if (!processor.execute(v, resolveState)) return false;
PsiElement parent = place.getParent();
while (parent != null && !(parent instanceof LuaPsiFile)) {
if (parent == getBlock()) {
final LuaParameter[] params = getParameters().getLuaParameters();
for (LuaParameter param : params) {
if (!processor.execute(param, resolveState)) return false;
}
LuaParameter self = findChildByClass(LuaImpliedSelfParameterImpl.class);
if (self != null) {
if (!processor.execute(self, resolveState)) return false;
}
}
parent = parent.getParent();
}
//
// if (!getBlock().processDeclarations(processor, resolveState, lastParent, place))
// return false;
// if (getIdentifier() == null || !getIdentifier().isLocal())
// return true;
return true;
}
@Nullable
@NonNls
public String getName() {
LuaSymbol name = getIdentifier();
return name != null ? name.getName() : "anonymous";
}
@Override
public PsiElement setName(String s) {
return null;//getIdentifier().setName(s);
}
@Override
public LuaSymbol getIdentifier() {
LuaReferenceElement e = findChildByClass(LuaReferenceElement.class);
if (e != null) {
return (LuaSymbol) e.getElement();
}
return null;
}
@Override
public String getDocString() {
return null;
}
@Override
public String getParameterString() {
return getParameters().getText();
}
@Override
public LuaParameterList getParameters() {
PsiElement e = findChildByType(LuaElementTypes.PARAMETER_LIST);
if (e != null) return (LuaParameterList) e;
return null;
}
public LuaBlock getBlock() {
PsiElement e = findChildByType(LuaElementTypes.BLOCK);
if (e != null) return (LuaBlock) e;
return null;
}
@Override
public String toString() {
return "Function Declaration (" + (getIdentifier() != null ? getIdentifier().getName() : "null") + ")";
}
@Override
public LuaDocComment getDocComment() {
return LuaDocCommentUtil.findDocComment(this);
}
@Override
public boolean isDeprecated() {
return false;
}
}