Преобразование типа внутри цитаты! дает черты ошибок - PullRequest
0 голосов
/ 25 апреля 2020

Я получаю эту ошибку:

черта quote::to_tokens::ToTokens не реализована для proc_macro::Ident

, когда я пытаюсь запустить этот код:

#[proc_macro_hack]
pub fn between(input: TokenStream) -> TokenStream {
    let idents = input
        .into_iter()
        .map(|i| match i {
            TokenTree::Ident(b) => {
                b
            },
            _ => panic!()
        })
        .collect::<Vec<_>>();

    let new_token_stream = quote! {
        (#(#idents),*)
    };

    new_token_stream.into()
}

Вот как я хочу его использовать:

fn main() {
    let a = 1;
    let b = 2;

    // Expand to (a, b);
    between!(a, b);
}

У меня также есть небольшой проект, который содержит код выше: https://bitbucket.org/JoshSinne/pm/src/master/. Почему я не могу преобразовать Ident внутри токенов? Я пытался использовать parse, into, но у меня это не сработало. Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2020

syn и quote созданы против альтернативной реализации proc_macro, а именно proc_macro2 . Если вы хотите их использовать, вы должны сначала преобразовать proc_macro::TokenStream в proc_macro2::TokenStream, выполнить все необходимые операции и в конце преобразовать обратно. Оба эти преобразования могут быть выполнены с использованием From / Into, поскольку они осуществляются в обоих направлениях.

...