]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Fix parsing of filters to allow chained calls
authorKevin <kevin@kevin-brown.com>
Thu, 14 May 2020 03:06:25 +0000 (23:06 -0400)
committerKevin <kevin@kevin-brown.com>
Thu, 14 May 2020 03:06:25 +0000 (23:06 -0400)
src/jinja2/new_parser.py
test_tatsu.py

index 95ae73ec3de268a5fb9665777c3526a9f3b9be8f..5ef1a4395866b1e4b6308844a07c3324b339e845 100644 (file)
@@ -730,20 +730,22 @@ def parse_variable_filter(node, ast):
     dynamic_args = None\r
     dynamic_kwargs = None\r
 \r
-    if 'arguments' in ast:\r
-        for argument in ast['arguments']:\r
-            value = parse_variable(argument['value'])\r
+    variable = parse_variable(ast)\r
 \r
-            if 'key' in argument:\r
-                kwargs.append(\r
-                    nodes.Keyword(argument['key'], value)\r
-                )\r
-            else:\r
-                args.append(value)\r
+    filter_node = None\r
+    last_filter = None\r
+    start_variable = variable\r
 \r
-    return nodes.Filter(\r
+    while not isinstance(variable, nodes.Name):\r
+        if isinstance(variable, nodes.Call):\r
+            last_filter = filter_node\r
+            filter_node = variable\r
+\r
+        variable = variable.node\r
+\r
+    new_filter = nodes.Filter(\r
         node,\r
-        ast['name'],\r
+        variable.name,\r
         args,\r
         kwargs,\r
         dynamic_args,\r
@@ -751,6 +753,17 @@ def parse_variable_filter(node, ast):
         lineno=lineno_from_parseinfo(ast['parseinfo'])\r
     )\r
 \r
+    if filter_node is not None:\r
+        new_filter.args = filter_node.args\r
+        new_filter.kwargs = filter_node.kwargs\r
+\r
+    if last_filter is None:\r
+        return new_filter\r
+\r
+    last_filter.node = new_filter\r
+\r
+    return last_filter\r
+\r
 def parse_variable_tuple(ast, variable_context):\r
     identifiers = []\r
 \r
index 3c40eb1c48c12e6b38b12e8599fd9b953e5226fe..d67a74c949f77ea86140cfdf1a520082aa9ae09f 100644 (file)
@@ -29,5 +29,5 @@ with open('grammar.ebnf', 'r') as tatsu_grammar:
         with open('parsed_jinja.py', 'w') as jinja_ast_file:\r
             pprint.pprint(jinja_ast, indent=2, stream=jinja_ast_file)\r
 \r
-        print("New Parser", new_parse_end - new_parse_start, file=sys.stderr)\r
-        print("Jinja Parser", jinja_parse_end - jinja_parse_start, file=sys.stderr)\r
+        print("New Parser", new_parse_end - new_parse_start)\r
+        print("Jinja Parser", jinja_parse_end - jinja_parse_start)\r