#lint #linting #aliases #rustdoc #clippy #semantic #module

allow

使用别名/标签代码检查(禁用)来表示您的意图。从 allow_prefixed 导出,分组在 rustc::、clippy:: 和 rustdoc:: 模块下。

6 个版本

0.1.5 2023 年 5 月 10 日
0.1.4 2023 年 4 月 29 日
0.0.0-- 2022 年 7 月 30 日
0.0.0-0.0.0-0.0.0 2022 年 1 月 14 日

#238开发工具

每月 36 次下载

MIT/Apache

49KB
1K SLoC

目的

#[allow(...)] 本地代码检查权限/抑制提供别名。您可以拥有多个别名,每个别名都有自己的名称 - 语义。

问题

假设您在代码的多个地方对相同的代码检查(无论是 rustc 标准的前缀无代码检查,还是以 clippy::rustdoc:: 为前缀的代码检查)进行了允许,尽管是相同的代码检查,您可能有不同的允许原因。然而,#[allow(...)] 并不能传达您的意图。

不幸的是,我们也不能使用 use 来为代码检查创建别名。 (为什么?因为代码检查名称不是(过程)宏,而是特殊的编译器符号。)当然,您可以添加注释,但这是不确定的。

此crate为每个lint定义了一个属性宏(除了只适用于crate级别的lint,以下有更多说明)。这些宏不接受任何属性参数。它们将在你的代码前注入#[allow(lint-name-here)]

你可以将相同的宏以所需的名字多次导入。例如

  • use allow::anonymous_parametersasallow_anonymous_params_legacy;
  • use allow::rustdoc_missing_doc_code_examplesasallow_rustdoc_examples_linked;
  • use allow::rustdoc_missing_doc_code_examplesasallow_rustdoc_examples_none_trivial;
  • use allow::clippy_await_holding_lockasallow_clippy_await_holding_lock;

然后在你结构体/枚举/函数/变量等之前应用#[allow_anonymous_params_legacy]#[allow_rustdoc_examples_linked]#[allow_rustdoc_examples_none_trivial]#allow_clippy_await_holding_lock(或你命名的名称),表明你的意图。

额外好处:Rust将验证(别名)名称,因此没有打字错误。因此,你可以在任何时候使用grep或搜索它们。你的团队可以有一个类似于导入模块的模块,或者crate,重新导出别名。

范围

