Using $crate in Rust's procedural macros?

…衆ロ難τιáo~ 提交于 2020-01-12 04:10:35

问题


I know what the $crate variable is, but as far as I can tell, it can't be used inside procedural macros. Is there another way to achieve a similar effect?

I have an example that roughly requires me to write something like this using quote and nightly Rust

quote!(
     struct Foo {
        bar: [SomeTrait;#len]
     }
)

I need to make sure SomeTrait is in scope (#len is referencing an integer outside the scope of the snippet).

I am using procedural macros 2.0 on nightly using quote and syn because proc-macro-hack didn't work for me. This is the example I'm trying to generalize.


回答1:


Based on replies from https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528, it looks like there is no way to do this (as of 2018-08), neither to refer to the proc-macro crate nor to refer to any other crate unambiguously.




回答2:


In Edition 2015 (classic Rust), you can do this (but it's hacky):

  • use ::defining_crate::SomeTrait in the macro
  • within third-party crates depending on defining_crate, the above works fine
  • within defining_crate itself, add a module in the root:

    mod defining_crate { pub use super::*; }

In Edition 2018 even more hacky solutions are required (see this issue), though #55275 may give us a simple workaround.




回答3:


Since Rust 1.34, you can use extern my_crate as self, and use my_crate::Foo instead of $crate::Foo.

https://github.com/rust-lang/rust/issues/54647

https://github.com/rust-lang/rust/pull/57407

(Credit: Neptunepink ##rust irc.freenode.net)



来源:https://stackoverflow.com/questions/44950574/using-crate-in-rusts-procedural-macros

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!