From 639e8d2dff49b7453685fe65ef5ac9ab00dbe69c Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Fri, 15 May 2020 17:07:10 -0400 Subject: [PATCH] Add support for dot accessors to be numbers This is an interesting special case in the old parser where numbers are allowed as dot accessors, but they are specifically convertred to being an item accessor during the parsing phase. We now support numbers being parsed for dot accessors in the new parser. --- grammar.ebnf | 2 +- src/jinja2/new_parser.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/grammar.ebnf b/grammar.ebnf index 6d266108..7b498b55 100644 --- a/grammar.ebnf +++ b/grammar.ebnf @@ -233,7 +233,7 @@ variable_accessor_call variable_accessor_dot = accessor_type:`dot` - "." parameter:IDENTIFIER + "." parameter:( IDENTIFIER | NUMBER_LITERAL ) ; variable_accessor_call_parameters diff --git a/src/jinja2/new_parser.py b/src/jinja2/new_parser.py index 1aac567f..56e100c9 100644 --- a/src/jinja2/new_parser.py +++ b/src/jinja2/new_parser.py @@ -801,8 +801,12 @@ def parse_variable_accessor(node, ast): accessor_node = nodes.Getitem() accessor_node.arg = parse_variable(ast['parameter']) elif accessor_type == 'dot': - accessor_node = nodes.Getattr() - accessor_node.attr = ast['parameter'] + if isinstance(ast['parameter'], str): + accessor_node = nodes.Getattr() + accessor_node.attr = ast['parameter'] + else: + accessor_node = nodes.Getitem() + accessor_node.arg = parse_literal(ast['parameter']) elif accessor_type == 'call': accessor_node = parse_variable_accessor_call(ast) -- 2.47.3