summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Ronacher <armin.ronacher@active-4.com>2010-08-17 12:36:38 +0200
committerArmin Ronacher <armin.ronacher@active-4.com>2010-08-17 12:36:38 +0200
commit2ee64bc4020f83215399ad6c207d7cc4e744ffbd (patch)
treea5f8598c0de4517a55a33ba64b6e4ac1ee931003
parent2613e5ad230e72a6d82681eae92a88e095dcf2bd (diff)
downloadjinja2-2.5.1.tar.gz
fixed an issue with unary operators having the wrong precendence.2.5.1
--HG-- branch : trunk
-rw-r--r--CHANGES1
-rw-r--r--jinja2/parser.py24
-rw-r--r--jinja2/testsuite/lexnparse.py8
3 files changed, 20 insertions, 13 deletions
diff --git a/CHANGES b/CHANGES
index 5590be2..099c7c3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -18,6 +18,7 @@ Version 2.5.1
pulled from markupsafe by the Jinja2 developers. The debug support
went into a separate feature called "debugsupport" and is disabled
by default because it is only relevant for Python 2.4
+- fixed an issue with unary operators having the wrong precendence.
Version 2.5
-----------
diff --git a/jinja2/parser.py b/jinja2/parser.py
index 9814c93..39713a1 100644
--- a/jinja2/parser.py
+++ b/jinja2/parser.py
@@ -370,7 +370,7 @@ class Parser(object):
target = self.parse_tuple(simplified=True,
extra_end_rules=extra_end_rules)
else:
- target = self.parse_primary(with_postfix=False)
+ target = self.parse_primary()
target.set_ctx('store')
if not target.can_assign():
self.fail('can\'t assign to %r' % target.__class__.
@@ -525,20 +525,22 @@ class Parser(object):
lineno = self.stream.current.lineno
return left
- def parse_unary(self):
+ def parse_unary(self, with_postfix=True):
token_type = self.stream.current.type
lineno = self.stream.current.lineno
if token_type == 'sub':
next(self.stream)
- node = self.parse_unary()
- return nodes.Neg(node, lineno=lineno)
- if token_type == 'add':
+ node = nodes.Neg(self.parse_unary(False), lineno=lineno)
+ elif token_type == 'add':
next(self.stream)
- node = self.parse_unary()
- return nodes.Pos(node, lineno=lineno)
- return self.parse_primary()
+ node = nodes.Pos(self.parse_unary(False), lineno=lineno)
+ else:
+ node = self.parse_primary()
+ if with_postfix:
+ node = self.parse_postfix(node)
+ return node
- def parse_primary(self, with_postfix=True):
+ def parse_primary(self):
token = self.stream.current
if token.type == 'name':
if token.value in ('true', 'false', 'True', 'False'):
@@ -570,8 +572,6 @@ class Parser(object):
node = self.parse_dict()
else:
self.fail("unexpected '%s'" % describe_token(token), token.lineno)
- if with_postfix:
- node = self.parse_postfix(node)
return node
def parse_tuple(self, simplified=False, with_condexpr=True,
@@ -596,7 +596,7 @@ class Parser(object):
"""
lineno = self.stream.current.lineno
if simplified:
- parse = lambda: self.parse_primary(with_postfix=False)
+ parse = self.parse_primary
elif with_condexpr:
parse = self.parse_expression
else:
diff --git a/jinja2/testsuite/lexnparse.py b/jinja2/testsuite/lexnparse.py
index 99802a3..9afbca4 100644
--- a/jinja2/testsuite/lexnparse.py
+++ b/jinja2/testsuite/lexnparse.py
@@ -16,7 +16,8 @@ import unittest
from jinja2.testsuite import JinjaTestCase
-from jinja2 import Environment, Template, TemplateSyntaxError, UndefinedError
+from jinja2 import Environment, Template, TemplateSyntaxError, \
+ UndefinedError, nodes
env = Environment()
@@ -357,6 +358,11 @@ class SyntaxTestCase(JinjaTestCase):
'{{ none is defined }}|{{ missing is defined }}')
assert tmpl.render() == 'True|False|None|True|False'
+ def test_neg_filter_priority(self):
+ node = env.parse('{{ -1|foo }}')
+ assert isinstance(node.body[0].nodes[0], nodes.Filter)
+ assert isinstance(node.body[0].nodes[0].node, nodes.Neg)
+
def test_const_assign(self):
constass1 = '''{% set true = 42 %}'''
constass2 = '''{% for none in seq %}{% endfor %}'''