mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 21:23:56 +00:00
Move links to the end of each chapter on adding_lints
This commit is contained in:
parent
19e72a24ae
commit
0de71b0e3a
1 changed files with 39 additions and 28 deletions
|
@ -107,13 +107,15 @@ our lint, we need to commit the generated `.stderr` files, too.
|
||||||
|
|
||||||
If the lint you are working on is making use of structured suggestions, the
|
If the lint you are working on is making use of structured suggestions, the
|
||||||
test file should include a `// run-rustfix` comment at the top. This will
|
test file should include a `// run-rustfix` comment at the top. This will
|
||||||
additionally run [rustfix](https://github.com/rust-lang-nursery/rustfix) for
|
additionally run [rustfix] for that test. Rustfix will apply the suggestions
|
||||||
that test. Rustfix will apply the suggestions from the lint to the code of the
|
from the lint to the code of the test file and compare that to the contents of
|
||||||
test file and compare that to the contents of a `.fixed` file.
|
a `.fixed` file.
|
||||||
|
|
||||||
Use `tests/ui/update-all-references.sh` to automatically generate the
|
Use `tests/ui/update-all-references.sh` to automatically generate the
|
||||||
`.fixed` file after running the tests.
|
`.fixed` file after running the tests.
|
||||||
|
|
||||||
|
[rustfix]: https://github.com/rust-lang/rustfix
|
||||||
|
|
||||||
## Edition 2018 tests
|
## Edition 2018 tests
|
||||||
|
|
||||||
Some features require the 2018 edition to work (e.g. `async_await`), but
|
Some features require the 2018 edition to work (e.g. `async_await`), but
|
||||||
|
@ -167,10 +169,10 @@ declare_clippy_lint! {
|
||||||
* The section of lines prefixed with `///` constitutes the lint documentation
|
* The section of lines prefixed with `///` constitutes the lint documentation
|
||||||
section. This is the default documentation style and will be displayed
|
section. This is the default documentation style and will be displayed
|
||||||
[like this][example_lint_page].
|
[like this][example_lint_page].
|
||||||
* `FOO_FUNCTIONS` is the name of our lint. Be sure to follow the [lint naming
|
* `FOO_FUNCTIONS` is the name of our lint. Be sure to follow the
|
||||||
guidelines][lint_naming] here when naming your lint. In short, the name should
|
[lint naming guidelines][lint_naming] here when naming your lint.
|
||||||
state the thing that is being checked for and read well when used with
|
In short, the name should state the thing that is being checked for and
|
||||||
`allow`/`warn`/`deny`.
|
read well when used with `allow`/`warn`/`deny`.
|
||||||
* `pedantic` sets the lint level to `Allow`.
|
* `pedantic` sets the lint level to `Allow`.
|
||||||
The exact mapping can be found [here][category_level_mapping]
|
The exact mapping can be found [here][category_level_mapping]
|
||||||
* The last part should be a text that explains what exactly is wrong with the
|
* The last part should be a text that explains what exactly is wrong with the
|
||||||
|
@ -200,7 +202,10 @@ automate everything. We will have to register our lint pass manually in the
|
||||||
store.register_early_pass(|| box foo_functions::FooFunctions);
|
store.register_early_pass(|| box foo_functions::FooFunctions);
|
||||||
```
|
```
|
||||||
|
|
||||||
[example lint page]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
|
[declare_clippy_lint]: https://github.com/rust-lang/rust-clippy/blob/557f6848bd5b7183f55c1e1522a326e9e1df6030/clippy_lints/src/lib.rs#L60
|
||||||
|
[example_lint_page]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
|
||||||
|
[lint_naming]: https://rust-lang.github.io/rfcs/0344-conventions-galore.html#lints
|
||||||
|
[category_level_mapping]: https://github.com/rust-lang/rust-clippy/blob/557f6848bd5b7183f55c1e1522a326e9e1df6030/clippy_lints/src/lib.rs#L110
|
||||||
|
|
||||||
## Lint passes
|
## Lint passes
|
||||||
|
|
||||||
|
@ -220,6 +225,9 @@ Since we don't need type information for checking the function name, we used
|
||||||
`--pass=early` when running the new lint automation and all the imports were
|
`--pass=early` when running the new lint automation and all the imports were
|
||||||
added accordingly.
|
added accordingly.
|
||||||
|
|
||||||
|
[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
|
||||||
|
|
||||||
## Emitting a lint
|
## Emitting a lint
|
||||||
|
|
||||||
With UI tests and the lint declaration in place, we can start working on the
|
With UI tests and the lint declaration in place, we can start working on the
|
||||||
|
@ -265,13 +273,16 @@ impl EarlyLintPass for FooFunctions {
|
||||||
|
|
||||||
Running our UI test should now produce output that contains the lint message.
|
Running our UI test should now produce output that contains the lint message.
|
||||||
|
|
||||||
|
[check_fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/trait.EarlyLintPass.html#method.check_fn
|
||||||
|
[diagnostics]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/utils/diagnostics.rs
|
||||||
|
|
||||||
## Adding the lint logic
|
## Adding the lint logic
|
||||||
|
|
||||||
Writing the logic for your lint will most likely be different from our example,
|
Writing the logic for your lint will most likely be different from our example,
|
||||||
so this section is kept rather short.
|
so this section is kept rather short.
|
||||||
|
|
||||||
Using the [`check_fn`][check_fn] method gives us access to [`FnKind`][fn_kind]
|
Using the [`check_fn`][check_fn] method gives us access to [`FnKind`][fn_kind]
|
||||||
that has the `FnKind::Fn` variant. It provides access to the name of the
|
that has the [`FnKind::Fn`] variant. It provides access to the name of the
|
||||||
function/method via an [`Ident`][ident].
|
function/method via an [`Ident`][ident].
|
||||||
|
|
||||||
With that we can expand our `check_fn` method to:
|
With that we can expand our `check_fn` method to:
|
||||||
|
@ -323,6 +334,10 @@ implementation is not violating any Clippy lints itself.
|
||||||
That should be it for the lint implementation. Running `cargo test` should now
|
That should be it for the lint implementation. Running `cargo test` should now
|
||||||
pass.
|
pass.
|
||||||
|
|
||||||
|
[fn_kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/visit/enum.FnKind.html
|
||||||
|
[`FnKind::Fn`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/visit/enum.FnKind.html#variant.Fn
|
||||||
|
[ident]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Ident.html
|
||||||
|
|
||||||
## Author lint
|
## Author lint
|
||||||
|
|
||||||
If you have trouble implementing your lint, there is also the internal `author`
|
If you have trouble implementing your lint, there is also the internal `author`
|
||||||
|
@ -340,6 +355,8 @@ see the generated code in the output below.
|
||||||
If the command was executed successfully, you can copy the code over to where
|
If the command was executed successfully, you can copy the code over to where
|
||||||
you are implementing your lint.
|
you are implementing your lint.
|
||||||
|
|
||||||
|
[author_example]: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=9a12cb60e5c6ad4e3003ac6d5e63cf55
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The final thing before submitting our PR is to add some documentation to our
|
The final thing before submitting our PR is to add some documentation to our
|
||||||
|
@ -373,11 +390,13 @@ declare_clippy_lint! {
|
||||||
Once your lint is merged, this documentation will show up in the [lint
|
Once your lint is merged, this documentation will show up in the [lint
|
||||||
list][lint_list].
|
list][lint_list].
|
||||||
|
|
||||||
|
[lint_list]: https://rust-lang.github.io/rust-clippy/master/index.html
|
||||||
|
|
||||||
## Running rustfmt
|
## Running rustfmt
|
||||||
|
|
||||||
[Rustfmt](https://github.com/rust-lang/rustfmt) is a tool for formatting Rust
|
[Rustfmt] is a tool for formatting Rust code according to style guidelines.
|
||||||
code according to style guidelines. Your code has to be formatted by `rustfmt`
|
Your code has to be formatted by `rustfmt` before a PR can be merged.
|
||||||
before a PR can be merged. Clippy uses nightly `rustfmt` in the CI.
|
Clippy uses nightly `rustfmt` in the CI.
|
||||||
|
|
||||||
It can be installed via `rustup`:
|
It can be installed via `rustup`:
|
||||||
|
|
||||||
|
@ -388,12 +407,16 @@ rustup component add rustfmt --toolchain=nightly
|
||||||
Use `cargo dev fmt` to format the whole codebase. Make sure that `rustfmt` is
|
Use `cargo dev fmt` to format the whole codebase. Make sure that `rustfmt` is
|
||||||
installed for the nightly toolchain.
|
installed for the nightly toolchain.
|
||||||
|
|
||||||
|
[Rustfmt]: https://github.com/rust-lang/rustfmt
|
||||||
|
|
||||||
## Debugging
|
## Debugging
|
||||||
|
|
||||||
If you want to debug parts of your lint implementation, you can use the [`dbg!`]
|
If you want to debug parts of your lint implementation, you can use the [`dbg!`]
|
||||||
macro anywhere in your code. Running the tests should then include the debug
|
macro anywhere in your code. Running the tests should then include the debug
|
||||||
output in the `stdout` part.
|
output in the `stdout` part.
|
||||||
|
|
||||||
|
[`dbg!`]: https://doc.rust-lang.org/std/macro.dbg.html
|
||||||
|
|
||||||
## PR Checklist
|
## PR Checklist
|
||||||
|
|
||||||
Before submitting your PR make sure you followed all of the basic requirements:
|
Before submitting your PR make sure you followed all of the basic requirements:
|
||||||
|
@ -437,26 +460,14 @@ documentation currently. This is unfortunate, but in most cases you can probably
|
||||||
get away with copying things from existing similar lints. If you are stuck,
|
get away with copying things from existing similar lints. If you are stuck,
|
||||||
don't hesitate to ask on [Discord] or in the issue/PR.
|
don't hesitate to ask on [Discord] or in the issue/PR.
|
||||||
|
|
||||||
[lint_list]: https://rust-lang.github.io/rust-clippy/master/index.html
|
|
||||||
[lint_naming]: https://rust-lang.github.io/rfcs/0344-conventions-galore.html#lints
|
|
||||||
[category_level_mapping]: https://github.com/rust-lang/rust-clippy/blob/bd23cb89ec0ea63403a17d3fc5e50c88e38dd54f/clippy_lints/src/lib.rs#L43
|
|
||||||
[declare_clippy_lint]: https://github.com/rust-lang/rust-clippy/blob/a71acac1da7eaf667ab90a1d65d10e5cc4b80191/clippy_lints/src/lib.rs#L39
|
|
||||||
[check_fn]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/trait.EarlyLintPass.html#method.check_fn
|
|
||||||
[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
|
|
||||||
[fn_kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/visit/enum.FnKind.html
|
|
||||||
[diagnostics]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/utils/diagnostics.rs
|
|
||||||
[utils]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/utils/mod.rs
|
[utils]: https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/utils/mod.rs
|
||||||
[ident]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Ident.html
|
|
||||||
[span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html
|
|
||||||
[applicability]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/enum.Applicability.html
|
|
||||||
[if_chain]: https://docs.rs/if_chain/*/if_chain/
|
[if_chain]: https://docs.rs/if_chain/*/if_chain/
|
||||||
[ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/sty/index.html
|
|
||||||
[ast]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/index.html
|
|
||||||
[from_expansion]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html#method.from_expansion
|
[from_expansion]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html#method.from_expansion
|
||||||
[in_external_macro]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/fn.in_external_macro.html
|
[in_external_macro]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/lint/fn.in_external_macro.html
|
||||||
[author_example]: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=9a12cb60e5c6ad4e3003ac6d5e63cf55
|
[span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html
|
||||||
|
[applicability]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/enum.Applicability.html
|
||||||
[rustc-dev-guide]: https://rustc-dev-guide.rust-lang.org/
|
[rustc-dev-guide]: https://rustc-dev-guide.rust-lang.org/
|
||||||
[nightly_docs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/
|
[nightly_docs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/
|
||||||
|
[ast]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/index.html
|
||||||
|
[ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/sty/index.html
|
||||||
[Discord]: https://discord.gg/rust-lang
|
[Discord]: https://discord.gg/rust-lang
|
||||||
[`dbg`!]: https://doc.rust-lang.org/std/macro.dbg.html
|
|
||||||
|
|
Loading…
Reference in a new issue