Clean-up CONTRIBUTING.md

This commit is contained in:
Yuki Okushi 2020-03-10 18:50:06 +09:00
parent 187bbf0e7b
commit 8cdd75ca29
No known key found for this signature in database
GPG Key ID: B0986C85C0E2DAA1

View File

@ -8,8 +8,7 @@ something. We appreciate any sort of contributions, and don't want a wall of rul
Clippy welcomes contributions from everyone. There are many ways to contribute to Clippy and the following document Clippy welcomes contributions from everyone. There are many ways to contribute to Clippy and the following document
explains how you can contribute and how to get started. If you have any questions about contributing or need help with explains how you can contribute and how to get started. If you have any questions about contributing or need help with
anything, feel free to ask questions on issues or visit the `#clippy` IRC channel on `irc.mozilla.org` or meet us in anything, feel free to ask questions on issues or visit the `#clippy` on [Discord](https://discord.gg/rust-lang).
`#clippy` on [Discord](https://discord.gg/rust-lang).
All contributors are expected to follow the [Rust Code of Conduct](http://www.rust-lang.org/conduct.html). All contributors are expected to follow the [Rust Code of Conduct](http://www.rust-lang.org/conduct.html).
@ -55,8 +54,7 @@ and resolved paths.
[`T-AST`](https://github.com/rust-lang/rust-clippy/labels/T-AST) issues will generally need you to match against a [`T-AST`](https://github.com/rust-lang/rust-clippy/labels/T-AST) issues will generally need you to match against a
predefined syntax structure. To figure out how this syntax structure is encoded in the AST, it is recommended to run predefined syntax structure. To figure out how this syntax structure is encoded in the AST, it is recommended to run
`rustc -Z ast-json` on an example of the structure and compare with the [nodes in the AST `rustc -Z ast-json` on an example of the structure and compare with the [nodes in the AST
docs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast). Usually the lint will end up to be a nested series of docs]. Usually the lint will end up to be a nested series of matches and ifs, [like
matches and ifs, [like
so](https://github.com/rust-lang/rust-clippy/blob/de5ccdfab68a5e37689f3c950ed1532ba9d652a0/src/misc.rs#L34). so](https://github.com/rust-lang/rust-clippy/blob/de5ccdfab68a5e37689f3c950ed1532ba9d652a0/src/misc.rs#L34).
[`E-medium`](https://github.com/rust-lang/rust-clippy/labels/E-medium) issues are generally [`E-medium`](https://github.com/rust-lang/rust-clippy/labels/E-medium) issues are generally
@ -69,6 +67,8 @@ be more involved and require verifying types. The
lot of methods that are useful, though one of the most useful would be `expr_ty` (gives the type of lot of methods that are useful, though one of the most useful would be `expr_ty` (gives the type of
an AST expression). `match_def_path()` in Clippy's `utils` module can also be useful. an AST expression). `match_def_path()` in Clippy's `utils` module can also be useful.
[nodes in the AST docs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/
## Writing code ## Writing code
Have a look at the [docs for writing lints](doc/adding_lints.md) for more details. [Llogiq's blog post on Have a look at the [docs for writing lints](doc/adding_lints.md) for more details. [Llogiq's blog post on
@ -82,11 +82,8 @@ quick read.
## How Clippy works ## How Clippy works
Clippy is a [rustc compiler plugin][compiler_plugin]. The main entry point is at [`src/lib.rs`][main_entry]. In there, [`clippy_lints/src/lib.rs`][lint_crate_entry] imports all the different lint modules and registers in the [`LintStore`].
the lint registration is delegated to the [`clippy_lints`][lint_crate] crate. For example, the [`else_if_without_else`][else_if_without_else] lint is registered like this:
[`clippy_lints/src/lib.rs`][lint_crate_entry] imports all the different lint modules and registers them with the rustc
plugin registry. For example, the [`else_if_without_else`][else_if_without_else] lint is registered like this:
```rust ```rust
// ./clippy_lints/src/lib.rs // ./clippy_lints/src/lib.rs
@ -95,25 +92,24 @@ plugin registry. For example, the [`else_if_without_else`][else_if_without_else]
pub mod else_if_without_else; pub mod else_if_without_else;
// ... // ...
pub fn register_plugins(reg: &mut rustc_driver::plugin::Registry) { pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: &Conf) {
// ... // ...
reg.register_early_lint_pass(box else_if_without_else::ElseIfWithoutElse); store.register_early_pass(|| box else_if_without_else::ElseIfWithoutElse);
// ... // ...
reg.register_lint_group("clippy::restriction", vec![ store.register_group(true, "clippy::restriction", Some("clippy_restriction"), vec![
// ... // ...
else_if_without_else::ELSE_IF_WITHOUT_ELSE, LintId::of(&else_if_without_else::ELSE_IF_WITHOUT_ELSE),
// ... // ...
]); ]);
} }
``` ```
The [`plugin::PluginRegistry`][plugin_registry] provides two methods to register lints: The [`rustc_lint::LintStore`][`LintStore`] provides two methods to register lints:
[register_early_lint_pass][reg_early_lint_pass] and [register_late_lint_pass][reg_late_lint_pass]. Both take an object [register_early_pass][reg_early_pass] and [register_late_pass][reg_late_pass]. Both take an object
that implements an [`EarlyLintPass`][early_lint_pass] or [`LateLintPass`][late_lint_pass] respectively. This is done in that implements an [`EarlyLintPass`][early_lint_pass] or [`LateLintPass`][late_lint_pass] respectively. This is done in
every single lint. It's worth noting that the majority of `clippy_lints/src/lib.rs` is autogenerated by `cargo dev every single lint. It's worth noting that the majority of `clippy_lints/src/lib.rs` is autogenerated by `cargo dev
update_lints` and you don't have to add anything by hand. When you are writing your own lint, you can use that script to update_lints`. When you are writing your own lint, you can use that script to save you some time.
save you some time.
```rust ```rust
// ./clippy_lints/src/else_if_without_else.rs // ./clippy_lints/src/else_if_without_else.rs
@ -135,9 +131,14 @@ The difference between `EarlyLintPass` and `LateLintPass` is that the methods of
AST information. The methods of the `LateLintPass` trait are executed after type checking and contain type information AST information. The methods of the `LateLintPass` trait are executed after type checking and contain type information
via the `LateContext` parameter. via the `LateContext` parameter.
That's why the `else_if_without_else` example uses the `register_early_lint_pass` function. Because the [actual lint That's why the `else_if_without_else` example uses the `register_early_pass` function. Because the [actual lint
logic][else_if_without_else] does not depend on any type information. logic][else_if_without_else] does not depend on any type information.
See also [the adding lints doc].
[the adding lints doc]: https://github.com/rust-lang/rust-clippy/blob/master/doc/adding_lints.md
[`LintStore`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html
## Fixing build failures caused by Rust ## Fixing build failures caused by Rust
Clippy will sometimes fail to build from source because building it depends on unstable internal Rust features. Most of Clippy will sometimes fail to build from source because building it depends on unstable internal Rust features. Most of
@ -145,8 +146,9 @@ the times we have to adapt to the changes and only very rarely there's an actual
caused by Rust updates, can be a good way to learn about Rust internals. caused by Rust updates, can be a good way to learn about Rust internals.
In order to find out why Clippy does not work properly with a new Rust commit, you can use the [rust-toolstate commit In order to find out why Clippy does not work properly with a new Rust commit, you can use the [rust-toolstate commit
history][toolstate_commit_history]. You will then have to look for the last commit that contains `test-pass -> history][toolstate_commit_history]. You will then have to look for the last commit that contains
build-fail` or `test-pass` -> `test-fail` for the `clippy-driver` component. [Here][toolstate_commit] is an example. `test-pass -> build-fail` or `test-pass` -> `test-fail` for the `clippy-driver` component.
[Here][toolstate_commit] is an example.
The commit message contains a link to the PR. The PRs are usually small enough to discover the breaking API change and The commit message contains a link to the PR. The PRs are usually small enough to discover the breaking API change and
if they are bigger, they likely include some discussion that may help you to fix Clippy. if they are bigger, they likely include some discussion that may help you to fix Clippy.
@ -158,14 +160,8 @@ If you decide to make Clippy work again with a Rust commit that breaks it,
you probably want to install the latest Rust from master locally and run Clippy you probably want to install the latest Rust from master locally and run Clippy
using that version of Rust. using that version of Rust.
You can use [rustup-toolchain-install-master][rtim] to do that: You can set up the master toolchain by running `./setup-toolchain.sh`. That script will install
[rustup-toolchain-install-master][rtim] and master toolchain, then run `rustup override set master`.
```bash
cargo install rustup-toolchain-install-master
rustup-toolchain-install-master --force -n master -c rustc-dev
rustup override set master
cargo test
```
After fixing the build failure on this repository, we can submit a pull request After fixing the build failure on this repository, we can submit a pull request
to [`rust-lang/rust`] to fix the toolstate. to [`rust-lang/rust`] to fix the toolstate.
@ -206,39 +202,34 @@ You can find the Clippy bors queue [here][homu_queue].
If you have @bors permissions, you can find an overview of the available If you have @bors permissions, you can find an overview of the available
commands [here][homu_instructions]. commands [here][homu_instructions].
## Contributions ## Contributions
Contributions to Clippy should be made in the form of GitHub pull requests. Each pull request will Contributions to Clippy should be made in the form of GitHub pull requests. Each pull request will
be reviewed by a core contributor (someone with permission to land patches) and either landed in the be reviewed by a core contributor (someone with permission to land patches) and either landed in the
main tree or given feedback for changes that would be required. main tree or given feedback for changes that would be required.
All code in this repository is under the [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0>) All code in this repository is under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0)
or the [MIT](http://opensource.org/licenses/MIT) license. or the [MIT](https://opensource.org/licenses/MIT) license.
<!-- adapted from https://github.com/servo/servo/blob/master/CONTRIBUTING.md --> <!-- adapted from https://github.com/servo/servo/blob/master/CONTRIBUTING.md -->
[main_entry]: https://github.com/rust-lang/rust-clippy/blob/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/src/lib.rs#L14 [lint_crate_entry]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/lib.rs
[lint_crate]: https://github.com/rust-lang/rust-clippy/tree/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src [else_if_without_else]: https://github.com/rust-lang/rust-clippy/blob/4253aa7137cb7378acc96133c787e49a345c2b3c/clippy_lints/src/else_if_without_else.rs
[lint_crate_entry]: https://github.com/rust-lang/rust-clippy/blob/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src/lib.rs [reg_early_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_early_pass
[else_if_without_else]: https://github.com/rust-lang/rust-clippy/blob/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src/else_if_without_else.rs [reg_late_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_late_pass
[compiler_plugin]: https://doc.rust-lang.org/unstable-book/language-features/plugin.html#lint-plugins [early_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/trait.EarlyLintPass.html
[plugin_registry]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_plugin_impl/registry/struct.Registry.html [late_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/trait.LateLintPass.html
[reg_early_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_plugin_impl/registry/struct.Registry.html#method.register_early_lint_pass
[reg_late_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_plugin_impl/registry/struct.Registry.html#method.register_late_lint_pass
[early_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/trait.EarlyLintPass.html
[late_lint_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/trait.LateLintPass.html
[toolstate_commit_history]: https://github.com/rust-lang-nursery/rust-toolstate/commits/master [toolstate_commit_history]: https://github.com/rust-lang-nursery/rust-toolstate/commits/master
[toolstate_commit]: https://github.com/rust-lang-nursery/rust-toolstate/commit/6ce0459f6bfa7c528ae1886492a3e0b5ef0ee547 [toolstate_commit]: https://github.com/rust-lang-nursery/rust-toolstate/commit/aad74d8294e198a7cf8ac81a91aebb7f3bbcf727
[rtim]: https://github.com/kennytm/rustup-toolchain-install-master [rtim]: https://github.com/kennytm/rustup-toolchain-install-master
[rustup_component_history]: https://mexus.github.io/rustup-components-history [rustup_component_history]: https://rust-lang.github.io/rustup-components-history
[clippy_rfc]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md [clippy_rfc]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md
[rfc_stability]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#stability-guarantees [rfc_stability]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#stability-guarantees
[rfc_lint_cats]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#lint-audit-and-categories [rfc_lint_cats]: https://github.com/rust-lang/rfcs/blob/master/text/2476-clippy-uno.md#lint-audit-and-categories
[triage]: https://forge.rust-lang.org/triage-procedure.html [triage]: https://forge.rust-lang.org/triage-procedure.html
[l-crash]: https://github.com/rust-lang/rust-clippy/labels/L-crash%20%3Aboom%3A [l-crash]: https://github.com/rust-lang/rust-clippy/labels/L-crash%20%3Aboom%3A
[l-bug]: https://github.com/rust-lang/rust-clippy/labels/L-bug%20%3Abeetle%3A [l-bug]: https://github.com/rust-lang/rust-clippy/labels/L-bug%20%3Abeetle%3A
[homu]: https://github.com/servo/homu [homu]: https://github.com/rust-lang/homu
[homu_instructions]: https://buildbot2.rust-lang.org/homu/ [homu_instructions]: https://buildbot2.rust-lang.org/homu/
[homu_queue]: https://buildbot2.rust-lang.org/homu/queue/clippy [homu_queue]: https://buildbot2.rust-lang.org/homu/queue/clippy
[`rust-lang/rust`]: https://github.com/rust-lang/rust [`rust-lang/rust`]: https://github.com/rust-lang/rust