Open
Description
openedon Sep 28, 2024
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<T> { /* ... */ }
impl<T: ToTokens + ?Sized> ToTokens for Rc<T> { /* ... */ }
impl<T: ToTokens> ToTokens for Option<T> { /* ... */ }
impl<T: ToTokens + ToOwned + ?Sized> ToTokens for Cow<T> { /* ... */ }
// 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 supportproc_macro::quote
libs-team#431 - Implementation in
proc_macro
: Add a new traitproc_macro::ToTokens
#131441 - 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))
Footnotes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Metadata
Assignees
Labels
Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)Area: Procedural macrosCategory: A tracking issue for an RFC or an unstable feature.Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.Call for participation: Help is requested to fix this issue.Relevant to the library API team, which will review and decide on the PR/issue.Working group: Macros