问题标签 [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.
rust - 为什么程序宏在我的构建脚本中看不到由 dotenv 设置的环境变量?
我有一个程序宏板条箱Proc
和二进制板条箱Bin
。Bin
依赖于Proc
. Proc
需要一个填充的环境变量才能正常运行。
build.rs
这是我的 in里面的一些代码Bin
。Proc
使用以下代码时可以成功找到env值:
但是,在我的 in 中Proc
使用此代码时找不到环境变量(注意:在调用后立即检查存在时,我可以验证密钥是否实际存在):build.rs
Bin
dotenv
这是我的Proc
箱子:
为什么它不会因println!
命令而失败?它可以使用dotenv
吗?否则我需要编写一些代码将密钥从我的env
文件复制到println!
命令中......
所有代码都在我的最小复制项目中。
rust - 解析rust proc_macro中括号的内容
我在 Rust 中使用syn
and构建一个小型 HTML 解析器proc_macro2
。到目前为止,我已经做到了,我可以解析常规的 HTML 标签和它的属性所以例如
作品
但我也想解析一些JSX
样式代码,所以像这样
这是我的问题,我不知道如何解析宏代码中括号之间的代码,我Vector
只想使用<text></text>
元素。
这是一个游乐场示例
rust - 如何从 `syn::parse::ParseStream` 中解析 `syn::Signature`?
我正在试验 Rust 过程宏。
我希望能够创建一个用于生成 JNI 调用样板的宏。就像是
到目前为止,我有以下代码(操场):
不幸的是,parse_signature
调用是错误的:
Signature
从 a解析 a 的正确方法是ParseStream
什么?
rust - 可以将过程宏作为函数进行调试吗?
我正在尝试在我正在使用的库中调试复杂的过程宏。
由于我不能使用带有宏的调试器,并且各种宏扩展工具在这里被证明是无用的,我正在寻找一种替代方法。
可以像函数一样运行程序宏并进行适当的调试吗?我想象将结果存储proc_macro::TokenStream
在一个变量中。
rust - 如何使用 proc 宏来创建可能违反卫生的宏?
我正在尝试创建一个名为derive_pattern 的简单库。我的最终目标是能够写出这样的东西:
我很好奇这是否可能。到目前为止,我的尝试都失败了。在定义程序宏时,可以控制标识符的范围以绕过卫生,但据我所知,程序宏无法定义新的程序宏。因此,我的程序宏必须生成 macro_rules 宏,而这些宏最终会强制执行卫生。
这是我的程序宏定义:
我已将带有完整 Cargo.toml 等的版本上传到 github:https ://github.com/jgarvin/derive_pattern
我得到的错误是在测试中的第一个断言上:
rust - 过程宏如何检查 Option 的泛型类型
我正在编写一个派生过程宏,其中所有值都转换为Options
. 问题是结构中的任何Option
字段都可以包含在这些Option
类型中。就其本身而言,在我开始使用 serde 序列化数据之前,这并不是什么大问题。我希望能够跳过任何值为 的值None
,但在某些情况下它会变成类似Some(None)
or的值Some(CustomOption::None)
。这两种情况都比简单的没有任何意义None
,但我不能只写#[serde(skip_serializing_if = "Option::is_none")]
派生字段。当然,它们会输出null
JSON 格式的值。
基本上,我希望能够使用 syn 库来检查派生字段的内部值的类型是否将是 anOption
并将其展平为Option<T>
派生结构中的单数而不是Option<Option<T>>
类型。我希望 Rust 在泛型上有基于类型的模式匹配,但这并不是真的。
我可以想到这个问题的两种解决方案,但我真的想不出如何实现它们。第一个是遍历所有字段并找到Option
s,然后打开这些选项并重新包装它们,以便它们Option
在外面只有一个。此解决方案的一个潜在问题是,我可能必须Option
在进行计算后将它们重新包装到另一个中。第二种解决方案是找到Option
并相应地修改生成的代码,以便如果内部选项包含None
整个内容,则变为None
; 基本上只有一个辅助函数,如果字段是Option
. 关于如何实施这些或更好的解决方案的任何想法?
这是一个代码示例:
使用这样的函数来包装选项中的所有值:
rust - 是否可以将两箱库中的 proc-macro 箱视为实现细节而不遵循语义版本控制?
许多包含过程宏的库由两个 crate 组成:一个proc-macro
实现实际宏的 crate 和一个重新导出或包装 proc 宏的普通“main” crate。这样做是因为proc-macro
crates 不能公开导出除 proc 宏以外的任何内容。假设主 crate 被调用foo
,宏 crate 通常被称为foo-derive
or foo-macros
。
这带来了几个关于如何对proc-macro
crate 进行版本控制的问题。当然,main crate 遵循语义版本控制。但是宏箱也应该跟随它吗?我不希望人们直接使用宏板条箱,而只能通过主板条箱。我在 proc-macro crate 的描述中明确说明了这一点。我想将宏箱视为实现细节。
在那种情况下,我可以不需要遵循语义版本控制,对吗?然后,主 crate 将只需要一个确切的版本,通过foo-macro = "=0.0.4"
.
这样好吗?或者这种方法可以打破什么?社区中是否有一些既定的最佳实践?
parsing - 将属性转换为 proc 宏上的标识符派生
我正在编写我的第一个 proc 宏,尽管尝试通读此错误、structopt 和 derived_more 的源代码,但我似乎无法准确找到我正在寻找的内容。我想改变这个:
进入这个:
我已经开始编写一个 proc 宏,但在尝试解析属性时遇到了麻烦:
我遇到的困难是如何将属性列表实际变成可用的形式?据我所知,我需要从中解析“foo”和“bar”,&[Attribute]
以便构建方法标识符,以及“SomeType”和“OtherType”标识符,我最终都会将它们输入quote!
. TokenStream
如果我在控制台中打印,所有信息都在那里:
但我没有办法真正做到这一点。我怎么去tokens[0].stream.ident
?
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 链接起来,这样最终用户就不能尝试在没有另一个的情况下使用一个?如果两者都不可能,唯一的解决方案是记录依赖关系,这有点脆弱。
unit-testing - 单元测试 Rust Syn crate
来自Syn 文档:
Syn 对
proc-macro2
crates.io 的 crate 提供的令牌表示进行操作,而不是直接使用编译器内置的proc-macro
crate。这使得代码可以Syn
在过程宏的上下文之外执行,例如在单元测试或build.rs
我正在尝试为某些 Syn 功能启用单元测试,但是无论我尝试了什么,我都无法让它工作。它不适用于proc_macro2::TokenStream
类型,但它不适用于 the,proc_macro::TokenStream
因为我们不在 proc-macro 上下文中。
任何有关如何在 proc-macro 上下文之外测试 syn 函数的帮助将不胜感激。我知道trybuild crate,但我希望能够先对宏的功能进行单元测试。