//! This quasiquoter uses macros 2.0 hygiene to reliably access
//! items from `proc_macro`, to build a `proc_macro::TokenStream`.
-use {Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
+use crate::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
macro_rules! quote_tt {
(($($t:tt)*)) => { Group::new(Delimiter::Parenthesis, quote!($($t)*)) };
#[unstable(feature = "proc_macro_quote", issue = "54722")]
pub fn quote(stream: TokenStream) -> TokenStream {
if stream.is_empty() {
- return quote!(::TokenStream::new());
+ return quote!(crate::TokenStream::new());
}
let mut after_dollar = false;
let tokens = stream
after_dollar = false;
match tree {
TokenTree::Ident(_) => {
- return Some(quote!(Into::<::TokenStream>::into(
+ return Some(quote!(Into::<crate::TokenStream>::into(
Clone::clone(&(@ tree))),));
}
TokenTree::Punct(ref tt) if tt.as_char() == '$' => {}
}
}
- Some(quote!(::TokenStream::from((@ match tree {
- TokenTree::Punct(tt) => quote!(::TokenTree::Punct(::Punct::new(
+ Some(quote!(crate::TokenStream::from((@ match tree {
+ TokenTree::Punct(tt) => quote!(crate::TokenTree::Punct(crate::Punct::new(
(@ TokenTree::from(Literal::character(tt.as_char()))),
(@ match tt.spacing() {
- Spacing::Alone => quote!(::Spacing::Alone),
- Spacing::Joint => quote!(::Spacing::Joint),
+ Spacing::Alone => quote!(crate::Spacing::Alone),
+ Spacing::Joint => quote!(crate::Spacing::Joint),
}),
))),
- TokenTree::Group(tt) => quote!(::TokenTree::Group(::Group::new(
+ TokenTree::Group(tt) => quote!(crate::TokenTree::Group(crate::Group::new(
(@ match tt.delimiter() {
- Delimiter::Parenthesis => quote!(::Delimiter::Parenthesis),
- Delimiter::Brace => quote!(::Delimiter::Brace),
- Delimiter::Bracket => quote!(::Delimiter::Bracket),
- Delimiter::None => quote!(::Delimiter::None),
+ Delimiter::Parenthesis => quote!(crate::Delimiter::Parenthesis),
+ Delimiter::Brace => quote!(crate::Delimiter::Brace),
+ Delimiter::Bracket => quote!(crate::Delimiter::Bracket),
+ Delimiter::None => quote!(crate::Delimiter::None),
}),
(@ quote(tt.stream())),
))),
- TokenTree::Ident(tt) => quote!(::TokenTree::Ident(::Ident::new(
+ TokenTree::Ident(tt) => quote!(crate::TokenTree::Ident(crate::Ident::new(
(@ TokenTree::from(Literal::string(&tt.to_string()))),
(@ quote_span(tt.span())),
))),
- TokenTree::Literal(tt) => quote!(::TokenTree::Literal({
+ TokenTree::Literal(tt) => quote!(crate::TokenTree::Literal({
let mut iter = (@ TokenTree::from(Literal::string(&tt.to_string())))
- .parse::<::TokenStream>()
+ .parse::<crate::TokenStream>()
.unwrap()
.into_iter();
- if let (Some(::TokenTree::Literal(mut lit)), None) =
+ if let (Some(crate::TokenTree::Literal(mut lit)), None) =
(iter.next(), iter.next())
{
lit.set_span((@ quote_span(tt.span())));
panic!("unexpected trailing `$` in `quote!`");
}
- quote!([(@ tokens)].iter().cloned().collect::<::TokenStream>())
+ quote!([(@ tokens)].iter().cloned().collect::<crate::TokenStream>())
}
/// Quote a `Span` into a `TokenStream`.
/// This is needed to implement a custom quoter.
#[unstable(feature = "proc_macro_quote", issue = "54722")]
pub fn quote_span(_: Span) -> TokenStream {
- quote!(::Span::def_site())
+ quote!(crate::Span::def_site())
}