/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.lang.psi.impl.statements.params; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.impl.PsiImplUtil; import com.intellij.util.IncorrectOperationException; import gw.lang.parser.expressions.IParameterListClause; import gw.plugin.ij.lang.GosuTokenTypes; import gw.plugin.ij.lang.parser.GosuCompositeElement; import gw.plugin.ij.lang.psi.api.statements.params.IGosuParameter; import gw.plugin.ij.lang.psi.api.statements.params.IGosuParameterList; import gw.plugin.ij.lang.psi.impl.GosuElementVisitor; import gw.plugin.ij.lang.psi.impl.GosuPsiElementImpl; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class GosuParameterListImpl extends GosuPsiElementImpl<IParameterListClause> implements IGosuParameterList { private static final Logger LOG = Logger.getInstance("#gw.plugin.ij.lang.psi.impl.statements.params.GosuParameterListImpl"); public GosuParameterListImpl(@NotNull GosuCompositeElement node) { super(node); } public void accept(@NotNull GosuElementVisitor visitor) { visitor.visitParameterList(this); } @Override public void accept(@NotNull PsiElementVisitor visitor) { if( visitor instanceof GosuElementVisitor) { ((GosuElementVisitor)visitor).visitParameterList(this); } else { visitor.visitElement( this ); } } @NotNull public IGosuParameter[] getParameters() { return findChildrenByClass(IGosuParameter.class); } public int getParameterIndex(@NotNull PsiParameter parameter) { LOG.assertTrue(parameter.getParent() == this); return PsiImplUtil.getParameterIndex(parameter, this); } public int getParametersCount() { return getParameters().length; } public void addParameterToEnd(@NotNull IGosuParameter parameter) { IGosuParameter[] params = getParameters(); if (params.length == 0) { add(parameter); } else { IGosuParameter last = params[params.length - 1]; addAfter(parameter, last); } } public void addParameterToHead(@NotNull IGosuParameter parameter) { IGosuParameter[] params = getParameters(); if (params.length == 0) { add(parameter); } else { IGosuParameter first = params[0]; addBefore(parameter, first); } } public int getParameterNumber(final IGosuParameter parameter) { for (int i = 0; i < getParameters().length; i++) { IGosuParameter param = getParameters()[i]; if (param == parameter) { return i; } } return -1; } @NotNull @Override public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { IGosuParameter[] params = getParameters(); if (params.length == 0) { add(element); } else { element = super.addAfter(element, anchor); final ASTNode astNode = getNode(); if (anchor != null) { astNode.addLeaf(GosuTokenTypes.TT_OP_comma, ",", element.getNode()); } else { astNode.addLeaf(GosuTokenTypes.TT_OP_comma, ",", element.getNextSibling().getNode()); } CodeStyleManager.getInstance(getManager().getProject()).reformat(this); } return element; } @NotNull @Override public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { IGosuParameter[] params = getParameters(); if (params.length == 0) { add(element); } else { element = super.addBefore(element, anchor); final ASTNode astNode = getNode(); if (anchor != null) { astNode.addLeaf(GosuTokenTypes.TT_OP_comma, ",", anchor.getNode()); } else { astNode.addLeaf(GosuTokenTypes.TT_OP_comma, ",", element.getNode()); } CodeStyleManager.getInstance(getManager().getProject()).reformat(this); } return element; } @Override public PsiModifierList getModifierList() { return null; } @Override public boolean hasModifierProperty(@PsiModifier.ModifierConstant @NonNls @NotNull String name) { return false; } }