问题标签 [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 回答
137 浏览

rust - 在 Rust 宏中,如何跟随符号获取另一个函数定义的令牌流?

一个宏修饰的函数调用另一个函数,如何在宏中获取被调用函数的令牌流?

装饰功能:

被调用者:

宏:

0 投票
1 回答
80 浏览

rust - 如何在程序宏中接受语法无效的输入?

我认为程序宏只需要具有词法有效的输入,但似乎所有输入也必须解析为 Rust 代码,除非我做错了什么。

RFC 说:

通过对标记进行操作,传递给过程宏的代码不需要满足 Rust 解析器,只需要满足词法分析器。

一旦输入涉及无效的 Rust 语法,我就会得到解析错误。

考虑以下过程宏:

运行时:

我得到错误:

cargo-expand表明宏正确地删除了函数。它不应该因此停止任何解析错误吗?

我究竟做错了什么?

0 投票
1 回答
63 浏览

rust - 如何使用 darling 从程序宏属性中提取类型?

我需要能够提取类型 DieselHandler,理想情况下,以允许可重复的 data_loader 属性来针对多种类型进行转换的方式。

如果我使用handler: syn::Type有错误:

特征界限syn::Type: FromMeta不满足 特征FromMeta未实现syn::Type

我怎样才能在这里传递一个类型,甚至可以检查包装器结构?

0 投票
1 回答
85 浏览

rust - 将数据结构作为 args 传递给 proc 宏属性

我正在尝试创建一个在结构上使用的宏,在该宏中,您将另一个结构作为参数,然后连接结构字段。这是宏的代码

这是我希望使用它的基本示例

但是,它只会将单词“new_fields”转换为 TokenStream,然后编译失败,因为它不是结构。有没有办法将结构作为参数“传递”给宏,而无需在宏用法中编写代码?

0 投票
1 回答
72 浏览

rust - syn 获取平面令牌流

为了这个例子:我想写一个 proc 宏属性来修改函数体中的所有数字文字。

我有一个syn::Block来自syn::FnItem. 我想映射块中的所有标记并更改文字。我目前有:

问题to_token_stream来自Quote::ToTokens返回 a proc_macro2::TokenStream,它的into_iter项目是proc_macro2::TokenTree令牌的嵌套表示。

所以对于代表的块2 + (3 + 4)

迭代器在以下单个项目上:

令牌深深嵌套在结构中的位置。

我需要一个看起来像这样的平面表示:

这可能吗?我可以写我自己的flat_mapthinh,然后map让它工作,但这是很多工作。syn 是否暴露了任何东西来做到这一点?也许我不应该syn::Block在进行转换之前将其解析为...?

0 投票
0 回答
82 浏览

rust - 如何在我只有一个`syn::buffer::Cursor`的上下文中使用`syn::parse::Parse`(或更一般地说,`ParseBuffer`)?

我正在研究一个proc_macro2/syn宏,并且我一直在使用Cursor对某些东西进行低级解析...... Rust- like。但是在我的语法深处,我需要解析一个syn::Type. 据我所知,唯一真正好的方法是使用impl syn::parse::Parsefor syn::Type

所以我真正想找到的是一种编写签名函数的好方法

那么我的问题是实现这种类型的功能的最佳(最简单,问题最少)方法是什么?


这是迄今为止我想出的最好的:

这不是灾难性的,但也不理想。

0 投票
0 回答
117 浏览

rust - 使用 syn 获取 proc_macro_derive 结构的枚举字段的属性

我正在为结构编写宏并实现基于字段类型的方法。例如u8Arraystr

假设我将此枚举表示为u32

ToBytes在结构字段上应用宏

我能够将它放到我获得类型的部分,ServerGreetingMode但我无法判断它是否是枚举。

这是我目前的实现。

谢谢。

0 投票
0 回答
92 浏览

rust - 将我的 proc_macro 的参数传递给 include_str

我正在尝试将我的 proc_macro 的参数作为参数传递给 include_str!,但出现错误:在编译期间参数必须是字符串文字:

是否可以通过利用实际上我们在编译时知道文件名的事实来做我想做的事?

如果唯一的方法是使用 std::fs 文件 I/O 而不是 include_str!(这不是我最喜欢的解决方案,因为这样我必须手动执行路径解析),有没有办法指出 Cargo 它应该重建依赖于 MainWindow.rsml 的源,如果 MainWindow .rsml 在没有创建我自己的 build.rs 文件的情况下发生了变化,就像 include_str 一样!做?

0 投票
2 回答
112 浏览

rust - 为结构编写派生宏时,如何访问特征的令牌流?

我有一个结构和一个特征:

我想为生成 impl 的结构创建一个派生宏:

当我试图实现这一点时,我面临一个障碍,即我的派生宏似乎没有办法知道 的令牌流FooTrait,我需要遍历 的方法FooTrait,并为每个特征方法生成实现基于Foo

我怎样才能做到这一点?

这个问题不是关于如何使用quote!引用特征 impl 并foo直接拼写出来 - 困难的部分是我想在程序上迭代 的方法FooTrait,并为每个特征方法生成一些样板代码。

0 投票
0 回答
93 浏览

rust - 是否可以使用宏删除字段或替换 Rust 结构中的现有字段?

我正在尝试为 proc-macro 编写一个属性宏,它允许我从结构中删除一个字段或完全替换它的签名。

与此类似的东西:

这应该导致:

我知道如何编写宏以添加到结构的 impl 部分,但到目前为止,我很难找到任何关于如何修改由属性宏标记的代码部分的示例。

那可能吗?如果是这样,你能提供一个样品吗?