问题标签 [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 投票
0 回答
72 浏览

rust - Rust proc_macro:添加常量

我正在尝试添加一个将常量字段添加到结构的过程宏。

例子:

我的程序宏代码如下:

这会引发以下错误:

我已经能够确定问题所在;

我怎样才能解决这个问题?即如何添加第二个常量而不出现错误,为什么会出现这些错误?

提前谢谢你,乔纳斯

0 投票
1 回答
109 浏览

rust - 如何在实现 proc 宏时检查类型是否实现了 trait?

我正在尝试创建一个proc-macro来派生和实现结构的特征,并且我需要结构中的所有字段都实现Display

我该如何检查?

此外,我如何检查一个属性是否也实现Iterator了?(如果迭代器的项目也实现了显示,我想处理)。

我正在使用synquote板条箱。我设法解析了我的struct并生成了实现。但是对于像这样的类型VecOption我想检查它们Iterator是否正确实现和处理它。

syn::Field结构具有ty我认为应该是一个起点的属性,但是查看文档我无法猜测任何方法来检查这种类型是否实现了某个特征。

0 投票
2 回答
31 浏览

rust - 如何使用proc_macro为宏插值函数提供枚举索引?

我已经实现了以下 proc_macro

并且应该生成

这是我当前的代码。

在变量插值中,我需要某种枚举变量计数。根据文档,没有这种方法。

我怎样才能更好地实现这一点而不是计数_i

0 投票
1 回答
33 浏览

rust - 使用 crate syn 提前查找“=>”标记

我正在使用 proc-macros 和 syn 开发一种特定于域的小语言,我想在那里解析表单上的一系列运算符

或者

等等。

我正在使用syn板条箱执行此操作,以实现Parser我需要的各种结构。我的想法是,我可以在前三个标记之后使用前瞻来解析这些,如下所示:

问题是,虽然syn::token::FatArrow是调用时的令牌,但=>调用parse时似乎不是peek

解析工作正常,但如果我不能向前看,那么我无法区分这两种情况。(好吧,我可以通过分叉输入流并尝试两种规则,然后用有效的流替换流,但是当下一个令牌的峰值出现时,如果我知道如何解决问题,这似乎有点戏剧性)。

我在这里做错了什么?我是否需要peek使用其他参数调用以匹配令牌=>

0 投票
1 回答
53 浏览

rust - 如何解析rust proc_macro中的嵌套结构成员变量?

我正在尝试编写一个宏,该宏将使用 #[derive(telemetry)] 为任何结构生成遥测函数。此函数将向任何提供的 io::Writable 发送数据流。这个数据流将是“自我描述的”,这样接收者不需要知道除了接收到的字节之外的任何其他数据。这允许接收器能够正确解析结构并打印其成员变量名称和值,即使添加、删除、更改顺序或重命名变量名称也是如此。遥测函数适用于非嵌套结构,并将打印嵌套结构的名称和类型。但我需要它递归地打印嵌套结构成员变量的名称、类型、大小和值。下面显示了一个示例,代码也是如此。

当前行为

生产

数据格式为变量名长度、变量名、变量类型长度、变量类型、变量字节数。

要求的行为

重申一下,当前行为正确打印了具有 Telemetry 特征的结构的变量名称、类型、大小和值。它会正确打印嵌套结构的名称、类型和大小,但不会打印所需的嵌套结构成员的名称和值。代码如下,抱歉这么长的帖子,我希望格式清晰明了,提前谢谢你。

目录结构

main.rs

主要货物.toml

遥测库.rs

遥测 Cargo.toml

再次为这篇冗长的帖子道歉。我希望这很清楚,我相信这就是重现我所拥有的一切,不幸的是,我相信这是一个最低限度的工作示例,否则我会拿出更多内容以方便阅读/回答

我认为,如果我可以在任何作为结构的字段上递归调用 handle_named_fields,我将获得所需的行为。这种方法的唯一问题是我看不到一个明显的方法来判断一个 Field 是否是一个结构。如果我有一个 syn::Data,那将是微不足道的,但我看不出如何使用 syn::Field 来实现这一点。

0 投票
0 回答
24 浏览

rust - 如何检查 syn::Field 是否是 rust proc_macro 中的结构

我有一个 proc_macro,它产生一个遥测函数来解析结构成员变量,它对非嵌套结构非常有用。我发现我需要在任何作为结构的 syn::Field 上递归调用我的 handle_named_field 函数。问题是我看不到确定字段是否为结构的方法,如果我有一个 syn::Data 变量,它是微不足道的,就像在我的 handle_data 中一样。如果字段是否为结构,我如何检查 handle_named_fields(fields: &syn::FieldsNamed) 内部?