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

rust - 为什么程序宏在我的构建脚本中看不到由 dotenv 设置的环境变量?

我有一个程序宏板条箱Proc和二进制板条箱BinBin依赖于Proc. Proc需要一个填充的环境变量才能正常运行。

build.rs这是我的 in里面的一些代码BinProc使用以下代码时可以成功找到env值:

但是,在我的 in 中Proc使用此代码时找不到环境变量(注意:在调用后立即检查存在时,我可以验证密钥是否实际存在):build.rsBindotenv

这是我的Proc箱子:

为什么它不会因println!命令而失败?它可以使用dotenv吗?否则我需要编写一些代码将密钥从我的env文件复制到println!命令中......

所有代码都在我的最小复制项目中。

0 投票
1 回答
428 浏览

rust - 解析rust proc_macro中括号的内容

我在 Rust 中使用synand构建一个小型 HTML 解析器proc_macro2。到目前为止,我已经做到了,我可以解析常规的 HTML 标签和它的属性所以例如

作品

但我也想解析一些JSX样式代码,所以像这样

这是我的问题,我不知道如何解析宏代码中括号之间的代码,我Vector只想使用<text></text>元素。

这是一个游乐场示例

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d0a899ee52772565d4043fea24d8f21d

0 投票
2 回答
636 浏览

rust - 如何从 `syn::parse::ParseStream` 中解析 `syn::Signature`?

我正在试验 Rust 过程宏。

我希望能够创建一个用于生成 JNI 调用样板的宏。就像是

到目前为止,我有以下代码(操场):

不幸的是,parse_signature调用是错误的:

Signature从 a解析 a 的正确方法是ParseStream什么?

0 投票
1 回答
567 浏览

rust - 可以将过程宏作为函数进行调试吗?

我正在尝试在我正在使用的库中调试复杂的过程宏。

由于我不能使用带有宏的调试器,并且各种宏扩展工具在这里被证明是无用的,我正在寻找一种替代方法。

可以像函数一样运行程序宏并进行适当的调试吗?我想象将结果存储proc_macro::TokenStream在一个变量中。

0 投票
0 回答
351 浏览

rust - 如何使用 proc 宏来创建可能违反卫生的宏?

我正在尝试创建一个名为derive_pattern 的简单库。我的最终目标是能够写出这样的东西:

我很好奇这是否可能。到目前为止,我的尝试都失败了。在定义程序宏时,可以控制标识符的范围以绕过卫生,但据我所知,程序宏无法定义新的程序宏。因此,我的程序宏必须生成 macro_rules 宏,而这些宏最终会强制执行卫生。

这是我的程序宏定义:

我已将带有完整 Cargo.toml 等的版本上传到 github:https ://github.com/jgarvin/derive_pattern

我得到的错误是在测试中的第一个断言上:

0 投票
1 回答
685 浏览

rust - 过程宏如何检查 Option 的泛型类型> 并将其扁平化为一个选项?

我正在编写一个派生过程宏,其中所有值都转换为Options. 问题是结构中的任何Option字段都可以包含在这些Option类型中。就其本身而言,在我开始使用 serde 序列化数据之前,这并不是什么大问题。我希望能够跳过任何值为 的值None,但在某些情况下它会变成类似Some(None)or的值Some(CustomOption::None)。这两种情况都比简单的没有任何意义None,但我不能只写#[serde(skip_serializing_if = "Option::is_none")]派生字段。当然,它们会输出nullJSON 格式的值。

基本上,我希望能够使用 syn 库来检查派生字段的内部值的类型是否将是 anOption并将其展平为Option<T>派生结构中的单数而不是Option<Option<T>>类型。我希望 Rust 在泛型上有基于类型的模式匹配,但这并不是真的。

