Tracking Issue for proc_macro::ToTokens
· Issue #130977 · rust-lang/rust (original) (raw)
Feature gate: #![feature(proc_macro_totokens)]
This is a tracking issue for adding a ToTokens
trait in proc_macro
, which can then be used in proc_macro::quote!
. See the ACP for motivation.
Public API
This will be similar to quote::ToTokens. That can be used as a reference for implementation details since it already provides all of these.
// proc_macro
pub trait ToTokens { fn to_tokens(&self, tokens: &mut TokenStream); fn to_token_stream(&self) -> TokenStream { ... } fn into_token_stream(self) -> TokenStream where Self: Sized { ... } }
// Aggregate token types impl ToTokens for TokenTree { /* ... / } impl ToTokens for TokenStream { / ... */ }
// Single token types impl ToTokens for Literal { /* ... / } impl ToTokens for Ident { / ... / } impl ToTokens for Punct { / ... / } impl ToTokens for Group { / ... */ }
// Indirect types impl<T: ToTokens + ?Sized> ToTokens for &T { /* ... / } impl<T: ToTokens + ?Sized> ToTokens for &mut T { / ... / } impl<T: ToTokens + ?Sized> ToTokens for Box { / ... / } impl<T: ToTokens + ?Sized> ToTokens for Rc { / ... / } impl<T: ToTokens> ToTokens for Option { / ... / } impl<T: ToTokens + ToOwned + ?Sized> ToTokens for Cow { / ... */ }
// Types that can create Literal
s
impl ToTokens for {u,i}{8,16,32,64,128} { /* ... / }
impl ToTokens for f{16,32,64,128} { / ... / }
impl ToTokens for bool { / ... / }
impl ToTokens for char { / ... / }
impl ToTokens for str { / ... / }
impl ToTokens for String { / ... / }
impl ToTokens for CStr { / ... / }
impl ToTokens for CString { / ... */ }
/* migrate the following APIs, if possible without breakage */
// currently Extend<TokenStream>
and Extend<TokenTree>
impl Extend<T: ToTokens> for TokenStream { /* ... */ }
// currently FromIterator<TokenStream>
and FromIterator<TokenTree>
impl FromIterator<T: ToTokens> for TokenStream { /* ... */ }
Steps / History
- ACP: ACP: add proc_macro::ToTokens to support proc_macro::quote libs-team#431
- Implementation in
proc_macro
: Add a new trait proc_macro::ToTokens #131441 - Use in
proc_macro::quote!
: proc_macro: Use ToTokens trait in quote macro #134693 - Update
proc_macro::quote!
to use these traits: #... - Final comment period (FCP)1
- Stabilization PR
Unresolved Questions
- What should this be named?
ToTokens
doesn't seem quite accurate, but I don't know what would be better (ToTokenStream
?ExtendTokenStream
? Those seem a bit clunky). - Considering
impl<T: ToTokens> ToTokens
for T is provided, should to_tokens take self by value rather than by reference so cloning isn't always necessary? (fn to_tokens(self, tokens: &mut TokenStream))