fix for and add reversed argument

This commit is contained in:
danhanson committed 2026-09-08 02:42:50 -05:00
1 parent 356cc3a885
commit 06aa8706c8
6 files changed
+61197 -60090

No files matched your search

+4
View File
@@ -242,6 +242,10 @@ documentation or memory. Both checks are worth repeating whenever tags, filters
`{% cache 500 sidebar.name %}` names a fragment there, `{% cache 500 using="c" %}` names a fragment
called `using="c"` rather than choosing a cache, and `{% cache 500 sidebar using= %}` takes an empty
name. All three are errors here.
- `do_for` reads `reversed` off the end of the tag before it looks for `in`, so `{% for x in reversed %}`
is an error there and a loop over a variable named `reversed` here. Writing the flag as well
(`{% for x in reversed reversed %}`) is accepted by both, which is why the name is not simply reserved
in that position.
- `do_translate` refuses `as` and `noop` as the value of its `context` option, so
`{% trans "hi" context noop %}` is an error there and a context named by the variable `noop` here.
- `partial`/`partialdef` are Django builtins as of Django 6; `elif`/`else`/`empty` are modelled as parts of
+4 -2
View File
@@ -291,6 +291,7 @@ const django = grammar({
// after it settles
conflicts: ($) => [
[$.template],
[$.for_scope],
[$.predicate],
[$.library, $.load],
[$._translate_option],
@@ -621,7 +622,6 @@ const django = grammar({
optional(asVariable($)),
),
for_scope: ($) =>
prec.left(
seq(
block(
"for",
@@ -636,10 +636,12 @@ const django = grammar({
),
part("in"),
part($.filtered_value),
// do_for reads this off the end and takes the sequence from the bit
// before it, so it comes last or not at all
optional(part("reversed")),
),
optional($.template),
),
),
for_group: ($) =>
seq(
$.for_scope,
+24 -4
View File
@@ -3262,9 +3262,6 @@
]
},
"for_scope": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
@@ -3381,6 +3378,27 @@
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "[ \\t\\r\\n]+"
},
{
"type": "STRING",
"value": "reversed"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
@@ -3412,7 +3430,6 @@
]
}
]
}
},
"for_group": {
"type": "SEQ",
@@ -7947,6 +7964,9 @@
[
"template"
],
[
"for_scope"
],
[
"predicate"
],
+4
View File
@@ -2816,6 +2816,10 @@
"type": "resetcycle",
"named": false
},
{
"type": "reversed",
"named": false
},
{
"type": "rjust",
"named": false
+60811 -60084
View File
File diff suppressed because it is too large. Load diff
+350
View File
@@ -95,3 +95,353 @@ For With Empty
(template
(content)))
(content))
==================
For With A Tag In Its Body
==================
{% for x in y %}
{% if a %}b{% endif %}
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)
(if_group
(predicate
(filtered_value
(value
(variable_attribute
(identifier)))))
(template
(content)))
(content))))
(content))
==================
For With A Nested For
==================
{% for x in y %}
{% for z in x %}a{% endfor %}
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content))))
(content))))
(content))
==================
For With Tags In Both Branches
==================
{% for x in y %}
{% if a %}b{% endif %}
{% empty %}
{% with c=1 %}d{% endwith %}
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)
(if_group
(predicate
(filtered_value
(value
(variable_attribute
(identifier)))))
(template
(content)))
(content)))
(template
(content)
(with_group
variable: (identifier)
(filtered_value
(value
(literal
(number))))
(template
(content)))
(content)))
(content))
==================
For With A Named Block In Its Body
==================
{% for x in y %}
{% block b %}c{% endblock b %}
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)
(block_group
name: (push_block)
(template
(content))
(pop_block))
(content))))
(content))
==================
For Nested In A Tag
==================
{% if a %}
{% for x in y %}{% if b %}c{% endif %}{% endfor %}
{% endif %}
---
(template
(content)
(if_group
(predicate
(filtered_value
(value
(variable_attribute
(identifier)))))
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(if_group
(predicate
(filtered_value
(value
(variable_attribute
(identifier)))))
(template
(content))))))
(content)))
(content))
==================
For With An Empty Body
==================
{% for x in y %}{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))))
(content))
==================
For Reversed
==================
{% for x in y reversed %}
a
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content))))
(content))
==================
For With Multiple Variables Reversed
==================
{% for k,v in y reversed %}
a
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content))))
(content))
==================
For With A Filtered Sequence Reversed
==================
{% for x in y|slice:":2" reversed %}
a
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier)))
(filter_expression
(filter
argument: (value
(literal
(string))))))
(template
(content))))
(content))
==================
For Reversed With Empty
==================
{% for x in y reversed %}
a
{% empty %}
b
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)))
(template
(content)))
(content))
==================
For Reversed With A Tag In Its Body
==================
{% for x in y reversed %}
{% if a %}b{% endif %}
{% endfor %}
---
(template
(content)
(for_group
(for_scope
variable: (identifier)
(filtered_value
(value
(variable_attribute
(identifier))))
(template
(content)
(if_group
(predicate
(filtered_value
(value
(variable_attribute
(identifier)))))
(template
(content)))
(content))))
(content))
==================
For With Reversed Twice
:error
==================
{% for x in y reversed reversed %}a{% endfor %}
---
==================
For With Reversed Before In
:error
==================
{% for x reversed in y %}a{% endfor %}
---