dtolnay / paste

Macros for all your token pasting needs
Apache License 2.0
983 stars 53 forks source link

Paste sometimes produces keywords #74

Open simon-bourne opened 2 years ago

simon-bourne commented 2 years ago

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.

IridiumXOR commented 1 year ago

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

FlorianUekermann commented 4 months ago

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 ?