Skip to main content

chunked_quote/
lib.rs

1//! [`quote`] using only one [`TokenStream`](proc_macro2::TokenStream).
2//!
3//! this crate provide a [`quote`] inspired macro [`chunk!`] that builds [`TokenStream`](proc_macro2::TokenStream)s though direct appending not object composition.
4//!
5//! it support all [`quote`] features except `macro_rules` inspired repetetion, and add additional features like control flow and do blocks.
6
7pub use chunked_quote_impl::{chunk, chunk_spanned, quote, quote_spanned};
8
9#[doc(hidden)]
10pub mod __private {
11	use std::str::FromStr;
12
13	pub use proc_macro2::{
14		Delimiter::{self, *},
15		Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
16	};
17	pub use quote::ToTokens;
18
19	pub trait TokenStreamExt {
20		fn __push_ident(&mut self, ident: &str, span: Span);
21		fn __push_ident_raw(&mut self, ident: &str, span: Span);
22		fn __push_punct_alone(&mut self, punct: char, span: Span);
23		fn __push_punct_joint(&mut self, punct: char, span: Span);
24		fn __push_literal(&mut self, literal: &str, span: Span);
25		fn __push_group(&mut self, delim: Delimiter, span: Span, stream: TokenStream);
26	}
27	impl TokenStreamExt for TokenStream {
28		fn __push_ident(&mut self, ident: &str, span: Span) {
29			self.extend(Some(Ident::new(ident, span)));
30		}
31		fn __push_ident_raw(&mut self, ident: &str, span: Span) {
32			self.extend(Some(Ident::new_raw(ident, span)));
33		}
34		fn __push_punct_alone(&mut self, punct: char, span: Span) {
35			let mut punct = Punct::new(punct, Spacing::Alone);
36			punct.set_span(span);
37			self.extend(Some(punct));
38		}
39		fn __push_punct_joint(&mut self, punct: char, span: Span) {
40			let mut punct = Punct::new(punct, Spacing::Joint);
41			punct.set_span(span);
42			self.extend(Some(punct));
43		}
44		fn __push_literal(&mut self, literal: &str, span: Span) {
45			let mut literal = Literal::from_str(literal).unwrap();
46			literal.set_span(span);
47			self.extend(Some(literal));
48		}
49		fn __push_group(&mut self, delim: Delimiter, span: Span, stream: TokenStream) {
50			let mut group = Group::new(delim, stream);
51			group.set_span(span);
52			self.extend(Some(group));
53		}
54	}
55}