Skip to content

Commit

Permalink
fixed an issue with unary operators having the wrong precendence.
Browse files Browse the repository at this point in the history
--HG--
branch : trunk
  • Loading branch information
mitsuhiko committed Aug 17, 2010
1 parent 2613e5a commit 2ee64bc
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGES
Expand Up @@ -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
-----------
Expand Down
24 changes: 12 additions & 12 deletions jinja2/parser.py
Expand Up @@ -370,7 +370,7 @@ def parse_assign_target(self, with_tuple=True, name_only=False,
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__.
Expand Down Expand Up @@ -525,20 +525,22 @@ def parse_pow(self):
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'):
Expand Down Expand Up @@ -570,8 +572,6 @@ def parse_primary(self, with_postfix=True):
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,
Expand All @@ -596,7 +596,7 @@ def parse_tuple(self, simplified=False, with_condexpr=True,
"""
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:
Expand Down
8 changes: 7 additions & 1 deletion jinja2/testsuite/lexnparse.py
Expand Up @@ -16,7 +16,8 @@

from jinja2.testsuite import JinjaTestCase

from jinja2 import Environment, Template, TemplateSyntaxError, UndefinedError
from jinja2 import Environment, Template, TemplateSyntaxError, \
UndefinedError, nodes

env = Environment()

Expand Down Expand Up @@ -357,6 +358,11 @@ def test_const(self):
'{{ 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 %}'''
Expand Down

0 comments on commit 2ee64bc

Please sign in to comment.