我可以想到这个问题的两种解决方案,但我真的想不出如何实现它们。第一个是遍历所有字段并找到Options,然后打开这些选项并重新包装它们,以便它们Option在外面只有一个。此解决方案的一个潜在问题是,我可能必须Option在进行计算后将它们重新包装到另一个中。第二种解决方案是找到Option并相应地修改生成的代码,以便如果内部选项包含None整个内容,则变为None; 基本上只有一个辅助函数,如果字段是Option. 关于如何实施这些或更好的解决方案的任何想法?

这是一个代码示例:

使用这样的函数来包装选项中的所有值:

0 投票
0 回答
98 浏览

rust - 是否可以将两箱库中的 proc-macro 箱视为实现细节而不遵循语义版本控制?

许多包含过程宏的库由两个 crate 组成:一个proc-macro实现实际宏的 crate 和一个重新导出或包装 proc 宏的普通“main” crate。这样做是因为proc-macrocrates 不能公开导出除 proc 宏以外的任何内容。假设主 crate 被调用foo,宏 crate 通常被称为foo-deriveor foo-macros

这带来了几个关于如何对proc-macrocrate 进行版本控制的问题。当然,main crate 遵循语义版本控制。但是宏箱也应该跟随它吗?我不希望人们直接使用宏板条箱,而只能通过主板条箱。我在 proc-macro crate 的描述中明确说明了这一点。我想将宏箱视为实现细节。

在那种情况下,我可以不需要遵循语义版本控制,对吗?然后,主 crate 将只需要一个确切的版本,通过foo-macro = "=0.0.4".

这样好吗?或者这种方法可以打破什么?社区中是否有一些既定的最佳实践?

0 投票
1 回答
1335 浏览

parsing - 将属性转换为 proc 宏上的标识符派生

我正在编写我的第一个 proc 宏,尽管尝试通读此错误、structopt 和 derived_more 的源代码,但我似乎无法准确找到我正在寻找的内容。我想改变这个:

进入这个:

我已经开始编写一个 proc 宏,但在尝试解析属性时遇到了麻烦:

我遇到的困难是如何将属性列表实际变成可用的形式?据我所知,我需要从中解析“foo”和“bar”,&[Attribute]以便构建方法标识符,以及“SomeType”和“OtherType”标识符,我最终都会将它们输入quote!. TokenStream如果我在控制台中打印,所有信息都在那里:

但我没有办法真正做到这一点。我怎么去tokens[0].stream.ident

0 投票
1 回答
560 浏览

rust - 有没有办法在 proc-macro crate 中具有公共特征?

我有一个带有宏的 proc-macro crate,当扩展时,需要为 Rust 内置类型使用自定义 trait 实现。我试图在同一个 crate 中定义 trait,但 Rust 告诉我一个 proc-macro crate 只能有公共宏(用 注释的函数#[proc_macro]),其他都不能是公共的。所以我把 trait 放在另一个 crate 中,并在 proc-macro crate 中将它作为依赖项包含在内。但这意味着任何想要使用我的 proc-macro crate 的人也必须依赖另一个 trait crate。

所以我想知道是否有一种方法可以向 proc-macro crate 添加公共 trait,或者以某种方式使 proc-macro 和 trait crate 链接起来,这样最终用户就不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。

0 投票
1 回答
425 浏览

unit-testing - 单元测试 Rust Syn crate

来自Syn 文档

Syn 对proc-macro2crates.io 的 crate 提供的令牌表示进行操作,而不是直接使用编译器内置的proc-macrocrate。这使得代码可以Syn在过程宏的上下文之外执行,例如在单元测试或build.rs

我正在尝试为某些 Syn 功能启用单元测试,但是无论我尝试了什么,我都无法让它工作。它不适用于proc_macro2::TokenStream类型,但它不适用于 the,proc_macro::TokenStream因为我们不在 proc-macro 上下文中。

链接到游乐场

任何有关如何在 proc-macro 上下文之外测试 syn 函数的帮助将不胜感激。我知道trybuild crate,但我希望能够先对宏的功能进行单元测试。