Fix wrong span context for askama variables

This commit is contained in:
Guillaume Gomez 2025-08-11 22:42:08 +02:00 committed by René Kijewski
parent 756717c2f7
commit 885e0f7de1
2 changed files with 43 additions and 9 deletions

View File

@ -583,39 +583,39 @@ fn field_new(name: &str, span: proc_macro2::Span) -> TokenStream {
}
fn var_writer() -> Ident {
syn::Ident::new("__askama_writer", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_writer", proc_macro2::Span::call_site())
}
fn var_filter_source() -> Ident {
syn::Ident::new("__askama_filter_block", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_filter_block", proc_macro2::Span::call_site())
}
fn var_values() -> Ident {
syn::Ident::new("__askama_values", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_values", proc_macro2::Span::call_site())
}
fn var_arg() -> Ident {
syn::Ident::new("__askama_arg", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_arg", proc_macro2::Span::call_site())
}
fn var_item() -> Ident {
syn::Ident::new("__askama_item", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_item", proc_macro2::Span::call_site())
}
fn var_len() -> Ident {
syn::Ident::new("__askama_len", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_len", proc_macro2::Span::call_site())
}
fn var_iter() -> Ident {
syn::Ident::new("__askama_iter", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_iter", proc_macro2::Span::call_site())
}
fn var_cycle() -> Ident {
syn::Ident::new("__askama_cycle", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_cycle", proc_macro2::Span::call_site())
}
fn var_did_loop() -> Ident {
syn::Ident::new("__askama_did_loop", proc_macro2::Span::mixed_site())
syn::Ident::new("__askama_did_loop", proc_macro2::Span::call_site())
}
fn var_expr_n(n: usize, span: proc_macro2::Span) -> Ident {

View File

@ -464,3 +464,37 @@ fn test_loop_locals() {
let t = LoopLocalsContext { bla: 10 };
assert_eq!(t.render().unwrap(), "10");
}
// This test ensures that the span used for generating askama idents
// is working correctly when derive happens with literals coming from
// another scope.
//
// Regression test for <https://github.com/askama-rs/askama/issues/564>.
#[test]
fn test_loop_span_scope() {
macro_rules! looper {
($l:literal) => {
#[derive(Template)]
#[template(source = $l, ext = "txt")]
pub struct X;
};
}
looper!(
r#"
{%- macro column(idx) -%}
{{ idx }}
{%- endmacro -%}
{%- macro nested_arr(arr) -%}
{% for e in arr -%}
{{- loop.index0 }}
{{~ column(loop.index0) -}}
{% endfor -%}
{% endmacro -%}
{{ nested_arr([1, 2, 3]) }}"#
);
assert_eq!(X.render().unwrap(), "0\n01\n12\n2");
}