diff --git a/parser/parser.go b/parser/parser.go index af2776c8..5ba16d2a 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -549,6 +549,10 @@ func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) N arguments = append(arguments, node) } + // skip last comma + if p.current.Is(Operator, ",") { + p.next() + } p.expect(Bracket, ")") node = p.createNode(&BuiltinNode{ @@ -593,6 +597,9 @@ func (p *parser) parseArguments(arguments []Node) []Node { if len(arguments) > offset { p.expect(Operator, ",") } + if p.current.Is(Bracket, ")") { + break + } node := p.parseExpression(0) arguments = append(arguments, node) } diff --git a/parser/parser_test.go b/parser/parser_test.go index 4e373ff5..51dc0ac0 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -839,6 +839,42 @@ world`}, Expr: &IdentifierNode{Value: "x"}, }, }, + { + `all( + [ + true, + false, + ], + #, + )`, + &BuiltinNode{ + Name: "all", + Arguments: []Node{ + &ArrayNode{ + Nodes: []Node{ + &BoolNode{Value: true}, + &BoolNode{Value: false}, + }, + }, + &PredicateNode{ + Node: &PointerNode{}, + }, + }, + }, + }, + { + `func( + parameter1, + parameter2, + )`, + &CallNode{ + Callee: &IdentifierNode{Value: "func"}, + Arguments: []Node{ + &IdentifierNode{Value: "parameter1"}, + &IdentifierNode{Value: "parameter2"}, + }, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) {