void (PsiBuilder builder) { LOG.assertTrue(builder.getTokenType() == JqlTokenTypes.LPAR); PsiBuilder.Marker marker = builder.mark(); if (!advanceIfMatches(builder, JqlTokenTypes.LPAR)) { marker.drop(); return; } // empty argument list if (advanceIfMatches(builder, JqlTokenTypes.RPAR)) { marker.done(JqlElementTypes.ARGUMENT_LIST); return; } PsiBuilder.Marker argument = builder.mark(); if (!advanceIfMatches(builder, JqlTokenTypes.VALID_ARGUMENTS)) { builder.error(TaskBundle.message("parsing.error.expecting.argument")); argument.drop(); } else { // valid argument is always literal, at least in current implementation of JQU argument.done(JqlElementTypes.LITERAL); while (advanceIfMatches(builder, JqlTokenTypes.COMMA)) { argument = builder.mark(); if (!advanceIfMatches(builder, JqlTokenTypes.VALID_ARGUMENTS)) { marker.drop(); builder.error(TaskBundle.message("parsing.error.expecting.argument")); break; } argument.done(JqlElementTypes.LITERAL); } } if (!advanceIfMatches(builder, JqlTokenTypes.RPAR)) { builder.error(TaskBundle.message("parsing.error.expecting")); } marker.done(JqlElementTypes.ARGUMENT_LIST); }