From dadde88ebacd5e209922928206e0d85a99009203 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 21 Aug 2020 15:33:34 +0200 Subject: [PATCH 1/2] Unify checks for lint missing_doc_code_examples and --show-coverage --- .../passes/calculate_doc_coverage.rs | 17 ++----------- src/librustdoc/passes/doc_test_lints.rs | 25 +++++++++++++------ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index 457359e7a3806..671e082556722 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -3,7 +3,7 @@ use crate::config::OutputFormat; use crate::core::DocContext; use crate::fold::{self, DocFolder}; use crate::html::markdown::{find_testable_code, ErrorCodes}; -use crate::passes::doc_test_lints::Tests; +use crate::passes::doc_test_lints::{should_have_doc_example, Tests}; use crate::passes::Pass; use rustc_span::symbol::sym; use rustc_span::FileName; @@ -231,19 +231,6 @@ impl fold::DocFolder for CoverageCalculator { let has_docs = !i.attrs.doc_strings.is_empty(); let mut tests = Tests { found_tests: 0 }; - let should_have_doc_examples = !matches!(i.inner, - clean::StructFieldItem(_) - | clean::VariantItem(_) - | clean::AssocConstItem(_, _) - | clean::AssocTypeItem(_, _) - | clean::TypedefItem(_, _) - | clean::StaticItem(_) - | clean::ConstantItem(_) - | clean::ExternCrateItem(_, _) - | clean::ImportItem(_) - | clean::PrimitiveItem(_) - | clean::KeywordItem(_) - ); find_testable_code( &i.attrs.doc_strings.iter().map(|d| d.as_str()).collect::>().join("\n"), &mut tests, @@ -257,7 +244,7 @@ impl fold::DocFolder for CoverageCalculator { self.items.entry(i.source.filename.clone()).or_default().count_item( has_docs, has_doc_example, - should_have_doc_examples, + should_have_doc_example(&i.inner), ); } } diff --git a/src/librustdoc/passes/doc_test_lints.rs b/src/librustdoc/passes/doc_test_lints.rs index 1fdc4ee247adf..a465a5f681f5c 100644 --- a/src/librustdoc/passes/doc_test_lints.rs +++ b/src/librustdoc/passes/doc_test_lints.rs @@ -4,6 +4,7 @@ //! - PRIVATE_DOC_TESTS: this looks for private items with doc-tests. use super::{span_of_attrs, Pass}; +use crate::clean; use crate::clean::*; use crate::core::DocContext; use crate::fold::DocFolder; @@ -59,6 +60,22 @@ impl crate::test::Tester for Tests { } } +pub fn should_have_doc_example(item_kind: &clean::ItemEnum) -> bool { + !matches!(item_kind, + clean::StructFieldItem(_) + | clean::VariantItem(_) + | clean::AssocConstItem(_, _) + | clean::AssocTypeItem(_, _) + | clean::TypedefItem(_, _) + | clean::StaticItem(_) + | clean::ConstantItem(_) + | clean::ExternCrateItem(_, _) + | clean::ImportItem(_) + | clean::PrimitiveItem(_) + | clean::KeywordItem(_) + ) +} + pub fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { let hir_id = match cx.as_local_hir_id(item.def_id) { Some(hir_id) => hir_id, @@ -73,13 +90,7 @@ pub fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { find_testable_code(&dox, &mut tests, ErrorCodes::No, false, None); if tests.found_tests == 0 { - use ItemEnum::*; - - let should_report = match item.inner { - ExternCrateItem(_, _) | ImportItem(_) | PrimitiveItem(_) | KeywordItem(_) => false, - _ => true, - }; - if should_report { + if should_have_doc_example(&item.inner) { debug!("reporting error for {:?} (hir_id={:?})", item, hir_id); let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span()); cx.tcx.struct_span_lint_hir( From 7a05f13aed27c75f592c89435350c4826174316a Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 21 Aug 2020 18:05:51 +0200 Subject: [PATCH 2/2] Strenghten tests for missing_doc_code_examples lint --- .../lint-missing-doc-code-example.rs | 31 +++++++++++++++++++ .../lint-missing-doc-code-example.stderr | 28 ++++++++++++++--- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs index ffe0ddcd8c9b2..ebe7a242211bf 100644 --- a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs +++ b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs @@ -38,3 +38,34 @@ pub mod module3 { //~^ ERROR pub fn test() {} } + +/// Doc, but no code example and it's fine! +pub const Const: u32 = 0; +/// Doc, but no code example and it's fine! +pub static Static: u32 = 0; +/// Doc, but no code example and it's fine! +pub type Type = u32; + +/// Doc +//~^ ERROR +pub struct Struct { + /// Doc, but no code example and it's fine! + pub field: u32, +} + +/// Doc +//~^ ERROR +pub enum Enum { + /// Doc, but no code example and it's fine! + X, +} + +/// Doc +//~^ ERROR +#[repr(C)] +union Union { + /// Doc, but no code example and it's fine! + a: i32, + /// Doc, but no code example and it's fine! + b: f32, +} diff --git a/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr b/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr index 3fcfc1808e079..32756c99e7f9f 100644 --- a/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr +++ b/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr @@ -1,9 +1,8 @@ error: missing code example in this documentation - --> $DIR/lint-missing-doc-code-example.rs:19:1 + --> $DIR/lint-missing-doc-code-example.rs:49:1 | -LL | / mod module1 { -LL | | } - | |_^ +LL | /// Doc + | ^^^^^^^ | note: the lint level is defined here --> $DIR/lint-missing-doc-code-example.rs:2:9 @@ -11,11 +10,30 @@ note: the lint level is defined here LL | #![deny(missing_doc_code_examples)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ +error: missing code example in this documentation + --> $DIR/lint-missing-doc-code-example.rs:63:1 + | +LL | /// Doc + | ^^^^^^^ + +error: missing code example in this documentation + --> $DIR/lint-missing-doc-code-example.rs:56:1 + | +LL | /// Doc + | ^^^^^^^ + +error: missing code example in this documentation + --> $DIR/lint-missing-doc-code-example.rs:19:1 + | +LL | / mod module1 { +LL | | } + | |_^ + error: missing code example in this documentation --> $DIR/lint-missing-doc-code-example.rs:37:3 | LL | /// doc | ^^^^^^^ -error: aborting due to 2 previous errors +error: aborting due to 5 previous errors