Clean-up CONTRIBUTING.md
This commit is contained in:
parent
187bbf0e7b
commit
8cdd75ca29
@ -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
|
||||
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
|
||||
`#clippy` on [Discord](https://discord.gg/rust-lang).
|
||||
anything, feel free to ask questions on issues or visit the `#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).
|
||||
|
||||
@ -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
|
||||
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
|
||||
docs](https://doc.rust-lang.org/nightly/nightly-rustc/syntax/ast). Usually the lint will end up to be a nested series of
|
||||
matches and ifs, [like
|
||||
docs]. Usually the lint will end up to be a nested series of matches and ifs, [like
|
||||
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
|
||||
@ -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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Clippy is a [rustc compiler plugin][compiler_plugin]. The main entry point is at [`src/lib.rs`][main_entry]. In there,
|
||||
the lint registration is delegated to the [`clippy_lints`][lint_crate] crate.
|
||||
|
||||
[`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:
|
||||
[`clippy_lints/src/lib.rs`][lint_crate_entry] imports all the different lint modules and registers in the [`LintStore`].
|
||||
For example, the [`else_if_without_else`][else_if_without_else] lint is registered like this:
|
||||
|
||||
```rust
|
||||
// ./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 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:
|
||||
[register_early_lint_pass][reg_early_lint_pass] and [register_late_lint_pass][reg_late_lint_pass]. Both take an object
|
||||
The [`rustc_lint::LintStore`][`LintStore`] provides two methods to register lints:
|
||||
[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
|
||||
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
|
||||
save you some time.
|
||||
update_lints`. When you are writing your own lint, you can use that script to save you some time.
|
||||
|
||||
```rust
|
||||
// ./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
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
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 ->
|
||||
build-fail` or `test-pass` -> `test-fail` for the `clippy-driver` component. [Here][toolstate_commit] is an example.
|
||||
history][toolstate_commit_history]. You will then have to look for the last commit that contains
|
||||
`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
|
||||
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
|
||||
using that version of Rust.
|
||||
|
||||
You can use [rustup-toolchain-install-master][rtim] to do that:
|
||||
|
||||
```bash
|
||||
cargo install rustup-toolchain-install-master
|
||||
rustup-toolchain-install-master --force -n master -c rustc-dev
|
||||
rustup override set master
|
||||
cargo test
|
||||
```
|
||||
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`.
|
||||
|
||||
After fixing the build failure on this repository, we can submit a pull request
|
||||
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
|
||||
commands [here][homu_instructions].
|
||||
|
||||
|
||||
## Contributions
|
||||
|
||||
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
|
||||
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>)
|
||||
or the [MIT](http://opensource.org/licenses/MIT) license.
|
||||
All code in this repository is under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||||
or the [MIT](https://opensource.org/licenses/MIT) license.
|
||||
|
||||
<!-- 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]: https://github.com/rust-lang/rust-clippy/tree/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src
|
||||
[lint_crate_entry]: https://github.com/rust-lang/rust-clippy/blob/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src/lib.rs
|
||||
[else_if_without_else]: https://github.com/rust-lang/rust-clippy/blob/c5b39a5917ffc0f1349b6e414fa3b874fdcf8429/clippy_lints/src/else_if_without_else.rs
|
||||
[compiler_plugin]: https://doc.rust-lang.org/unstable-book/language-features/plugin.html#lint-plugins
|
||||
[plugin_registry]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_plugin_impl/registry/struct.Registry.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
|
||||
[lint_crate_entry]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/lib.rs
|
||||
[else_if_without_else]: https://github.com/rust-lang/rust-clippy/blob/4253aa7137cb7378acc96133c787e49a345c2b3c/clippy_lints/src/else_if_without_else.rs
|
||||
[reg_early_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_early_pass
|
||||
[reg_late_pass]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_late_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]: 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
|
||||
[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
|
||||
[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
|
||||
[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-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_queue]: https://buildbot2.rust-lang.org/homu/queue/clippy
|
||||
[`rust-lang/rust`]: https://github.com/rust-lang/rust
|
||||
|
Loading…
Reference in New Issue
Block a user