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 Literals 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

Unresolved Questions

  1. https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html