问题标签 [rust-proc-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
482 浏览

rust - 推断调用板条箱的名称以在程序宏中填充 doctest

我正在创建一个从某个配置文件自动生成库的程序宏(它是一个寄存器布局,但这对于这个问题并不重要)。

我希望该库自动生成自动库随附的文档,并包含应该使用cargo test. 现在,我已经实现了大部分,但有一个问题我看不到解决方案。

假设我们有一个调用的库my_lib,我们在其中调用宏来填充它:

扩展为:

这将按预期运行 -cargo doc将做正确的事情cargo test并按预期运行文档测试。

问题是,在这个例子中,use my_lib被硬编码到my_macro_lib这显然是不可取的。

如何创建一个宏来推断正在调用的 crate 的名称?

我尝试macro_rules!在程序宏内部使用 a expand $crate,但这违反了卫生规则。

0 投票
1 回答
424 浏览

rust - 如何在类似函数的过程宏中计算类型的实例并返回它?

我有类型Foo

现在我想创建一个过程宏来创建这个结构的一个实例。这可能涉及繁重的计算、文件访问或其他只有过程宏才能做的事情,但如何创建该实例的确切细节在这里并不重要。

我这样定义我的程序宏:

我的程序宏的用户应该能够这样写:

请注意,它Foo可能包含大量数据,例如数兆字节的Vec数据。

如何Foo从我的程序宏中返回值?

0 投票
2 回答
2993 浏览

rust - 如何创建类似函数的过程宏?

应该如何a_proc_macro定义它“返回”一个 5?

0 投票
1 回答
346 浏览

rust - 在过程宏中,如何检查字符串是否是有效的变量名而不是关键字?

在过程宏中,我希望能够检查字符串是有效的变量名而不是关键字。

proc_macro2::Ident如果尝试使用无效的变量名会惊慌,但它会允许我不想被允许的关键字。在恐慌之前使用漂亮且有用的错误消息来处理错误也会更好。

是否有一些宏或函数(在板条箱中或其他地方)会检查字符串是否符合关于变量名的规则?我可能可以用正则表达式来做到这一点,但龙生活在正则表达式中。

用例是处理用户输入字符串,其中可能包括垃圾字符串。

0 投票
2 回答
2211 浏览

rust - 如何在过程宏生成的代码中创建卫生标识符?

在编写声明式 ( macro_rules!) 宏时,我们会自动获得宏卫生。在此示例中,我声明了一个f在宏中命名的变量,并传入一个标识符,该标识符f成为局部变量:

此代码可以编译,但如果您查看部分扩展的代码,您会发现存在明显的冲突:

我正在编写这个声明性宏的等效项作为过程宏,但不知道如何避免用户提供的标识符和我的宏创建的标识符之间的潜在名称冲突。据我所知,生成的代码没有卫生的概念,只是一个字符串:

src/main.rs

货运.toml

my_derive/src/lib.rs

my_derive/Cargo.toml

对于 Rust 1.40,这会产生编译器错误:

有哪些技术可以从我无法控制的标识符中命名我的标识符?

0 投票
1 回答
420 浏览

rust - 如何将标识符 (`proc_macro::Ident`) 存储为常量以避免重复?

我正在编写一个程序宏,我需要多次发出一个很长的标识符(例如,可能是因为卫生)。我quote!用来创建TokenStreams,但我不想一遍又一遍地重复长标识符!

例如,我想生成以下代码:

我知道我可以创建一个Ident并将其插入quote!

到目前为止一切顺利,但我需要在我的代码库中的许多函数中使用该标识符。我希望它可以在const任何地方使用。但是,这失败了:

出现此错误:

我怀疑这些功能会const很快被标记。

我可以使字符串本身成为常量:

但是无论我想在哪里使用标识符,我都需要调用Ident::new(IDENT, Span::call_site()),这会很烦人。我只想写#IDENT在我的quote!调用中。我能以某种方式使它工作吗?

0 投票
1 回答
485 浏览

rust - 如何获取传递给内部属性宏的模块内容?

所以我定义了以下程序宏:

然后我将此 proc 宏应用于非内联模块:

编译器的输出表明传递给 proc 宏的项目hellomod some_mod;,模块中没有任何项目。但是我想对模块的内容做一些修改some_mod

我发现内联模块有效:

传递给我的 proc 宏的项目是mod some_mod { fn foo() { } fn bar() { } }.
但我将在复杂的模块层次结构中使用我的 proc 宏,我不想将所有这些模块放在一个文件中。

有什么方法可以让我的 proc 宏获取非内联模块的内容?

0 投票
1 回答
430 浏览

rust - 无法使用 syn/darling 获取字段属性

我正在尝试使用 syn/darling crates 在 proc-macro 中获取字段属性。这是一个 MRE

货运.toml

src/lib.rs

src/cat.rs

但是错误被抛出

如果 cat.rs 的第 11 行(我用注释标记它)将被注释,程序将编译而没有错误。

这是Vec 的 impl FromField。据我了解,此代码存在一些问题, 但我不知道如何解决。

如何在我的StructField::attrs 上有一个字段 attrs

0 投票
1 回答
523 浏览

rust - 从 rust proc-macro 中获取目标文件夹

正如标题所示,我正在尝试检索目标文件夹以保存一些中间编译产品。我需要实际的目标文件夹,因为我想在编译之间缓存一些值以显着加快它们的速度(否则我可以只使用一个临时目录)。

我目前的方法是解析 rustc 调用的参数(通过std::env::args())并找到 --out-dir,代码如下所示:

通常我会使用环境变量之类的东西(想想OUT_DIR),但我找不到任何可以帮助我的东西。

那么有没有正确的方法来做到这一点?还是我应该向 rust 开发团队提出问题?

0 投票
2 回答
1349 浏览

rust - 我们可以在过程宏属性中获取调用者的源代码位置吗?

我需要获取每个方法的调用者的源位置。我正在尝试创建一个proc_macro_attribute来捕获位置并打印它。