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

debugging - 如何查看导致编译错误的扩展宏代码?

我有一个涉及宏的编译错误:

不幸的是,宏是递归的,所以很难弄清楚编译器在抱怨什么,而且行号似乎是针对扩展宏而不是我的代码的。

我怎样才能看到扩展的宏?是否有一个标志我可以传递给 rustc(甚至更好的货物)来转储它?

(这个宏来自rust-mdo,虽然我认为这并不重要。)

0 投票
2 回答
7588 浏览

rust - How do I create a proc_macro_attribute?

Now that proc_macros have been stabilized, how does one create such a thing?

From what I've seen, there's the option of putting a #[proc_macro_attribute] annotation on a fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream, but how can I register it? How can I add custom attributes?

0 投票
1 回答
2275 浏览

rust - 是否可以在 Rust 的过程宏中存储​​状态?

是否可以构建一个不输出任何内容但存储状态以构建列表的宏,然后再构建一个实际使用该数据的第二个宏?

例如:

0 投票
1 回答
1271 浏览

rust - 实现 proc 宏时的循环包依赖

我尝试实现一个类似于 serdes 的Dumpproc_macro Serialize

为此,我有一个板条箱foo,其中包含我的“原始”结构(P1P2这种情况下),它应该只能是可转储的。

接下来我确实有一个foo_derive包含程序宏本身的板条箱。

因为我想支持多种格式,所以我有第三个板条箱foo_dump,其中包含Dump(例如,可以转储此结构)和Dumper(这是后端应该实现的东西)的特征定义。非常直截了当,直到这一点。

当我现在想编译它时,我得到了这个错误:

我不知道正确的方法是什么,如何在这个 crate 中使用依赖项。我现在的一个是:

依赖关系

这当然是不可能的。

我错过了什么?我该怎么做才能打破依赖圈?


( mcve@github )

/货物.toml

/foo/Cargo.toml

/foo/src/lib.rs

/foo_dump/Cargo.toml

/foo_dump/src/lib.rs

/foo_derive/Cargo.toml

/foo_derive/src/lib.rs

0 投票
1 回答
3193 浏览

rust - 将字符串转换为 TokenStream

给定一个字符串 ( str),如何TokenStream在 Rust 中将其转换为 a?

我试过使用quote!宏。

这里的目标是为一些未知的代码字符串生成令牌。

或者

0 投票
1 回答
1188 浏览

rust - 无法调用类似函数的过程宏:无法扩展为语句

我试图让我的头脑围绕类似函数的过程宏并努力学习基础知识。

首先,我尝试创建一个只打印所有标记并且什么都不做的宏:

然后我尝试在另一个二进制文件中使用它:

当我这样做时,cargo build我得到了这个:

它告诉我这无法编译,但println在宏内部有效。怎么了?

问题 #54727非常广泛,我不确定它与此有何关系。

我正在使用 stable-i686-pc-windows-gnu、rustc 1.31.1 (b6c32da9b 2018-12-18)。

0 投票
2 回答
4059 浏览

struct - 如何以编程方式获取结构的字段数?

我有一个自定义结构,如下所示:

是否可以通过编程方式获取结构字段的数量(例如,通过方法调用field_count()):

对于这个结构:

...以下调用应返回1

是否有类似的 APIfield_count()或者只能通过宏获得?

如果这可以通过宏实现,应该如何实现?

0 投票
2 回答
4910 浏览

error-handling - 如何使用引用宏报告程序宏中的错误?

我正在编写一个运行良好的程序宏,但我无法以符合人体工程学的方式报告错误。使用panic!“有效”但并不优雅,也不能很好地向用户显示错误消息。

我知道我可以在解析 a 时报告好的错误TokenStream,但是在解析 AST 后我需要在遍历 AST 时产生错误。

宏调用如下所示:

并且应该输出:

这是宏代码:

bool如果属性中没有指定任何内容,我想产生一个错误。例如,像这样输入:

应该导致类似:

在解析过程中,有 a Result,其中包含很多有用的信息,包括 a span,因此产生的错误可以突出显示有问题的宏调用的确切部分。但是一旦我遍历 AST,我就看不到报告错误的好方法。

这应该怎么做?

0 投票
0 回答
339 浏览

rust - 如何编写扩展为宏调用的过程宏,而不需要用户导入宏的 crate?

我正在尝试编写一个类似函数的过程宏my_macro,该宏可以扩展为lazy_static宏调用。my_macro我想以一种用户不需要lazy_static在其 crate 的依赖项中列出并明确使用它的方式编写它( use lazy_static::lazy_static)。

这是最小的示例代码:

lib.rs (my_macro crate)

Cargo.toml (my_macro crate)

lib.rs(使用箱)

Cargo.toml(使用箱)

上面的代码导致编译错误:

我理解这个错误,我知道我可以通过让usagecrate 依赖它lazy_static来解决它(见注释行)。uselib.rs

问题是这意味着所有使用的 cratemy_macro都必须lazy_static在它们的依赖项中列出。这似乎不对,我想知道是否有替代方案。我已经尝试了几件事,但没有解决问题。

0 投票
1 回答
431 浏览

rust - 将枚举变体用作函数的这种奇怪语法是什么?

下面是.mod 的 mod 文档给出的示例syn::parse

input.parse().map(Item::Struct)有效的正常 Rust 语法(看起来不像Item::Struct不是函数),还是一种特殊的proc_macro库语法?如果是后者,是否有proc_macro特定语法规则的文档?