package org.fandev.lang.fan.parsing.statements.expressions.arguments; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.TokenSet; import org.fandev.lang.fan.FanBundle; import org.fandev.lang.fan.FanElementTypes; import static org.fandev.lang.fan.FanElementTypes.ARGUMENT_EXPR; import static org.fandev.lang.fan.FanTokenTypes.*; import org.fandev.lang.fan.parsing.expression.Expression; import org.fandev.lang.fan.parsing.util.ParserUtils; import static org.fandev.lang.fan.parsing.util.ParserUtils.advanceNoNls; import static org.fandev.lang.fan.parsing.util.ParserUtils.getToken; import static org.fandev.lang.fan.parsing.util.ParserUtils.removeNls; /** * @author Dror Bereznitsky * @date Jan 14, 2009 1:29:26 PM */ public class Arguments { public static final TokenSet ARGUMENTS_STOPPER = TokenSet.create(RPAR, COMMA); // <args> := [<expr> ("," <expr>)*] public static boolean parse(final PsiBuilder builder) { final PsiBuilder.Marker marker = builder.mark(); if (LPAR == builder.getTokenType()) { advanceNoNls(builder); while (!builder.eof() && RPAR != builder.getTokenType()) { final boolean res = Expression.parseExpr(builder, ARGUMENTS_STOPPER, ARGUMENT_EXPR); removeNls(builder); if (!res || RPAR == builder.getTokenType()) { break; } getToken(builder, COMMA, FanBundle.message("comma.expected")); removeNls(builder); } getToken(builder, RPAR, FanBundle.message("rpar.expected")); marker.done(FanElementTypes.ARGUMENT_LIST); return true; } marker.drop(); return false; } }