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

rust - 有没有办法在编译时获取附加程序宏的文件和模块路径?

我正在寻找与file!()&module_path!()在程序宏上下文中的等价物。

例如,以下内容不起作用:

file.rs

macro.rs

这打印macro.rs是有道理的,但我想要的是file.rs. 有没有办法做到这一点?是否也有类似的方法module_path!()

这样做的一个要求是必须在编译时发生。

我正在尝试在OUT_DIR包含常量值的文件中创建一个文件,其中属性与模块和它们所在的文件一起添加。

0 投票
1 回答
51 浏览

rust - 在procmacro中的所有字段和子字段上递归调用函数

我有一个派生样式程序宏,我想在其中计算结构的序列化版本的潜在最大长度。例如,给定TestStruct下面的结构,我想调用一些包含所有字段的函数来计算最坏情况的长度。

对于原语,这可能类似于:

我在这里问的问题是关于任何非原始字段,例如。f3: SomeOtherStruct. 有没有办法在 proc-macro 中访问字段的字段?

0 投票
1 回答
587 浏览

rust - 在引号内转换类型!给出特征错误

我收到此错误:

该特征quote::to_tokens::ToTokens未实现 proc_macro::Ident

当我尝试运行此代码时:

这就是我想使用它的方式:

我还有一个包含上述代码的小项目:https ://bitbucket.org/JoshSinne/pm/src/master/ 。为什么我不能转换Ident内部令牌?我尝试使用parseinto但这对我来说并没有奏效。谢谢!

0 投票
0 回答
831 浏览

rust - 在其他宏内部/之前调用宏

我创建了一个类似函数的过程宏。我用声明性宏作为参数来调用它。我希望找到一种在处理过程宏之前扩展声明性宏的方法(或在过程宏内扩展它)。示例(代码也可在https://github.com/Jasperav/rec_macro获得):

调用站点:

Proc 宏箱:

panic消息中,我看到声明性宏 ( t) 在里面。hi I am a macro我只想要在这种情况下(或某种syn类型)的原始值。就我而言,声明性宏应始终扩展为 a &stror String

是否可以t在调用之前扩展re,或者t在 proc 宏中手动扩展?我想在我的 proc 函数中看到宏的结果(在这种情况下:“嗨,我是一个宏”),就像宏一样。

谢谢。

0 投票
1 回答
565 浏览

rust - 在其他 proc 宏中调用 proc 宏

我有一个无法编译的小型复制项目。该项目可以在这里下载: https ://github.com/Jasperav/proc_macro_collision 。错误是:

我在项目中有 3 个库和 1 个可执行文件:

  • Lib 1 - 解析器 - 解析 proc 宏调用
  • Lib 2 - proc_two - 将文字字符串作为 proc 宏调用返回
  • Lib 3 - proc_one - 将宏转发到 proc_two(尽管它不依赖于 proc_two)。这就像 proc_two 也是一个 proc 宏。

proc_one 的相关代码:

  • 可执行文件:调用 proc_one(给出编译错误)。

相关代码:

我不明白为什么可执行文件中的调用不明确,lib 2 和 3 不相互依赖。这是完整的错误:

0 投票
0 回答
144 浏览

rust - 创建过程宏时如何为属性编写简单的单元测试函数?

当我开始编写自定义派生时,我正在尝试测试结构的解析属性。我想将测试自定义派生拆分为多个更简单的测试功能,而不是一次将其作为一个完整的派生系统进行测试。

这是我的建议:

我想出了这个草稿:

您可以建议一种完全不同的方式。

0 投票
1 回答
497 浏览

rust - proc_macro_attribute 似乎不能很好地与 struct impls 和 traits 配合使用

我正在尝试获取一个程序宏来打印出有关我的函数输入中的变量的信息。当我在单独的 crate 中测试宏时,我从编译器收到一个错误,即即使特征函数已明确实现,我也没有实现特征函数。

请忽略 attr 尚未返回任何内容;我正在一起构建它,但首先遇到了这个问题。

程序宏定义:

测试箱:

产生错误,例如:

如果我取消程序宏属性,则可以编译。这里发生了什么,我应该做些什么不同的事情?

0 投票
0 回答
500 浏览

rust - 如何将 rustdoc 注释添加到 proc 宏生成的代码中?

我写了一个proc-macro库来配合我正在编写的库 - 它们一起使用,前者用于抽象出后者中的大量冗余代码。

我在我的 proc 宏中成功生成了几个结构和实现。我也在使用cargo doc图书馆,我的文档是我所期望的。但是,我在 proc 宏中创建的文档注释没有按预期工作。我的 proc 宏中的一些代码大致如下所示:

当我打开生成的文档时:

  • foo本身出现在文档中,但它的评论没有
  • bar及其评论在文档中
  • 如果我更改 的评论bar,则评论不会更新。

这第三点告诉我,我可能cargo doc在某些时候使用了一些正常工作的标志,但我现在使用的是一组不同的标志,这些标志不适用于 proc 宏。我不想记录我所有的外部 crate 依赖项 ( --no-deps),但我确实想记录我的私人项目 ( --document-private-items)。因此,我使用cargo doc --no-deps --document-private-items. 我也试过了--release

我假设文档是从源代码构建的,而不是从构建的 .so 文件本身构建的,所以我cargo build之前没有做过cargo doc,尽管我也尝试过这个来调试这个问题。那么,确保正确生成和更新我的 proc 宏生成代码的文档的正确方法是什么?

0 投票
1 回答
679 浏览

r - 如何从 Rust 过程宏生成文件?

我正在用 Rust 为 R 构建一个扩展 API。我使用过程宏注释我的函数,以生成具有适当转换和错误处理的 C 包装器:

这会生成一个可使用该机制hello__wrapper__从 R 调用的 C 函数。.Call

除此之外,我们需要为 R 元数据生成一个 NAMESPACE 文件:

还有一个文件lib.R

扩展 cargo 或 rustc 以编写此附加信息的最简单方法是什么?我猜从程序宏代码编写文件是个坏主意。

0 投票
0 回答
799 浏览

rust - 如何调试 proc 宏?

所以我有一个抛出错误的 proc 宏。

特别是shader!vulkano_shaders抛出:

我怎么能调试这个?

最小的可重现示例:

main.rs

依赖项:

项目邮编:https ://drive.google.com/file/d/1fwXNZOTQOlunVAbYWK3rJRmQnDcWvySU/view?usp=sharing