mirror of
https://github.com/askama-rs/askama.git
synced 2025-10-02 07:20:55 +00:00
derive: better spans for Target
This commit is contained in:
parent
e1eeb815ea
commit
f62cdfb49a
@ -7,7 +7,7 @@ use parser::{
|
|||||||
TyGenerics, WithSpan,
|
TyGenerics, WithSpan,
|
||||||
};
|
};
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use quote::{quote, quote_spanned};
|
use quote::quote_spanned;
|
||||||
use syn::Token;
|
use syn::Token;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@ -264,7 +264,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
let span = ctx.span_for_node(cond.span());
|
let span = ctx.span_for_node(cond.span());
|
||||||
buf.write_token(Token![let], span);
|
buf.write_token(Token![let], span);
|
||||||
if let Some(ref target) = cond.target {
|
if let Some(ref target) = cond.target {
|
||||||
self.visit_target(ctx, buf, true, true, target);
|
self.visit_target(ctx, buf, true, true, target, span);
|
||||||
}
|
}
|
||||||
quote_into!(buf, span, { = &#expr_buf });
|
quote_into!(buf, span, { = &#expr_buf });
|
||||||
self.visit_expr_not_first(ctx, buf, &cond.expr, display_wrap)
|
self.visit_expr_not_first(ctx, buf, &cond.expr, display_wrap)
|
||||||
@ -508,7 +508,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
}
|
}
|
||||||
let tmp = tmp.into_token_stream();
|
let tmp = tmp.into_token_stream();
|
||||||
// FIXME: use a better span
|
// FIXME: use a better span
|
||||||
buf.write(quote!(<#tmp>), ctx.template_span);
|
quote_into!(buf, ctx.template_span, { <#tmp> });
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn visit_ty_generic(
|
pub(super) fn visit_ty_generic(
|
||||||
@ -911,6 +911,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
initialized: bool,
|
initialized: bool,
|
||||||
first_level: bool,
|
first_level: bool,
|
||||||
target: &Target<'a>,
|
target: &Target<'a>,
|
||||||
|
span: proc_macro2::Span,
|
||||||
) {
|
) {
|
||||||
match target {
|
match target {
|
||||||
Target::Placeholder(s) => quote_into!(buf, ctx.span_for_node(s.span()), { _ }),
|
Target::Placeholder(s) => quote_into!(buf, ctx.span_for_node(s.span()), { _ }),
|
||||||
@ -936,10 +937,10 @@ impl<'a> Generator<'a, '_> {
|
|||||||
Target::OrChain(targets) => match targets.first() {
|
Target::OrChain(targets) => match targets.first() {
|
||||||
None => quote_into!(buf, ctx.template_span, { _ }),
|
None => quote_into!(buf, ctx.template_span, { _ }),
|
||||||
Some(first_target) => {
|
Some(first_target) => {
|
||||||
self.visit_target(ctx, buf, initialized, first_level, first_target);
|
self.visit_target(ctx, buf, initialized, first_level, first_target, span);
|
||||||
for target in &targets[1..] {
|
for target in &targets[1..] {
|
||||||
buf.write_token(Token![|], ctx.template_span);
|
buf.write_token(Token![|], ctx.template_span);
|
||||||
self.visit_target(ctx, buf, initialized, first_level, target);
|
self.visit_target(ctx, buf, initialized, first_level, target, span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -947,31 +948,21 @@ impl<'a> Generator<'a, '_> {
|
|||||||
buf.write_separated_path(ctx, path);
|
buf.write_separated_path(ctx, path);
|
||||||
let mut targets_buf = Buffer::new();
|
let mut targets_buf = Buffer::new();
|
||||||
for target in targets {
|
for target in targets {
|
||||||
self.visit_target(ctx, &mut targets_buf, initialized, false, target);
|
self.visit_target(ctx, &mut targets_buf, initialized, false, target, span);
|
||||||
targets_buf.write_token(Token![,], ctx.template_span);
|
targets_buf.write_token(Token![,], ctx.template_span);
|
||||||
}
|
}
|
||||||
let targets_buf = targets_buf.into_token_stream();
|
let targets_buf = targets_buf.into_token_stream();
|
||||||
buf.write(
|
quote_into!(buf, span, { (#targets_buf) });
|
||||||
quote!(
|
|
||||||
(#targets_buf)
|
|
||||||
),
|
|
||||||
ctx.template_span,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Target::Array(path, targets) => {
|
Target::Array(path, targets) => {
|
||||||
buf.write_separated_path(ctx, path);
|
buf.write_separated_path(ctx, path);
|
||||||
let mut targets_buf = Buffer::new();
|
let mut targets_buf = Buffer::new();
|
||||||
for target in targets {
|
for target in targets {
|
||||||
self.visit_target(ctx, &mut targets_buf, initialized, false, target);
|
self.visit_target(ctx, &mut targets_buf, initialized, false, target, span);
|
||||||
targets_buf.write_token(Token![,], ctx.template_span);
|
targets_buf.write_token(Token![,], ctx.template_span);
|
||||||
}
|
}
|
||||||
let targets_buf = targets_buf.into_token_stream();
|
let targets_buf = targets_buf.into_token_stream();
|
||||||
buf.write(
|
quote_into!(buf, span, { [#targets_buf] });
|
||||||
quote!(
|
|
||||||
[#targets_buf]
|
|
||||||
),
|
|
||||||
ctx.template_span,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Target::Struct(path, targets) => {
|
Target::Struct(path, targets) => {
|
||||||
buf.write_separated_path(ctx, path);
|
buf.write_separated_path(ctx, path);
|
||||||
@ -984,18 +975,11 @@ impl<'a> Generator<'a, '_> {
|
|||||||
|
|
||||||
targets_buf.write_field(name, ctx.template_span);
|
targets_buf.write_field(name, ctx.template_span);
|
||||||
targets_buf.write_token(Token![:], ctx.template_span);
|
targets_buf.write_token(Token![:], ctx.template_span);
|
||||||
self.visit_target(ctx, &mut targets_buf, initialized, false, target);
|
self.visit_target(ctx, &mut targets_buf, initialized, false, target, span);
|
||||||
targets_buf.write_token(Token![,], ctx.template_span);
|
targets_buf.write_token(Token![,], ctx.template_span);
|
||||||
}
|
}
|
||||||
let targets_buf = targets_buf.into_token_stream();
|
let targets_buf = targets_buf.into_token_stream();
|
||||||
buf.write(
|
quote_into!(buf, span, { { #targets_buf } });
|
||||||
quote!(
|
|
||||||
{
|
|
||||||
#targets_buf
|
|
||||||
}
|
|
||||||
),
|
|
||||||
ctx.template_span,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Target::Path(path) => {
|
Target::Path(path) => {
|
||||||
self.visit_path(ctx, buf, path);
|
self.visit_path(ctx, buf, path);
|
||||||
|
@ -369,7 +369,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
Expr::BinOp(v) if matches!(v.op, "||" | "&&") => {
|
Expr::BinOp(v) if matches!(v.op, "||" | "&&") => {
|
||||||
let display_wrap =
|
let display_wrap =
|
||||||
this.visit_expr_first(ctx, &mut expr_buf, &v.lhs)?;
|
this.visit_expr_first(ctx, &mut expr_buf, &v.lhs)?;
|
||||||
this.visit_target(ctx, buf, true, true, target);
|
this.visit_target(ctx, buf, true, true, target, span);
|
||||||
this.visit_expr_not_first(
|
this.visit_expr_not_first(
|
||||||
ctx,
|
ctx,
|
||||||
&mut expr_buf,
|
&mut expr_buf,
|
||||||
@ -383,7 +383,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
_ => {
|
_ => {
|
||||||
let display_wrap =
|
let display_wrap =
|
||||||
this.visit_expr_first(ctx, &mut expr_buf, expr)?;
|
this.visit_expr_first(ctx, &mut expr_buf, expr)?;
|
||||||
this.visit_target(ctx, buf, true, true, target);
|
this.visit_target(ctx, buf, true, true, target, span);
|
||||||
this.visit_expr_not_first(ctx, &mut expr_buf, expr, display_wrap)?;
|
this.visit_expr_not_first(ctx, &mut expr_buf, expr, display_wrap)?;
|
||||||
quote_into!(buf, ctx.template_span, { = &#expr_buf });
|
quote_into!(buf, ctx.template_span, { = &#expr_buf });
|
||||||
}
|
}
|
||||||
@ -474,7 +474,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
if index != 0 {
|
if index != 0 {
|
||||||
targets_buf.write_token(Token![|], span);
|
targets_buf.write_token(Token![|], span);
|
||||||
}
|
}
|
||||||
this.visit_target(ctx, &mut targets_buf, true, true, target);
|
this.visit_target(ctx, &mut targets_buf, true, true, target, span);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut arm_buf = Buffer::new();
|
let mut arm_buf = Buffer::new();
|
||||||
@ -527,7 +527,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
if let Some(cond) = &loop_block.cond {
|
if let Some(cond) = &loop_block.cond {
|
||||||
this.push_locals(|this| {
|
this.push_locals(|this| {
|
||||||
let mut target_buf = Buffer::new();
|
let mut target_buf = Buffer::new();
|
||||||
this.visit_target(ctx, &mut target_buf, true, true, &loop_block.var);
|
this.visit_target(ctx, &mut target_buf, true, true, &loop_block.var, span);
|
||||||
let target_buf = target_buf.into_token_stream();
|
let target_buf = target_buf.into_token_stream();
|
||||||
let mut expr_buf = Buffer::new();
|
let mut expr_buf = Buffer::new();
|
||||||
this.visit_expr(ctx, &mut expr_buf, cond)?;
|
this.visit_expr(ctx, &mut expr_buf, cond)?;
|
||||||
@ -549,7 +549,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
|
|
||||||
let size_hint1 = this.push_locals(|this| {
|
let size_hint1 = this.push_locals(|this| {
|
||||||
let mut target_buf = Buffer::new();
|
let mut target_buf = Buffer::new();
|
||||||
this.visit_target(ctx, &mut target_buf, true, true, &loop_block.var);
|
this.visit_target(ctx, &mut target_buf, true, true, &loop_block.var, span);
|
||||||
let target_buf = target_buf.into_token_stream();
|
let target_buf = target_buf.into_token_stream();
|
||||||
|
|
||||||
let mut loop_body_buf = Buffer::new();
|
let mut loop_body_buf = Buffer::new();
|
||||||
@ -837,7 +837,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
if l.is_mutable {
|
if l.is_mutable {
|
||||||
buf.write_token(Token![mut], span);
|
buf.write_token(Token![mut], span);
|
||||||
}
|
}
|
||||||
self.visit_target(ctx, buf, false, true, &l.var);
|
self.visit_target(ctx, buf, false, true, &l.var, span);
|
||||||
buf.write_token(Token![;], span);
|
buf.write_token(Token![;], span);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
@ -871,7 +871,7 @@ impl<'a> Generator<'a, '_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.visit_target(ctx, buf, true, true, &l.var);
|
self.visit_target(ctx, buf, true, true, &l.var, span);
|
||||||
// If it's not taking the ownership of a local variable or copyable, then we need to add
|
// If it's not taking the ownership of a local variable or copyable, then we need to add
|
||||||
// a reference.
|
// a reference.
|
||||||
let borrow = !matches!(***val, Expr::Try(..))
|
let borrow = !matches!(***val, Expr::Try(..))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user