是否有可能获得完整的"命名空间"自定义派生中的结构?

时间:2018-01-01 13:42:44

标签: rust

我已阅读this documentation page,但我仍然无法弄清楚如何执行此操作。

我的档案是:

|- pancakes.rs
|- main.rs

我在" pancakes.rs"中得到结构Pancakes

#[derive(HelloWorld)]
struct Pancakes;

我从文档中复制了以下实现,但ident不包含完整的"命名空间":

#[proc_macro_derive(HelloWorld)]
pub fn hello_world(input: TokenStream) -> TokenStream {
    let s = input.to_string();
    let ast = syn::parse_derive_input(&s).unwrap();
    let gen = impl_hello_world(&ast);
    gen.parse().unwrap()
}

fn impl_hello_world(ast: &syn::DeriveInput) -> quote::Tokens {
    let name = &ast.ident; // <---- HERE name = Pancakes, not pancakes::Pancakes
    quote! {
        impl HelloWorld for #name {
            fn hello_world() {
                println!("Hello, World! My name is {}", stringify!(#name));
            }
        }
    }
}

是否有可能获得有关结构的所有信息?我还希望从使用派生的地方获取货物的名称。

1 个答案:

答案 0 :(得分:3)

这是不可能的。自定义派生工作在令牌流上,您可以从中轻松构建AST。但是在这个级别上,名称尚未解析(这是有道理的,宏和自定义派生可能会影响名称的解析方式,因此需要先完全消耗它们。)