From f1243a0ceb1c596f808c8df8d1240ed301135a1b Mon Sep 17 00:00:00 2001 From: David Tolnay <dtolnay@gmail.com> Date: Tue, 17 Dec 2024 18:49:14 -0800 Subject: [PATCH] Fix spans on macro-generated bindings and format variables --- impl/src/fmt.rs | 18 +++++++++++------- impl/src/unraw.rs | 4 ++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/impl/src/fmt.rs b/impl/src/fmt.rs index 5c0ff50..1da28c1 100644 --- a/impl/src/fmt.rs +++ b/impl/src/fmt.rs @@ -107,12 +107,14 @@ impl Display<'_> { } }; infinite_recursive |= member == *"self" && bound == Trait::Display; - if let Some(&field) = member_index.get(&member) { - implied_bounds.insert((field, bound)); - } else { - out += &member.to_string(); - continue; - } + let field = match member_index.get(&member) { + Some(&field) => field, + None => { + out += &member.to_string(); + continue; + } + }; + implied_bounds.insert((field, bound)); let formatvar_prefix = if bonus_display { "__display" } else if bound == Trait::Pointer { @@ -129,15 +131,17 @@ impl Display<'_> { while user_named_args.contains(&formatvar) { formatvar = IdentUnraw::new(format_ident!("_{}", formatvar.to_string())); } + formatvar.set_span(span); out += &formatvar.to_string(); if !macro_named_args.insert(formatvar.clone()) { // Already added to bindings by a previous use. continue; } - let binding_value = match &member { + let mut binding_value = match &member { MemberUnraw::Unnamed(index) => format_ident!("_{}", index), MemberUnraw::Named(ident) => ident.to_local(), }; + binding_value.set_span(span.resolved_at(fields[field].member.span())); let wrapped_binding_value = if bonus_display { quote_spanned!(span=> #binding_value.as_display()) } else if bound == Trait::Pointer { diff --git a/impl/src/unraw.rs b/impl/src/unraw.rs index a232621..73b9970 100644 --- a/impl/src/unraw.rs +++ b/impl/src/unraw.rs @@ -28,6 +28,10 @@ impl IdentUnraw { } unraw } + + pub fn set_span(&mut self, span: Span) { + self.0.set_span(span); + } } impl Display for IdentUnraw {