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

rust - 我的 or-pattern 过程宏有什么问题导致“宏扩展忽略令牌`|`”?

考虑以下示例代码:

游乐场链接

如您所见,我想为此编写一个速记宏 ( common!)。如果枚举字段声明变得更长(例如,名称更长的更多字段),这将减少冗长。

(我想使用|作为分隔符,但我没有设法解析它。)

这是我对实现的尝试:

但这会产生以下编译错误:

如果我在panic!(output.to_string())之前添加一个output.into(),我会Enum :: A { a, .. } | Enum :: B { a, .. }在恐慌消息中得到预期的结果。我的代码有什么问题?

依赖版本:

  • 同步 v1.0.54
  • 引用 v1.0.7

修复: 在quote生成的宏输出周围添加括号可以解决问题,但为什么呢?

0 投票
1 回答
600 浏览

rust - 为什么 Rust 找不到使用 proc_macro_attribute 生成的枚举的方法?

我正在尝试编写将接受 Rust 枚举的过程宏

并为枚举生成一个方法,让我将 u8 转换为允许的变体,像这样

这是我使用proc_macrolib 实现的。(没有外部库)

这就是我使用它的方式。

问题是这会导致编译器出错。确切的错误是

运行cargo expand虽然生成正确的代码。并且直接运行该代码可以按预期工作。所以我很难过。可能是我遗漏了一些关于应该如何使用 proc_macros 的内容,因为这是我第一次使用它们并且我没有看到任何会导致此错误的东西。我正在关注sortedproc_macro_workshop 0的部分。唯一的变化是,我直接使用 TokenStream 而不是使用 syn 和 quote crates。此外,如果我输入错误的方法名称,rust 编译器会建议存在具有相似名称的方法。

0 投票
0 回答
254 浏览

rust - 如何使用引号在 proc_macro 中插入函数参数标识符?

我的目标是编写一个简单的属性 proc 宏,可用于注释函数并打印其参数。

例子:

使用引号我可以在范围内插入标记并使用syn解析 rust 代码片段。所以我尝试了以下方法:

是否有可能访问 FnArg 标识符(标识符)?

0 投票
1 回答
821 浏览

rust - 在函数开头注入代码的过程属性宏

我正在尝试构建一个简单的属性,它将在函数的开头注入一个 let 绑定,因此结果将是:

我已经做到了:

但是,我在处理这些项目时遇到了麻烦。例如,blockis 类型Vec<Stmt>,现在一个语句由片段 ( Local, Item Expr, Semi) 组成,当尝试处理这些片段时,我只是迷路了。我觉得我遗漏了一些关于如何处理这些部分的内容,但是查看提供的示例trace-vars并没有帮助,而且许多在线资源都已过时。

我还尝试了一种非常愚蠢的方法来创建ItemFnusing 引用,解析它并Stmt从中获取,但是由于TokenStream实际上来自两个不同的 crate,我得到了另一个错误,proc_macro并且proc_macro2

继续运行

0 投票
0 回答
80 浏览

rust - 如何过滤掉 proc_macro_derive 中所有 Option 类型的字段

我正在创建我的第一个派生宏。我正在尝试从结构中过滤所有非可选字段。我想将它们用于构造函数。我不确定如何提取它们。我正在考虑获取类型的路径,并检查该路径是否等于std::option::Option. 这并没有真正奏效。谁能告诉我我做错了什么,或者我应该如何继续?

这一切都符合let non_optional_field_arguments = ...

0 投票
2 回答
425 浏览

rust - Rust proc_macro_derive:如何检查字段是否为基本类型,如布尔值?

我正在尝试过滤掉 struct 类型的所有字段bool。但是syn::Type枚举似乎没有案例,或者我错误地阅读了定义:

我查看syn::Types了源代码,以检查省略了哪些变体,但这并没有让我更进一步。这是我到目前为止所拥有的:

我走错路了吗?或者这根本不可能?还是我错过了什么?

0 投票
0 回答
26 浏览

rust - 在编译时转换 proc_macro::Literal

如何将 a 转换proc_macro::Literal为内部值?例如我有

并像使用它一样

xtest宏中,我需要知道对其运行操作的值。

目前,对数字文字的支持就足够了(在“1”、“0x10”、“1_000”等变体中)。对左右的解释1 << 2会很好,但可以手动实现(当Literal转换已解决时)。

背景

我想模拟 C 的指定初始化程序;例如写类似的东西

扩展到

0 投票
1 回答
67 浏览

rust - syn::parse::ParseBuffer::peek() 如何接受类型作为参数?

我们如何能够将 type 作为参数而不是 turbofish 传递给syn::parse::ParseBuffer::peek

方法通常称为 like input.parse::<Token![;]>()。我们将类型作为泛型传递,但 peek 期望它们为input.peek(Token![;]).

我想知道,因为如果我创建一个类型别名Token![;] liketype TokenAlias = Token![;]并使用它 like input.peek(TokenAlias),我会收到错误:

Token![;]如果也不允许,这将是有道理的。

为什么我在使用类型别名时会收到此错误?

代码TokenAlias

操场

代码Token![;]

操场

以下是peekfrom的源代码syn

源代码

0 投票
2 回答
316 浏览

rust - 如何解析带有嵌套参数的属性与亲爱的?

我正在尝试使用darling解析属性,并且我想支持以下用法:

这些是我的类型:

和一个测试:

我收到此错误:

如果我指定att,无论是否指定,我都会收到相同的错误value

这可能吗?如果是这样,亲爱的希望将其解析成什么结构?

0 投票
0 回答
86 浏览

rust - 带有编译器错误和快速修复建议的 Proc 宏?

我正在用 Rust 编写一些过程宏,我使用 vim-lsp 来帮助我编写 Rust。当编译器错误提示进行更改以修复错误时,我发现它非常有用,我可以使用快速操作来应用修复。

在我的 proc 宏中,我使用syn::Error为我的宏的用户提供跨编译器错误。我有什么办法可以将快速修复编码到我的编译器错误中?