macro_rules: Less hacky heuristic for using tt
metavariable spans
This commit is contained in:
parent
139fb22146
commit
e1d12c8caf
11 changed files with 85 additions and 92 deletions
|
@ -26,7 +26,7 @@ use rustc_span::{sym, Span, Symbol, DUMMY_SP};
|
|||
use smallvec::{smallvec, SmallVec};
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::{cmp, fmt, iter, mem};
|
||||
use std::{cmp, fmt, iter};
|
||||
|
||||
/// When the main Rust parser encounters a syntax-extension invocation, it
|
||||
/// parses the arguments to the invocation as a token tree. This is a very
|
||||
|
@ -81,14 +81,6 @@ impl TokenTree {
|
|||
}
|
||||
}
|
||||
|
||||
/// Modify the `TokenTree`'s span in-place.
|
||||
pub fn set_span(&mut self, span: Span) {
|
||||
match self {
|
||||
TokenTree::Token(token, _) => token.span = span,
|
||||
TokenTree::Delimited(dspan, ..) => *dspan = DelimSpan::from_single(span),
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a `TokenTree::Token` with alone spacing.
|
||||
pub fn token_alone(kind: TokenKind, span: Span) -> TokenTree {
|
||||
TokenTree::Token(Token::new(kind, span), Spacing::Alone)
|
||||
|
@ -461,19 +453,6 @@ impl TokenStream {
|
|||
t1.next().is_none() && t2.next().is_none()
|
||||
}
|
||||
|
||||
/// Applies the supplied function to each `TokenTree` and its index in `self`, returning a new `TokenStream`
|
||||
///
|
||||
/// It is equivalent to `TokenStream::new(self.trees().cloned().enumerate().map(|(i, tt)| f(i, tt)).collect())`.
|
||||
pub fn map_enumerated_owned(
|
||||
mut self,
|
||||
mut f: impl FnMut(usize, TokenTree) -> TokenTree,
|
||||
) -> TokenStream {
|
||||
let owned = Lrc::make_mut(&mut self.0); // clone if necessary
|
||||
// rely on vec's in-place optimizations to avoid another allocation
|
||||
*owned = mem::take(owned).into_iter().enumerate().map(|(i, tree)| f(i, tree)).collect();
|
||||
self
|
||||
}
|
||||
|
||||
/// Create a token stream containing a single token with alone spacing. The
|
||||
/// spacing used for the final token in a constructed stream doesn't matter
|
||||
/// because it's never used. In practice we arbitrarily use
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue