-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
214: 201/pass cfg flags r=xFrednet a=NathanFrasier This is a little rough. I feel like there has to be a better way to get rid of some of the calls to `.push()` and `.extend()` but I wasn't thinking of them. This still needs documentation as well. Addresses #201 Co-authored-by: Nathan Frasier <nathanfrasier.nf@gmail.com>
- Loading branch information
Showing
10 changed files
with
169 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# Setting Lint Levels | ||
Once your crate is configured to run some lints, it quickly becomes important to control the lint levels within your | ||
code. Marker provides the ability to use normal lint control attributes like `#[allow(...)]` `#[deny(...)]` and others | ||
to control the behavior of marker lints. | ||
|
||
## On nightly | ||
Marker uses the `marker::` tool prefix for lints. In order for rustc to recognize this prefix, it requires marker to be | ||
registered via the [`#[register_tool()]` feature](https://github.com/rust-lang/rust/issues/66079). | ||
|
||
If your crate is compiled using nightly, then controlling lints is as simple as placing `#![feature(register_tool)]` | ||
and `#![register_tool(marker)]` at the top of your crate `lib.rs` or `mod.rs` file. You can then use all of the normal | ||
lint attributes you might usually use, on marker provided lints, like `#[allow(marker::my_lint)]`. | ||
|
||
|
||
#### Nightly Required Attributes in `lib.rs` / `main.rs` | ||
```rust | ||
#![feature(register_tool)] | ||
#![register_tool(marker)] | ||
``` | ||
|
||
#### Nightly Lint Attribute | ||
``` | ||
// Marker lints can be controlled like this | ||
#[allow(marker::my_lint)] | ||
fn foo() {} | ||
``` | ||
|
||
## On Stable | ||
If your project isn't on nightly, you can still use the `register_tool` attribute, you'll just need to add some extra | ||
guards around it. Marker provides config arguments to rust during the lint passes, so that your linted code can | ||
conditionally apply attributes only during the marker run. | ||
|
||
Specifically marker passes `--cfg=marker` and a `--cfg=marker="my_crate"` flag for each lint crate. This means that you | ||
can use `#[cfg_attr(marker, foo)]` to conditionally apply the `foo` attribute only during lint runs. | ||
|
||
This conditional compilation can be used to leverage the fact that marker uses nightly for linting, without requiring | ||
the project to use a nightly toolchain. To do this, add `#![cfg_attr(marker, feature(register_tool))]` and | ||
`#![cfg_attr(marker, register_tool(marker))]` attributes to the top of your crate file, to register marker as a tool. | ||
Then you can apply lint level attributes like `#[cfg_attr(marker, allow(marker::foo))]` to control your marker lints. | ||
|
||
Additionally, you can check if a specific lint crate is in the set of loaded lint crates. This is useful, when you | ||
only want to enable some attributes if specific lints are loaded. For this you can use a `marker = "<lint-crate-name>"` | ||
check, like this: `#[cfg_attr(marker = "my_crate", allow(marker::foo))]`. | ||
|
||
#### Stable Required Attributes in `lib.rs` / `main.rs` | ||
```rust | ||
#![cfg_attr(marker, feature(register_tool))] | ||
#![cfg_attr(marker, register_tool(marker))] | ||
``` | ||
|
||
#### Stable Conditional Lint Attribute | ||
``` | ||
// Marker lints can be controlled like this | ||
#[cfg_attr(marker, allow(marker::my_lint))] | ||
fn foo() {} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#![cfg_attr(marker, feature(register_tool))] | ||
#![cfg_attr(marker, register_tool(marker))] | ||
|
||
mod allow_with_simple_attr { | ||
#[cfg_attr(marker, allow(marker::item_with_test_name))] | ||
fn find_me_fn() {} | ||
} | ||
|
||
mod allow_with_crate_check_attr { | ||
#[cfg_attr(marker = "marker_uilints", allow(marker::item_with_test_name))] | ||
fn find_me_fn() {} | ||
} | ||
|
||
mod lint_with_unloaded_crate_attr { | ||
#[cfg_attr(marker = "some_unknown_crate_that_isnt_loaded", allow(marker::item_with_test_name))] | ||
fn find_me_fn() {} | ||
} | ||
|
||
mod unknown_lint_allow { | ||
#[cfg_attr(marker, allow(marker::some_unknown_lint_that_doesnt_exist))] | ||
fn foo() {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
warning: unknown lint: `marker::some_unknown_lint_that_doesnt_exist` | ||
--> $DIR/cfg_attr_check.rs:20:30 | ||
| | ||
20 | #[cfg_attr(marker, allow(marker::some_unknown_lint_that_doesnt_exist))] | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= note: `#[warn(unknown_lints)]` on by default | ||
|
||
warning: found a `fn` item with a test name | ||
--> $DIR/cfg_attr_check.rs:16:5 | ||
| | ||
16 | fn find_me_fn() {} | ||
| ^^^^^^^^^^^^^^^^^^ | ||
| | ||
= note: `#[warn(marker::item_with_test_name)]` on by default | ||
|
||
warning: 2 warnings emitted | ||
|