diff options
| author | Eric Huss <eric@huss.org> | 2020-09-13 08:47:24 -0700 |
|---|---|---|
| committer | Eric Huss <eric@huss.org> | 2020-09-13 08:48:03 -0700 |
| commit | c04973585df518edaa3bce547fe00793fa34d360 (patch) | |
| tree | e621ea03cbc34a16b5a4fe0b3a2943ecfdae6906 | |
| parent | ce014be0b9d0325ad9e6ecb8c93b3c8186b18089 (diff) | |
| download | rust-c04973585df518edaa3bce547fe00793fa34d360.tar.gz rust-c04973585df518edaa3bce547fe00793fa34d360.zip | |
Support `ignore` for lint examples.
| -rw-r--r-- | compiler/rustc_session/src/lint.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_session/src/lint/builtin.rs | 20 | ||||
| -rw-r--r-- | src/tools/lint-docs/src/lib.rs | 29 |
3 files changed, 40 insertions, 15 deletions
diff --git a/compiler/rustc_session/src/lint.rs b/compiler/rustc_session/src/lint.rs index 4a3e59f18e5..62e021d5e45 100644 --- a/compiler/rustc_session/src/lint.rs +++ b/compiler/rustc_session/src/lint.rs @@ -319,8 +319,10 @@ impl LintBuffer { /// /// The `{{produces}}` tag will be automatically replaced with the output from /// the example by the build system. You can build and view the rustc book -/// with `x.py doc --stage=1 src/doc/rustc --open` (use --stage=0 if just -/// changing the wording of an existing lint). +/// with `x.py doc --stage=1 src/doc/rustc --open`. If the lint example is too +/// complex to run as a simple example (for example, it needs an extern +/// crate), mark it with `ignore` and manually paste the expected output below +/// the example. #[macro_export] macro_rules! declare_lint { ($(#[$attr:meta])* $vis: vis $NAME: ident, $Level: ident, $desc: expr) => ( diff --git a/compiler/rustc_session/src/lint/builtin.rs b/compiler/rustc_session/src/lint/builtin.rs index 22030a842db..935e910c1e2 100644 --- a/compiler/rustc_session/src/lint/builtin.rs +++ b/compiler/rustc_session/src/lint/builtin.rs @@ -128,7 +128,7 @@ declare_lint! { /// /// ### Example /// - /// ```rust,compile_fail + /// ```rust,ignore (needs separate file) /// fn main() { /// include!("foo.txt"); /// } @@ -344,7 +344,7 @@ declare_lint! { /// /// ### Example /// - /// ```rust,compile_fail + /// ```rust,ignore (needs extern crate) /// #![deny(unused_crate_dependencies)] /// ``` /// @@ -1984,7 +1984,7 @@ declare_lint! { /// /// ### Example /// - /// ```rust,compile_fail + /// ```rust,ignore (needs extern crate) /// #![deny(macro_use_extern_crate)] /// /// #[macro_use] @@ -2378,7 +2378,19 @@ declare_lint! { /// } /// ``` /// - /// {{produces}} + /// This will produce: + /// + /// ```text + /// warning: formatting may not be suitable for sub-register argument + /// --> src/main.rs:6:19 + /// | + /// 6 | asm!("mov {0}, {0}", in(reg) 0i16); + /// | ^^^ ^^^ ---- for this argument + /// | + /// = note: `#[warn(asm_sub_register)]` on by default + /// = help: use the `x` modifier to have the register formatted as `ax` + /// = help: or use the `r` modifier to keep the default formatting of `rax` + /// ``` /// /// ### Explanation /// diff --git a/src/tools/lint-docs/src/lib.rs b/src/tools/lint-docs/src/lib.rs index a8e3278fc66..5323bc357c0 100644 --- a/src/tools/lint-docs/src/lib.rs +++ b/src/tools/lint-docs/src/lib.rs @@ -19,6 +19,13 @@ impl Lint { fn doc_contains(&self, text: &str) -> bool { self.doc.iter().any(|line| line.contains(text)) } + + fn is_ignored(&self) -> bool { + self.doc + .iter() + .filter(|line| line.starts_with("```rust")) + .all(|line| line.contains(",ignore")) + } } #[derive(Clone, Copy, PartialEq)] @@ -208,13 +215,8 @@ fn generate_output_example( // try to avoid adding to this list. if matches!( lint.name.as_str(), - "unused_features" - | "unstable_features" - | "incomplete_include" - | "unused_crate_dependencies" - | "exported_private_dependencies" - | "proc_macro_derive_resolution_fallback" - | "macro_use_extern_crate" + "unused_features" // broken lint + | "unstable_features" // deprecated ) { return Ok(()); } @@ -223,13 +225,22 @@ fn generate_output_example( return Ok(()); } check_style(lint)?; - replace_produces(lint, rustc_path, verbose)?; + // Unfortunately some lints have extra requirements that this simple test + // setup can't handle (like extern crates). An alternative is to use a + // separate test suite, and use an include mechanism such as mdbook's + // `{{#rustdoc_include}}`. + if !lint.is_ignored() { + replace_produces(lint, rustc_path, verbose)?; + } Ok(()) } /// Checks the doc style of the lint. fn check_style(lint: &Lint) -> Result<(), Box<dyn Error>> { - for expected in &["### Example", "### Explanation", "{{produces}}"] { + for &expected in &["### Example", "### Explanation", "{{produces}}"] { + if expected == "{{produces}}" && lint.is_ignored() { + continue; + } if !lint.doc_contains(expected) { return Err(format!("lint docs should contain the line `{}`", expected).into()); } |
