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
来修复这些链接。