Bind 'in' operator more tightly than boolean operators. #336
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When I added support for the 'in' operator a couple months ago, I think I got the precedence slightly wrong.
JS has no 'in' operator, so there's nothing to base nunjucks' behavior off there, but Python (https://docs.python.org/2/reference/expressions.html#operator-precedence) and Jinja both bind 'in' more tightly than boolean operators, so that this
{% if msg.status in ['pending', 'confirmed'] and msg.body %}
does not evaluate as{% if msg.status in (['pending', 'confirmed'] and msg.body) %}
(which is what nunjucks master currently does).I think the Python/Jinja behavior is more useful and logical than nunjucks' current behavior:
in
is a comparison operator, like==
et al, and should bind with similar precedence. You wouldn't expect{% if msg.status == 'pending' and msg.body %}
to evaluate as{% if msg.status == ('pending' and msg.body) %}
.This pull request fixes the precedence (and while I was at it, also adds a test to confirm that
and
binds more tightly thanor
, which is correct and matches both Python and JS).