From 7cb351fa992d81ad987ecaef91a4ac42dd66cc9b Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 3 Sep 2022 11:02:08 +0200 Subject: [PATCH] Support trailing commas for function calls (#95) --- minijinja/src/parser.rs | 3 + minijinja/tests/parser-inputs/call.txt | 2 + minijinja/tests/parser-inputs/filter.txt | 3 + .../test_parser__parser@call.txt.snap | 52 ++++++++++- .../test_parser__parser@filter.txt.snap | 91 ++++++++++++++++++- 5 files changed, 147 insertions(+), 4 deletions(-) diff --git a/minijinja/src/parser.rs b/minijinja/src/parser.rs index fba60edd..3c94c492 100644 --- a/minijinja/src/parser.rs +++ b/minijinja/src/parser.rs @@ -389,6 +389,9 @@ impl<'a> Parser<'a> { if !args.is_empty() || !kwargs_keys.is_empty() { expect_token!(self, Token::Comma, "`,`")?; } + if matches!(self.stream.current()?, Some((Token::ParenClose, _))) { + break; + } let expr = self.parse_expr()?; // keyword argument diff --git a/minijinja/tests/parser-inputs/call.txt b/minijinja/tests/parser-inputs/call.txt index fdd862ba..61015744 100644 --- a/minijinja/tests/parser-inputs/call.txt +++ b/minijinja/tests/parser-inputs/call.txt @@ -2,3 +2,5 @@ {{ loop.cycle(1, 2) }} {{ self.foo() }} {{ foo(1, 2, a=3, b=4) }} +{{ trailing(1, 2,) }} +{{ trailing_kwarg(1, 2, a=3,) }} diff --git a/minijinja/tests/parser-inputs/filter.txt b/minijinja/tests/parser-inputs/filter.txt index fa302603..65254bf6 100644 --- a/minijinja/tests/parser-inputs/filter.txt +++ b/minijinja/tests/parser-inputs/filter.txt @@ -1 +1,4 @@ {{ foo|bar(1, 2)|baz }} +{{ foo|bar(1, 2,) }} +{{ foo|bar(1, 2, a=1) }} +{{ foo|bar(1, 2, a=1,) }} diff --git a/minijinja/tests/snapshots/test_parser__parser@call.txt.snap b/minijinja/tests/snapshots/test_parser__parser@call.txt.snap index 360bff2a..518f91f1 100644 --- a/minijinja/tests/snapshots/test_parser__parser@call.txt.snap +++ b/minijinja/tests/snapshots/test_parser__parser@call.txt.snap @@ -1,6 +1,6 @@ --- source: minijinja/tests/test_parser.rs -description: "{{ super() }}\n{{ loop.cycle(1, 2) }}\n{{ self.foo() }}\n{{ foo(1, 2, a=3, b=4) }}" +description: "{{ super() }}\n{{ loop.cycle(1, 2) }}\n{{ self.foo() }}\n{{ foo(1, 2, a=3, b=4) }}\n{{ trailing(1, 2,) }}\n{{ trailing_kwarg(1, 2, a=3,) }}" input_file: minijinja/tests/parser-inputs/call.txt --- Ok( @@ -85,6 +85,54 @@ Ok( ], } @ 4:6-4:22, } @ 4:0-4:22, + EmitRaw { + raw: "\n", + } @ 4:25-5:0, + EmitExpr { + expr: Call { + expr: Var { + id: "trailing", + } @ 5:3-5:11, + args: [ + Const { + value: 1, + } @ 5:12-5:13, + Const { + value: 2, + } @ 5:15-5:16, + ], + } @ 5:11-5:18, + } @ 5:0-5:18, + EmitRaw { + raw: "\n", + } @ 5:21-6:0, + EmitExpr { + expr: Call { + expr: Var { + id: "trailing_kwarg", + } @ 6:3-6:17, + args: [ + Const { + value: 1, + } @ 6:18-6:19, + Const { + value: 2, + } @ 6:21-6:22, + Map { + keys: [ + Const { + value: "a", + } @ 6:24-6:25, + ], + values: [ + Const { + value: 3, + } @ 6:26-6:27, + ], + } @ 6:24-6:28, + ], + } @ 6:17-6:29, + } @ 6:0-6:29, ], - } @ 0:0-4:25, + } @ 0:0-6:32, ) diff --git a/minijinja/tests/snapshots/test_parser__parser@filter.txt.snap b/minijinja/tests/snapshots/test_parser__parser@filter.txt.snap index 1ebd5400..7fbd5514 100644 --- a/minijinja/tests/snapshots/test_parser__parser@filter.txt.snap +++ b/minijinja/tests/snapshots/test_parser__parser@filter.txt.snap @@ -1,6 +1,6 @@ --- source: minijinja/tests/test_parser.rs -description: "{{ foo|bar(1, 2)|baz }}" +description: "{{ foo|bar(1, 2)|baz }}\n{{ foo|bar(1, 2,) }}\n{{ foo|bar(1, 2, a=1) }}\n{{ foo|bar(1, 2, a=1,) }}" input_file: minijinja/tests/parser-inputs/filter.txt --- Ok( @@ -30,6 +30,93 @@ Ok( args: [], } @ 1:17-1:20, } @ 1:0-1:20, + EmitRaw { + raw: "\n", + } @ 1:23-2:0, + EmitExpr { + expr: Filter { + name: "bar", + expr: Some( + Var { + id: "foo", + } @ 2:3-2:6, + ), + args: [ + Const { + value: 1, + } @ 2:11-2:12, + Const { + value: 2, + } @ 2:14-2:15, + ], + } @ 2:7-2:17, + } @ 2:0-2:17, + EmitRaw { + raw: "\n", + } @ 2:20-3:0, + EmitExpr { + expr: Filter { + name: "bar", + expr: Some( + Var { + id: "foo", + } @ 3:3-3:6, + ), + args: [ + Const { + value: 1, + } @ 3:11-3:12, + Const { + value: 2, + } @ 3:14-3:15, + Map { + keys: [ + Const { + value: "a", + } @ 3:17-3:18, + ], + values: [ + Const { + value: 1, + } @ 3:19-3:20, + ], + } @ 3:17-3:20, + ], + } @ 3:7-3:21, + } @ 3:0-3:21, + EmitRaw { + raw: "\n", + } @ 3:24-4:0, + EmitExpr { + expr: Filter { + name: "bar", + expr: Some( + Var { + id: "foo", + } @ 4:3-4:6, + ), + args: [ + Const { + value: 1, + } @ 4:11-4:12, + Const { + value: 2, + } @ 4:14-4:15, + Map { + keys: [ + Const { + value: "a", + } @ 4:17-4:18, + ], + values: [ + Const { + value: 1, + } @ 4:19-4:20, + ], + } @ 4:17-4:21, + ], + } @ 4:7-4:22, + } @ 4:0-4:22, ], - } @ 0:0-1:23, + } @ 0:0-4:25, )