Clippy 黑客入门

本文档解释了 Clippy 黑客入门的基础知识。 其中包括如何构建和测试 Clippy。 有关代码库的更深入描述,请查看添加 Lint常用工具

获取代码

首先,请确保您已检出最新版本的 Clippy。如果这是您第一次使用 Clippy,请创建存储库的一个 fork,然后使用以下命令克隆它

git clone [email protected]:<your-username>/rust-clippy

如果您过去已经克隆了 Clippy,请将其更新到最新版本

# If the upstream remote has not been added yet
git remote add upstream https://github.com/rust-lang/rust-clippy
# upstream has to be the remote of the rust-lang/rust-clippy repo
git fetch upstream
# make sure that you are on the master branch
git checkout master
# rebase your master branch on the upstream master
git rebase upstream/master
# push to the master branch of your fork
git push

构建和测试

您可以像其他 Rust 项目一样构建和测试 Clippy

cargo build  # builds Clippy
cargo test   # tests Clippy

由于 Clippy 的测试套件非常大,因此有一些命令只运行 Clippy 测试的子集

# only run UI tests
cargo uitest
# only run UI tests starting with `test_`
TESTNAME="test_" cargo uitest
# only run dogfood tests
cargo dev dogfood

如果UI 测试的输出与预期输出不同,您可以使用以下命令更新参考文件

cargo bless

例如,如果您修复 lint 错误消息中的错别字,或者修改测试文件以添加测试用例,则这是必要的。

注意: 此命令可能会更新比您预期更多的文件。 在这种情况下,请仅提交您想要更新的文件。

cargo dev

Clippy 有一些开发工具,可以更方便地使用 Clippy。 这些工具可以通过 cargo dev 命令访问。 下面列出了可用的工具。 要获取有关这些命令的更多信息,只需使用 --help 调用它们即可。

# formats the whole Clippy codebase and all tests
cargo dev fmt
# register or update lint names/groups/...
cargo dev update_lints
# create a new lint and register it
cargo dev new_lint
# deprecate a lint and attempt to remove code relating to it
cargo dev deprecate
# automatically formatting all code before each commit
cargo dev setup git-hook
# (experimental) Setup Clippy to work with IntelliJ-Rust
cargo dev setup intellij
# runs the `dogfood` tests
cargo dev dogfood

更多关于 intellij 命令用法和原因。

lintcheck

cargo lintcheck 将构建 Clippy 并在固定的 crate 集合上运行,并生成结果日志。您可以 git diff 更新后的日志与之前的版本进行比较,并查看您的 lint 对一小部分 crate 产生的影响。如果您添加了新的 lint,请审核生成的警告,并确保没有误报并且建议有效。

有关更多详细信息,请参阅工具的README

PR

我们遵循 rustc 不合并提交的策略。请参阅 https://rustc-dev-guide.rust-lang.org/contributing.html#opening-a-pr

常用缩写

缩写含义
UB未定义行为
FP误报
FN漏报
ICE内部编译器错误
AST抽象语法树
MIR中级中间表示
HIR高级中间表示
TCX类型上下文

这是 Clippy 开发过程中可能出现的一些缩写词的简明列表。 可以在rustc-dev-guide 词汇表中找到广泛的通用列表。 如果某个缩写或含义对您不清楚,请随时提问。

从源码安装

如果您正在研究 Clippy 并想从源代码安装它,请执行以下操作

首先,请注意 /rust-toolchain 中的工具链覆盖。 我们将使用此覆盖将 Clippy 安装到正确的工具链中。

提示:您可以使用 rustup show active-toolchain 查看当前目录的活动工具链。

从 Clippy 项目根目录运行以下命令,以构建 Clippy 二进制文件并将其复制到工具链目录中。 这将覆盖当前安装的 Clippy 组件。

cargo build --release --bin cargo-clippy --bin clippy-driver -Zunstable-options --out-dir "$(rustc --print=sysroot)/bin"

现在您可以在任何项目中使用刚安装 Clippy 的工具链运行 cargo clippy

cd my-project
cargo +nightly-2021-07-01 clippy

...或 clippy-driver

clippy-driver +nightly-2021-07-01 <filename>

如果您需要恢复默认的 Clippy 安装,请运行以下命令(从 Clippy 项目根目录)。

rustup component remove clippy
rustup component add clippy

请勿使用 cargo install --path . --force 进行安装,因为这会覆盖 rustup 代理。也就是说,~/.cargo/bin/cargo-clippy~/.cargo/bin/clippy-driver 应该是指向 ~/.cargo/bin/rustup 的硬链接或软链接。您可以通过运行 rustup update 来修复这些链接。