Correctly set the span of the proc_macro crate's Group delimiters

Previously only the open delimiter's span was set, and this caused... weird problems.
This commit is contained in:
Chayim Refael Friedman 2025-05-21 18:31:14 +03:00
parent 96a253112c
commit bf8d03c1b5
4 changed files with 15 additions and 5 deletions

View File

@ -258,7 +258,9 @@ impl server::TokenStream for RaSpanServer {
&mut self, &mut self,
stream: Self::TokenStream, stream: Self::TokenStream,
) -> Vec<bridge::TokenTree<Self::TokenStream, Self::Span, Self::Symbol>> { ) -> Vec<bridge::TokenTree<Self::TokenStream, Self::Span, Self::Symbol>> {
stream.into_bridge() stream.into_bridge(&mut |first, second| {
server::Span::join(self, first, second).unwrap_or(first)
})
} }
} }

View File

@ -238,7 +238,8 @@ impl server::TokenStream for TokenIdServer {
&mut self, &mut self,
stream: Self::TokenStream, stream: Self::TokenStream,
) -> Vec<bridge::TokenTree<Self::TokenStream, Self::Span, Self::Symbol>> { ) -> Vec<bridge::TokenTree<Self::TokenStream, Self::Span, Self::Symbol>> {
stream.into_bridge() // Can't join with `TokenId`.
stream.into_bridge(&mut |first, _second| first)
} }
} }

View File

@ -56,7 +56,10 @@ impl<S: Copy> TokenStream<S> {
self.token_trees.is_empty() self.token_trees.is_empty()
} }
pub(crate) fn into_bridge(self) -> Vec<bridge::TokenTree<Self, S, intern::Symbol>> { pub(crate) fn into_bridge(
self,
join_spans: &mut dyn FnMut(S, S) -> S,
) -> Vec<bridge::TokenTree<Self, S, intern::Symbol>> {
let mut result = Vec::new(); let mut result = Vec::new();
let mut iter = self.token_trees.into_iter(); let mut iter = self.token_trees.into_iter();
while let Some(tree) = iter.next() { while let Some(tree) = iter.next() {
@ -98,7 +101,11 @@ impl<S: Copy> TokenStream<S> {
token_trees: iter.by_ref().take(subtree.usize_len()).collect(), token_trees: iter.by_ref().take(subtree.usize_len()).collect(),
}) })
}, },
span: bridge::DelimSpan::from_single(subtree.delimiter.open), span: bridge::DelimSpan {
open: subtree.delimiter.open,
close: subtree.delimiter.close,
entire: join_spans(subtree.delimiter.open, subtree.delimiter.close),
},
})) }))
} }
} }

View File

@ -144,7 +144,7 @@ fn test_fn_like_macro_clone_ident_subtree() {
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024 SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
IDENT ident 42:2@0..5#ROOT2024 IDENT ident 42:2@0..5#ROOT2024
PUNCH , [alone] 42:2@5..6#ROOT2024 PUNCH , [alone] 42:2@5..6#ROOT2024
SUBTREE [] 42:2@7..8#ROOT2024 42:2@7..8#ROOT2024"#]], SUBTREE [] 42:2@7..9#ROOT2024 42:2@7..9#ROOT2024"#]],
); );
} }