问题标签 [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.

0 投票
1 回答
541 浏览

rust - 在稳定版上运行编译器插件

我想做的事情需要插件编译器,因为我需要在编译时报告错误,但是我希望它在 Rust 稳定版上运行,而不仅仅是在夜间运行。

有没有办法在稳定的 Rust 上运行编译器插件?

0 投票
1 回答
165 浏览

compiler-construction - 在编写语法扩展时,我可以查找关于注释类型以外的类型的信息吗?

我想编写一个语法扩展,在生成新函数时结合来自相关类型的信息。作为一个废话的例子,假设我有这个代码:

我希望将该attack属性扩展为一个了解Monster. 一个简单的例子是

具体来说,我希望能够获得一个类型的固有方法的函数签名。我也可以使用特征的函数签名。重要的区别是我的扩展不提前知道要查找哪种类型或特征——它将由用户作为注释的参数提供。

我目前有一个修饰类型的语法扩展,因为我想添加方法。为此,我实施了一个MultiItemDecorator. 在查看了expand函数的参数后,我无法找到任何查找类型或特征的方法,只能找到生成全新类型或特征的方法:

0 投票
1 回答
223 浏览

rust - 记录 rustdoc 看不到的项目

我注意到编译器插件经常提供文档甚至不会提及的宏。它们是通过编程方式注册和创建的,而不是在 rustdoc 识别的语法中定义的。自然,无法显示任何文档。

我正在寻找一种方法来解决这个问题,一种为编译时 crate 中不存在的宏生成文档的方法。

我注意到语法箱也可以从这样的事情中受益。quote_item,例如,完全没有记录。我什至找不到注册它的代码。

0 投票
1 回答
1414 浏览

rust - 只为特定字段派生属性,就像 serde 一样

使用derive语法,我可以实现类似HashPartialEq使用特定字段的特征,而不是全部?

它可能看起来像:

我希望该hash方法仅使用idname而没有其他方法。

serde库允许这样的序列化

0 投票
1 回答
96 浏览

compiler-construction - 如何在编译器插件中修改 crate 的所有项目?

我正在尝试构建一个将属性扩展为调用的语法扩展。前:

后:

这已经奏效了。但是,如果我有#[flame]箱子级别的属性(如#![flame]),我也希望它能够工作。这可能吗?如果可以,怎么做?

0 投票
1 回答
385 浏览

rust - 如何编写生成模块的 Rust 编译器插件?

我正在编写一个扩展的 Rust 编译器插件

现在几乎完成了,但是该模块在最终扩展的代码中不包含任何内容。我猜原因是跨度不包括模块文件。

要点

0 投票
1 回答
171 浏览

rust - 如何在编译器插件中获取结构字段和字段类型?

我想生成一个HashMap使用结构字段作为键,并使用usize整数作为值。

我的预期输出是:

我的解决方案是implFieldsMappingArticle和的特点Comment

我想为自定义派生编写一个编译器插件FieldsMapping

我的问题是:如何获取编译器插件中的所有字段?我怎么知道字段类型是Vec什么?

0 投票
1 回答
417 浏览

macros - 宏和编译器插件有什么区别?

宏可以做什么编译器插件不能做,反之亦然?

“不能”,我的意思是不可能达到相同的目的,而不是可以用不同的方式来达到。

例如,宏可以impl为结构提供一些特征,编译器插件可以derive为结构提供一些特征。它们都可以自动impl成为结构的特征。

0 投票
1 回答
1578 浏览

rust - 为什么 `regex!` 不是 `Regex::new` 的包装器以提供相同的正则表达式匹配速度?

Rust Regex crate提供了语法扩展,regex!可以在标准编译时间内编译正则表达式。这有两个好处:

  • 我们不需要在运行时做这项工作(更好的程序性能)
  • 如果我们的正则表达式格式错误,编译器可以在编译期间告诉我们,而不是触发运行时恐慌

不幸的是,文档说:

警告:编译regex!器插件比正常Regex::new(...)使用慢几个数量级。除非您有非常特殊的原因,否则不应使用编译器插件。

这听起来像是用于regex!与 for完全不同的正则表达式引擎Regex::new()。为什么不regex!()只是一个包装器Regex::new()来结合两个世界的优势?据我了解,这些语法扩展编译器插件可以执行任意代码;为什么不Regex::new()呢?

0 投票
0 回答
153 浏览

rust - 使用 Rust 编译器插件插入新字段时创建 Span 的正确方法是什么?

我想要一个编译器插件来用一些信息注释结构。例如,原始结构只有一个字段:

我想添加另一个字段:

当我研究 Rust 编译器插件时,我决定使用MultiModifier( SyntaxExtension) 来完成我的工作。enum ItemKind定义Struct(VariantData, Generics)VariantData存储数据字段:

StructField定义为:

我计划插入 a StructField,但我不知道如何Span为该字段制作 a 。每个都Span包含 alo和 a hi BytePosStructFields 信息如下所示:

插入新字段的正确方法是什么?


我知道使用宏来完成这项工作会更容易,但我想知道通过修改VariantData.