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
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user