/*
* 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.expressions;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.util.IncorrectOperationException;
import com.sylvanaar.idea.Lua.lang.parser.LuaElementTypes;
import com.sylvanaar.idea.Lua.lang.psi.expressions.LuaParameterList;
import com.sylvanaar.idea.Lua.lang.psi.impl.LuaPsiElementImpl;
import com.sylvanaar.idea.Lua.lang.psi.impl.PsiUtil;
import com.sylvanaar.idea.Lua.lang.psi.symbols.LuaParameter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.sylvanaar.idea.Lua.lang.lexer.LuaTokenTypes.COMMA;
/**
* Created by IntelliJ IDEA.
* User: Jon S Akhtar
* Date: Apr 14, 2010
* Time: 6:44:09 PM
*/
public class LuaParameterListImpl extends LuaPsiElementImpl implements LuaParameterList {
public LuaParameterListImpl(@NotNull ASTNode node) {
super(node);
}
public int count() {
return findChildrenByClass(LuaParameter.class).length;
}
@Override
public PsiElement getLeftParen() {
return findChildByType(LuaElementTypes.LPAREN);
}
@Override
public PsiElement getRightParen() {
return findChildByType(LuaElementTypes.RPAREN);
}
public PsiElement getContext() {
return getParent();
}
public String toString() {
return "Parameter List (Count " + count() + ")";
}
@NotNull
public LuaParameter[] getLuaParameters() {
return findChildrenByClass(LuaParameter.class);
}
public int getParameterIndex(LuaParameter parameter) {
LuaParameter[] parameters = getLuaParameters();
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].equals(parameter)) return i;
}
return -1;
}
public int getParametersCount() {
return getLuaParameters().length;
}
public void addParameterToEnd(LuaParameter parameter) {
LuaParameter[] params = getLuaParameters();
final ASTNode astNode = getNode();
if (params.length == 0) {
astNode.addChild(parameter.getNode());
} else {
LuaParameter last = params[params.length - 1];
astNode.addChild(parameter.getNode(), last.getNode());
astNode.addLeaf(LuaElementTypes.COMMA, ",", last.getNode());
}
}
public void addParameterToHead(LuaParameter parameter) {
LuaParameter[] params = getLuaParameters();
final ASTNode astNode = getNode();
final ASTNode paramNode = parameter.getNode();
assert paramNode != null;
if (params.length == 0) {
astNode.addChild(paramNode);
} else {
LuaParameter first = params[0];
astNode.addChild(paramNode, first.getNode());
astNode.addLeaf(COMMA, ",", first.getNode());
}
}
public int getParameterNumber(final LuaParameter parameter) {
for (int i = 0; i < getLuaParameters().length; i++) {
LuaParameter param = getLuaParameters()[i];
if (param == parameter) {
return i;
}
}
return -1;
}
@Nullable
public PsiElement removeParameter(final LuaParameter toRemove) {
final ASTNode astNode = getNode();
for (LuaParameter param : getLuaParameters()) {
if (param == toRemove) {
final ASTNode paramNode = param.getNode();
assert paramNode != null;
PsiElement prevSibling = PsiUtil.getPrevNonSpace(param);
astNode.removeChild(paramNode);
if (prevSibling != null) {
final ASTNode prev = prevSibling.getNode();
if (prev != null && prev.getElementType() == COMMA) {
astNode.removeChild(prev);
}
}
return toRemove;
}
}
return null;
}
@Override
public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException {
LuaParameter[] params = getLuaParameters();
final ASTNode astNode = getNode();
if (params.length == 0) {
astNode.addChild(element.getNode());
} else {
astNode.addLeaf(COMMA, ",", (element = super.addAfter(element, anchor)).getNode());
}
CodeStyleManager.getInstance(getManager().getProject()).reformat(this);
return element;
}
}