112 lines · 2.7 KB · Rust
RawDownload
// SPDX-License-Identifier: Apache-2.0 OR MIT use super::ToTokens;use core::iter;use proc_macro2::{TokenStream, TokenTree}; /// TokenStream extension trait with methods for appending tokens.////// This trait is sealed and cannot be implemented outside of the `quote` crate.pub trait TokenStreamExt: private::Sealed {    /// For use by `ToTokens` implementations.    ///    /// Appends the token specified to this list of tokens.    fn append<U>(&mut self, token: U)    where        U: Into<TokenTree>;     /// For use by `ToTokens` implementations.    ///    /// ```    /// # use quote::{quote, TokenStreamExt, ToTokens};    /// # use proc_macro2::TokenStream;    /// #    /// struct X;    ///    /// impl ToTokens for X {    ///     fn to_tokens(&self, tokens: &mut TokenStream) {    ///         tokens.append_all(&[true, false]);    ///     }    /// }    ///    /// let tokens = quote!(#X);    /// assert_eq!(tokens.to_string(), "true false");    /// ```    fn append_all<I>(&mut self, iter: I)    where        I: IntoIterator,        I::Item: ToTokens;     /// For use by `ToTokens` implementations.    ///    /// Appends all of the items in the iterator `I`, separated by the tokens    /// `U`.    fn append_separated<I, U>(&mut self, iter: I, op: U)    where        I: IntoIterator,        I::Item: ToTokens,        U: ToTokens;     /// For use by `ToTokens` implementations.    ///    /// Appends all tokens in the iterator `I`, appending `U` after each    /// element, including after the last element of the iterator.    fn append_terminated<I, U>(&mut self, iter: I, term: U)    where        I: IntoIterator,        I::Item: ToTokens,        U: ToTokens;} impl TokenStreamExt for TokenStream {    fn append<U>(&mut self, token: U)    where        U: Into<TokenTree>,    {        self.extend(iter::once(token.into()));    }     fn append_all<I>(&mut self, iter: I)    where        I: IntoIterator,        I::Item: ToTokens,    {        for token in iter {            token.to_tokens(self);        }    }     fn append_separated<I, U>(&mut self, iter: I, op: U)    where        I: IntoIterator,        I::Item: ToTokens,        U: ToTokens,    {        for (i, token) in iter.into_iter().enumerate() {            if i > 0 {                op.to_tokens(self);            }            token.to_tokens(self);        }    }     fn append_terminated<I, U>(&mut self, iter: I, term: U)    where        I: IntoIterator,        I::Item: ToTokens,        U: ToTokens,    {        for token in iter {            token.to_tokens(self);            term.to_tokens(self);        }    }} mod private {    use proc_macro2::TokenStream;     pub trait Sealed {}     impl Sealed for TokenStream {}}