问题标签 [rust-compiler-plugin]
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 - 在稳定版上运行编译器插件
我想做的事情需要插件编译器,因为我需要在编译时报告错误,但是我希望它在 Rust 稳定版上运行,而不仅仅是在夜间运行。
有没有办法在稳定的 Rust 上运行编译器插件?
compiler-construction - 在编写语法扩展时,我可以查找关于注释类型以外的类型的信息吗?
我想编写一个语法扩展,在生成新函数时结合来自相关类型的信息。作为一个废话的例子,假设我有这个代码:
我希望将该attack
属性扩展为一个了解Monster
. 一个简单的例子是
具体来说,我希望能够获得一个类型的固有方法的函数签名。我也可以使用特征的函数签名。重要的区别是我的扩展不提前知道要查找哪种类型或特征——它将由用户作为注释的参数提供。
我目前有一个修饰类型的语法扩展,因为我想添加方法。为此,我实施了一个MultiItemDecorator
. 在查看了expand
函数的参数后,我无法找到任何查找类型或特征的方法,只能找到生成全新类型或特征的方法:
rust - 记录 rustdoc 看不到的项目
我注意到编译器插件经常提供文档甚至不会提及的宏。它们是通过编程方式注册和创建的,而不是在 rustdoc 识别的语法中定义的。自然,无法显示任何文档。
我正在寻找一种方法来解决这个问题,一种为编译时 crate 中不存在的宏生成文档的方法。
我注意到语法箱也可以从这样的事情中受益。quote_item
,例如,完全没有记录。我什至找不到注册它的代码。
rust - 只为特定字段派生属性,就像 serde 一样
使用derive
语法,我可以实现类似Hash
或PartialEq
使用特定字段的特征,而不是全部?
它可能看起来像:
我希望该hash
方法仅使用id
,name
而没有其他方法。
serde库允许这样的序列化。
rust - 如何在编译器插件中获取结构字段和字段类型?
我想生成一个HashMap
使用结构字段作为键,并使用usize
整数作为值。
我的预期输出是:
我的解决方案是impl
我FieldsMapping
对Article
和的特点Comment
:
我想为自定义派生编写一个编译器插件FieldsMapping
。
我的问题是:如何获取编译器插件中的所有字段?我怎么知道字段类型是Vec
什么?
macros - 宏和编译器插件有什么区别?
宏可以做什么编译器插件不能做,反之亦然?
“不能”,我的意思是不可能达到相同的目的,而不是可以用不同的方式来达到。
例如,宏可以impl
为结构提供一些特征,编译器插件可以derive
为结构提供一些特征。它们都可以自动impl
成为结构的特征。
rust - 为什么 `regex!` 不是 `Regex::new` 的包装器以提供相同的正则表达式匹配速度?
Rust Regex crate提供了语法扩展,regex!
可以在标准编译时间内编译正则表达式。这有两个好处:
- 我们不需要在运行时做这项工作(更好的程序性能)
- 如果我们的正则表达式格式错误,编译器可以在编译期间告诉我们,而不是触发运行时恐慌
不幸的是,文档说:
警告:编译
regex!
器插件比正常Regex::new(...)
使用慢几个数量级。除非您有非常特殊的原因,否则不应使用编译器插件。
这听起来像是用于regex!
与 for完全不同的正则表达式引擎Regex::new()
。为什么不regex!()
只是一个包装器Regex::new()
来结合两个世界的优势?据我了解,这些语法扩展编译器插件可以执行任意代码;为什么不Regex::new()
呢?
rust - 使用 Rust 编译器插件插入新字段时创建 Span 的正确方法是什么?
我想要一个编译器插件来用一些信息注释结构。例如,原始结构只有一个字段:
我想添加另一个字段:
当我研究 Rust 编译器插件时,我决定使用MultiModifier
( SyntaxExtension
) 来完成我的工作。enum ItemKind
定义Struct(VariantData, Generics)
并VariantData
存储数据字段:
StructField
定义为:
我计划插入 a StructField
,但我不知道如何Span
为该字段制作 a 。每个都Span
包含 alo
和 a hi
BytePos
。StructField
s 信息如下所示:
插入新字段的正确方法是什么?
我知道使用宏来完成这项工作会更容易,但我想知道通过修改VariantData
.