]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Only support implicit tuples in variable expressions GH-1194-formal-grammar
authorKevin Brown <kevin@kevin-brown.com>
Sat, 16 May 2020 21:54:52 +0000 (17:54 -0400)
committerKevin Brown <kevin@kevin-brown.com>
Sat, 16 May 2020 21:54:52 +0000 (17:54 -0400)
They cause super inconsistent parsing behaviour if they show up
pretty much anywhere else because there is no difference between an
implicit tuple and a set of comma-separated parameters.

grammar.ebnf
src/jinja2/new_parser.py

index 3fef91a6287a71011531a55014d47b0c8616c42d..97ede84030d17dc54684e6807e6ed0ad90dea840 100644 (file)
@@ -174,7 +174,7 @@ block_parameter_value_only
 \r
 variable_expression\r
     =\r
-    variable_open type:`variable` name:conditional_expression variable_close\r
+    variable_open type:`variable` name:variable_expression_name variable_close\r
     ;\r
 \r
 variable_open\r
@@ -199,6 +199,12 @@ variable_close_symbol
     "}}"\r
     ;\r
 \r
+variable_expression_name\r
+    =\r
+    | TUPLE_LITERAL\r
+    | conditional_expression\r
+    ;\r
+\r
 variable_identifier\r
     =\r
     | variable_identifier_parentheses\r
@@ -523,7 +529,7 @@ LITERAL
     | BOOLEAN_LITERAL\r
     | DICTIONARY_LITERAL\r
     | LIST_LITERAL\r
-    | TUPLE_LITERAL\r
+    | EXPLICIT_TUPLE_LITERAL\r
     ;\r
 \r
 DICTIONARY_LITERAL\r
@@ -551,28 +557,32 @@ LIST_LITERAL
 \r
 TUPLE_LITERAL\r
     =\r
-    literal_type:`tuple`\r
-    (\r
-        | value:EXPLICIT_TUPLE_LITERAL\r
-        | value:IMPLICIT_TUPLE_LITERAL\r
-        | EMPTY_TUPLE_LITERAL\r
-    )\r
+    | EXPLICIT_TUPLE_LITERAL\r
+    | IMPLICIT_TUPLE_LITERAL\r
+    | EMPTY_TUPLE_LITERAL\r
     ;\r
 \r
 EXPLICIT_TUPLE_LITERAL\r
     =\r
-    | ( "(" {SP}* @+:LITERAL {SP}* { "," {SP}* @+:LITERAL {SP}* }+ ")" )\r
-    | ( "(" {SP}* @+:LITERAL {SP}* "," {SP}* ")" )\r
+    literal_type:`tuple`\r
+    "(" value:TUPLE_LITERAL_CONTENTS ")"\r
     ;\r
 \r
 IMPLICIT_TUPLE_LITERAL\r
     =\r
-    | ( @+:LITERAL {SP}* { "," {SP}* @+:LITERAL {SP}* }+ )\r
-    | ( @+:LITERAL {SP}* "," {SP}* )\r
+    literal_type:`tuple`\r
+    value:TUPLE_LITERAL_CONTENTS\r
+    ;\r
+\r
+TUPLE_LITERAL_CONTENTS\r
+    =\r
+    | ( @+:variable_identifier {SP}* { "," {SP}* @+:variable_identifier {SP}* }+ )\r
+    | ( @+:variable_identifier {SP}* "," {SP}* )\r
     ;\r
 \r
 EMPTY_TUPLE_LITERAL\r
     =\r
+    literal_type:`tuple`\r
     "(" {SP}* ")"\r
     ;\r
 \r
index 844f9ae7107b6cb6e80088e65989f34d2c9dd92b..76051f592a7e8cc3584b715c385e2fab521e7c98 100644 (file)
@@ -564,6 +564,9 @@ def parse_conditional_expression(ast):
     if 'variable' in ast:\r
         return parse_variable(ast)\r
 \r
+    if 'literal_type' in ast:\r
+        return parse_literal(ast)\r
+\r
     if 'concatenate' in ast:\r
         return parse_concatenate_expression(ast)\r
 \r
@@ -806,7 +809,7 @@ def parse_literal(ast):
             ast['value'] = []\r
 \r
         items = [\r
-            parse_literal(item) for item in ast['value']\r
+            parse_variable(item) for item in ast['value']\r
         ]\r
 \r
         return nodes.Tuple(\r