derive: prefix more generated variables with __askama (#444)

* _did_loop → __askama_did_loop

* _iter → __askama_iter

* bool → askama::helpers::core::primitive::bool

* _loop_item → __askama_item
This commit is contained in:
René Kijewski 2025-05-18 23:05:18 +02:00 committed by GitHub
parent 3775f4e3a3
commit 3e5562dc7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 17 deletions

View File

@ -363,16 +363,16 @@ impl<'a> Generator<'a, '_> {
if let Expr::Var(name) = **obj {
if name == "loop" {
if attr.name == "index" {
buf.write("(_loop_item.index + 1)");
buf.write("(__askama_item.index + 1)");
return Ok(DisplayWrap::Unwrapped);
} else if attr.name == "index0" {
buf.write("_loop_item.index");
buf.write("__askama_item.index");
return Ok(DisplayWrap::Unwrapped);
} else if attr.name == "first" {
buf.write("(_loop_item.index == 0)");
buf.write("(__askama_item.index == 0)");
return Ok(DisplayWrap::Unwrapped);
} else if attr.name == "last" {
buf.write("_loop_item.last");
buf.write("__askama_item.last");
return Ok(DisplayWrap::Unwrapped);
} else {
return Err(ctx.generate_error("unknown loop variable", obj.span()));
@ -476,7 +476,7 @@ impl<'a> Generator<'a, '_> {
if _len == 0 {\
return askama::helpers::core::result::Result::Err(askama::Error::Fmt);\
}\
_cycle[_loop_item.index % _len]\
_cycle[__askama_item.index % _len]\
})",
);
}

View File

@ -518,35 +518,45 @@ impl<'a> Generator<'a, '_> {
let flushed = this.write_buf_writable(ctx, buf)?;
buf.write('{');
if has_else_nodes {
buf.write("let mut _did_loop = false;");
buf.write("let mut __askama_did_loop = false;");
}
match &*loop_block.iter {
Expr::Range(_, _, _) => buf.write(format_args!("let _iter = {expr_code};")),
Expr::Array(..) => buf.write(format_args!("let _iter = {expr_code}.iter();")),
Expr::Range(_, _, _) => buf.write(format_args!("let __askama_iter = {expr_code};")),
Expr::Array(..) => {
buf.write(format_args!("let __askama_iter = {expr_code}.iter();"));
}
// If `iter` is a call then we assume it's something that returns
// an iterator. If not then the user can explicitly add the needed
// call without issues.
Expr::Call { .. } | Expr::Index(..) => {
buf.write(format_args!("let _iter = ({expr_code}).into_iter();"));
buf.write(format_args!(
"let __askama_iter = ({expr_code}).into_iter();"
));
}
// If accessing `self` then it most likely needs to be
// borrowed, to prevent an attempt of moving.
_ if expr_code.starts_with("self.") => {
buf.write(format_args!("let _iter = (&{expr_code}).into_iter();"));
buf.write(format_args!(
"let __askama_iter = (&{expr_code}).into_iter();"
));
}
// If accessing a field then it most likely needs to be
// borrowed, to prevent an attempt of moving.
Expr::Attr(..) => {
buf.write(format_args!("let _iter = (&{expr_code}).into_iter();"));
buf.write(format_args!(
"let __askama_iter = (&{expr_code}).into_iter();"
));
}
// Otherwise, we borrow `iter` assuming that it implements `IntoIterator`.
_ => buf.write(format_args!("let _iter = ({expr_code}).into_iter();")),
_ => buf.write(format_args!(
"let __askama_iter = ({expr_code}).into_iter();"
)),
}
if let Some(cond) = &loop_block.cond {
this.push_locals(|this| {
buf.write("let _iter = _iter.filter(|");
buf.write("let __askama_iter = __askama_iter.filter(|");
this.visit_target(buf, true, true, &loop_block.var);
buf.write("| -> bool {");
buf.write("| -> askama::helpers::core::primitive::bool {");
this.visit_expr(ctx, buf, cond)?;
buf.write("});");
Ok(0)
@ -556,10 +566,12 @@ impl<'a> Generator<'a, '_> {
let size_hint1 = this.push_locals(|this| {
buf.write("for (");
this.visit_target(buf, true, true, &loop_block.var);
buf.write(", _loop_item) in askama::helpers::TemplateLoop::new(_iter) {");
buf.write(
", __askama_item) in askama::helpers::TemplateLoop::new(__askama_iter) {",
);
if has_else_nodes {
buf.write("_did_loop = true;");
buf.write("__askama_did_loop = true;");
}
let mut size_hint1 = this.handle(ctx, &loop_block.body, buf, AstLevel::Nested)?;
this.handle_ws(loop_block.ws2);
@ -570,7 +582,7 @@ impl<'a> Generator<'a, '_> {
let size_hint2;
if has_else_nodes {
buf.write("if !_did_loop {");
buf.write("if !__askama_did_loop {");
size_hint2 = this.push_locals(|this| {
let mut size_hint =
this.handle(ctx, &loop_block.else_nodes, buf, AstLevel::Nested)?;