在范围内

  • Rust版本1.45、1.49.0、1.52.1、1.58.1、1.61.0、1.69.0、1.70.0-beta.1、1.71.0-nightly以及可能的一些,但似乎不是所有中间版本。请参阅下文的"范围外"
  • stablenightly(但我们可能需要你的帮助来维护)。
  • rustc lints(无前缀的“标准”);clippy:: & rustdoc:: lints。但主要是当前lint。
  • Clippy:版本allow 0.1.0支持Rust 1.45`的所有Clippy lints。作者正在添加新的lint(并指定已弃用/删除的lint的版本范围)。

范围有限

  • 针对Rust 1.63以下(直到1.45)的负构建测试。如果我们使用ui_test crate进行测试,我们只能从Rust 1.63完全测试。或者,你能帮助使用trybuild crate实现负构建测试吗?

    对于那些较低版本的Rust,lints(宏)也进行了验证。需要Rust 1.63+的测试覆盖了用于较低Rust版本的功能。这意味着:这是经过充分测试的。

  • Rustdoc 自动生成的 lint 宏文档无法提及在 Rust 中被别名的原始 lint,如下所示 1.54。我们能做的最好的是:“别名为 #[allow(...)],与从 allow 或 allow_prefixed 导入的具有相似名称的 lint。”

  • 1.45 以来的所有可能的 Rust 版本都提供支持。根据 Rust 版本添加 lints(宏)、标记它们为过时以及删除它们并不是自动化的。错误是会发生的。请帮助我们报告并修复它们。

    好消息:多亏了我们的测试套件,任何错误的修复都意味着仅扩展兼容 Rust 版本的范围(针对任何特定 lint),而绝不会限制范围。因此,任何修复都具有向下兼容性。

不在此范围内

  • 一些 Rust 版本,如 1.63、1.65.0、1.66.1、1.67.0、1.67.1、1.68.0、1.68.2(至少对于主流 x64 Linux 目标:x86_64-unknown-linux-gnu)不支持某些 rustc(标准、无前缀)lint,尽管这些 lint 在某些早期和后期版本中都存在。但是,中间的一些主要版本可能可以工作。而且,一些旧版本 受支持的。请参见上文。

  • lint 组(如 #[allow(unused)])。确实,它们有其位置(例如:快速原型设计)。但它们与这个 crate 的目的相反:区分忽略相同 lint 的用例。

  • 仅适用于 crate 级别(“内部”)的属性。它们不与 #[allow(...)] 一起工作,但仅与 #![allow(...)] 一起工作,并且仅在 crate 级别。这意味着(在一般情况下)比在代码周围散布的 #[allow(...)] 有更少的重复(粒度更细)。

    ---- <- TODO

    您可以点赞 rust-lang/rust #54726。假设它被实现了。然而,顶级属性可能需要放在任何 use 别名之前,因此我们无法对生成 #![allow(...)] 宏的别名进行别名化,不幸的是——没有语义上的好处。(我们可以在其他模块或crates中对其别名化,并且可以不带任何 use 导入来调用它们——使用完全限定路径,例如 #![our_allow_crate::lints::non_ascii_idents_legacy]#![crate::lints::non_ascii_idents_third_party]。待定。)

  • Beta 版本的 rustc 特定。 Beta 版本的孵化只有 6 周。或者,你会帮忙维护这个吗?

  • Rust 版本早于 1.45。如果有高需求,我们可能支持到 1.31(由 rustversion crate 需要)。但那样,我们就会有丑陋且更复杂的进程宏。

    如果您想使用 allow,最可能的情况是您要抑制的lint非常普遍。因此,如果您选择重构这么多代码,您是否也希望将其升级到更新的Rust?

  • 自定义lint(例如 使用 Dylint)。在原则上可能——您会承诺维护它吗?

报告问题和已知问题

测试还没有很好地覆盖 rustdoc::clippy::。并且 clippy:: lints 到 Rust 版本 1.45(目前)。

参见 coop-rs/allow > issues

高效的进程宏

这确实使用了进程宏(特别是:属性宏)。很多:每个lint一个。

是的,进程宏通常会减慢编译速度。进程宏通常使用 synquote crates。这些都是强大的工具,它们解析和引用宏可以注入的代码。然而,它们的强大也伴随着成本:构建时间。

但是,这些宏的情况并非如此。 allow 并不会将新的(生成的)代码解析为 TokenStream(在它被注入使用之前)。相反,它通过 proc_macro API 进行组合。

测试确实有更多的依赖(如果我们继续使用 ui_test - 因为 trybuild 可能要快得多)。所以不要通过 cargo test 来判断其速度,而是通过 cargo build。此外,一些测试在 Windows 上无法运行 - 请参阅 CONTRIBUTING.md。当然,实际的项目包本身是平台无关的。

包、crates.io 和 GIT

该项目由四个包组成(可能还有一个第五个包可能会出现)。其中三个在 crates.io 上:allowallow_implallow_internal。第四个包,allow_tests,不在 crates.io 上,因为它仅用于测试。(TODO 如果我们继续使用 ui_test,将不依赖于 ui_test 的部分移动到第五个包中,以便在 Rust 1.63 以下版本也能运行。)

它们都在同一个 GIT 仓库 下,这简化了维护。

贡献

请参阅 CONTRIBUTING.md

你认识有人有

  • 使用 https://github.com/dtolnay/trybuildhttps://github.com/oli-obk/ui_test 的经验,或者
  • 对 rustc(无前缀)的版本控制/规划/源代码生命周期有了解或参与,(较少的是 rustdoc:: - 很少),或者 (非常之多) clippy:: 的规则,或者
  • 使用许多规则或频繁使用它们,并处理来自 rustc/rustdoc/clippy 的变更的经验吗?

许可协议

Allow 项目根据 MIT 许可协议和 Apache 许可协议(版本 2.0)的条款进行分发。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MITCOPYRIGHT

依赖项