From ce4d08190871bed6f6fc236e22f4d27acb6c5819 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 26 Dec 2021 22:44:51 -0800 Subject: [PATCH] Recursively respan tokens interpolated from a macro_rules metavariable --- src/runtime.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/runtime.rs b/src/runtime.rs index aad0a51..c444fa7 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -184,10 +184,24 @@ pub fn parse(tokens: &mut TokenStream, s: &str) { pub fn parse_spanned(tokens: &mut TokenStream, span: Span, s: &str) { let s: TokenStream = s.parse().expect("invalid token stream"); - tokens.extend(s.into_iter().map(|mut t| { - t.set_span(span); - t - })); + tokens.extend(s.into_iter().map(|t| respan_token_tree(t, span))); +} + +// Token tree with every span replaced by the given one. +fn respan_token_tree(mut token: TokenTree, span: Span) -> TokenTree { + match &mut token { + TokenTree::Group(g) => { + let stream = g + .stream() + .into_iter() + .map(|token| respan_token_tree(token, span)) + .collect(); + *g = Group::new(g.delimiter(), stream); + g.set_span(span); + } + other => other.set_span(span), + } + token } pub fn push_ident(tokens: &mut TokenStream, s: &str) {