Paste sometimes produces keywords
Paste will produce a keyword instead of an identifier in some cases:
use paste::paste;
macro_rules! empty_items{
($name:ident $(- $name_tail:ident)*) => { paste!{
struct [< $name:camel $( $name_tail)* >];
fn [< $name:snake $( _ $name_tail:snake)* >]() {}
}}
}
empty_items!(r#loop); // Error: expected identifier, found keyword `loop`
empty_items!(se-lf); // Error: expected identifier, found keyword `Self`
empty_items!(Loop); // Error: expected identifier, found keyword `loop`
empty_items!(r#loop-xyz); // Ok
Note that fixing this would be a breaking change as currently paste could be (ab)used to remove the r# from raw idents (say, for stringify!).
Maybe it's also worth thinking about whether, for example, paste!{ [< loop >] } should produce a raw identifier, rather than a keyword.
I have a similar problem with . and ::
How can I join the identifier $self to attribute to obtain $self.attribute? Becuase . is interpreted as special character not as a single char of a string
Maybe it's also worth thinking about whether, for example,
paste!{ [< loop >] }should produce a raw identifier, rather than a keyword.
Maybe paste! should always produce raw identifiers or there should be an alternative of [< use >] that does, like {< use >} or [< r# use >].
The issue seems really hard to work around atm. Any chance this can be implemented soonish @dtolnay ?