Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/mbe/src/expander/transcriber.rs')
-rw-r--r--crates/mbe/src/expander/transcriber.rs50
1 files changed, 23 insertions, 27 deletions
diff --git a/crates/mbe/src/expander/transcriber.rs b/crates/mbe/src/expander/transcriber.rs
index d1bcf3dbcc..0c15b68591 100644
--- a/crates/mbe/src/expander/transcriber.rs
+++ b/crates/mbe/src/expander/transcriber.rs
@@ -132,8 +132,9 @@ pub(super) fn transcribe<S: Span>(
bindings: &Bindings<S>,
marker: impl Fn(&mut S) + Copy,
new_meta_vars: bool,
+ call_site: S,
) -> ExpandResult<tt::Subtree<S>> {
- let mut ctx = ExpandCtx { bindings, nesting: Vec::new(), new_meta_vars };
+ let mut ctx = ExpandCtx { bindings, nesting: Vec::new(), new_meta_vars, call_site };
let mut arena: Vec<tt::TokenTree<S>> = Vec::new();
expand_subtree(&mut ctx, template, None, &mut arena, marker)
}
@@ -154,6 +155,7 @@ struct ExpandCtx<'a, S> {
bindings: &'a Bindings<S>,
nesting: Vec<NestingState>,
new_meta_vars: bool,
+ call_site: S,
}
fn expand_subtree<S: Span>(
@@ -208,13 +210,13 @@ fn expand_subtree<S: Span>(
Op::Var { name, id, .. } => {
let ExpandResult { value: fragment, err: e } = expand_var(ctx, name, *id, marker);
err = err.or(e);
- push_fragment(arena, fragment);
+ push_fragment(ctx, arena, fragment);
}
Op::Repeat { tokens: subtree, kind, separator } => {
let ExpandResult { value: fragment, err: e } =
expand_repeat(ctx, subtree, *kind, separator, arena, marker);
err = err.or(e);
- push_fragment(arena, fragment)
+ push_fragment(ctx, arena, fragment)
}
Op::Ignore { name, id } => {
// Expand the variable, but ignore the result. This registers the repetition count.
@@ -227,9 +229,7 @@ fn expand_subtree<S: Span>(
arena.push(
tt::Leaf::Literal(tt::Literal {
text: index.to_string().into(),
- // FIXME
- #[allow(deprecated)]
- span: S::DUMMY,
+ span: ctx.call_site,
})
.into(),
);
@@ -242,9 +242,7 @@ fn expand_subtree<S: Span>(
arena.push(
tt::Leaf::Literal(tt::Literal {
text: length.to_string().into(),
- // FIXME
- #[allow(deprecated)]
- span: S::DUMMY,
+ span: ctx.call_site,
})
.into(),
);
@@ -309,9 +307,7 @@ fn expand_subtree<S: Span>(
arena.push(
tt::Leaf::Literal(tt::Literal {
text: c.to_string().into(),
- // FIXME
- #[allow(deprecated)]
- span: S::DUMMY,
+ span: ctx.call_site,
})
.into(),
);
@@ -367,12 +363,8 @@ fn expand_var<S: Span>(
}
Err(e) => ExpandResult {
value: Fragment::Tokens(tt::TokenTree::Subtree(tt::Subtree::empty(tt::DelimSpan {
- // FIXME
- #[allow(deprecated)]
- open: S::DUMMY,
- // FIXME
- #[allow(deprecated)]
- close: S::DUMMY,
+ open: ctx.call_site,
+ close: ctx.call_site,
}))),
err: Some(e),
},
@@ -475,13 +467,17 @@ fn expand_repeat<S: Span>(
ExpandResult { value: Fragment::Tokens(tt), err }
}
-fn push_fragment<S: Span>(buf: &mut Vec<tt::TokenTree<S>>, fragment: Fragment<S>) {
+fn push_fragment<S: Span>(
+ ctx: &ExpandCtx<'_, S>,
+ buf: &mut Vec<tt::TokenTree<S>>,
+ fragment: Fragment<S>,
+) {
match fragment {
Fragment::Tokens(tt::TokenTree::Subtree(tt)) => push_subtree(buf, tt),
Fragment::Expr(sub) => {
push_subtree(buf, sub);
}
- Fragment::Path(tt) => fix_up_and_push_path_tt(buf, tt),
+ Fragment::Path(tt) => fix_up_and_push_path_tt(ctx, buf, tt),
Fragment::Tokens(tt) => buf.push(tt),
}
}
@@ -496,7 +492,11 @@ fn push_subtree<S>(buf: &mut Vec<tt::TokenTree<S>>, tt: tt::Subtree<S>) {
/// Inserts the path separator `::` between an identifier and its following generic
/// argument list, and then pushes into the buffer. See [`Fragment::Path`] for why
/// we need this fixup.
-fn fix_up_and_push_path_tt<S: Span>(buf: &mut Vec<tt::TokenTree<S>>, subtree: tt::Subtree<S>) {
+fn fix_up_and_push_path_tt<S: Span>(
+ ctx: &ExpandCtx<'_, S>,
+ buf: &mut Vec<tt::TokenTree<S>>,
+ subtree: tt::Subtree<S>,
+) {
stdx::always!(matches!(subtree.delimiter.kind, tt::DelimiterKind::Invisible));
let mut prev_was_ident = false;
// Note that we only need to fix up the top-level `TokenTree`s because the
@@ -513,9 +513,7 @@ fn fix_up_and_push_path_tt<S: Span>(buf: &mut Vec<tt::TokenTree<S>>, subtree: tt
tt::Leaf::Punct(tt::Punct {
char: ':',
spacing: tt::Spacing::Joint,
- // FIXME
- #[allow(deprecated)]
- span: S::DUMMY,
+ span: ctx.call_site,
})
.into(),
);
@@ -523,9 +521,7 @@ fn fix_up_and_push_path_tt<S: Span>(buf: &mut Vec<tt::TokenTree<S>>, subtree: tt
tt::Leaf::Punct(tt::Punct {
char: ':',
spacing: tt::Spacing::Alone,
- // FIXME
- #[allow(deprecated)]
- span: S::DUMMY,
+ span: ctx.call_site,
})
.into(),
);