From 617d10975ef1db8ab9fcf3b5720a147f36b69f41 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Mon, 27 Jul 2020 22:16:41 -0400 Subject: [PATCH] Separate `missing_doc_code_examples` from intra-doc links These two lints have no relation other than both being nightly-only. This allows stabilizing intra-doc links without stabilizing missing_doc_code_examples. --- .../passes/collect_intra_doc_links.rs | 4 +-- src/librustdoc/passes/mod.rs | 31 ++++++++++++------- .../passes/private_items_doc_tests.rs | 2 +- src/test/rustdoc-ui/lint-group.stderr | 26 ++++++++-------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 5187839423d..418238181e9 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -23,7 +23,7 @@ use crate::core::DocContext; use crate::fold::DocFolder; use crate::html::markdown::markdown_links; -use crate::passes::{look_for_tests, Pass}; +use crate::passes::Pass; use super::span_of_attrs; @@ -508,8 +508,6 @@ fn fold_item(&mut self, mut item: Item) -> Option { let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new); trace!("got documentation '{}'", dox); - look_for_tests(&cx, &dox, &item, true); - // find item's parent to resolve `Self` in item's docs below let parent_name = self.cx.as_local_hir_id(item.def_id).and_then(|item_hir| { let parent_hir = self.cx.tcx.hir().get_parent_item(item_hir); diff --git a/src/librustdoc/passes/mod.rs b/src/librustdoc/passes/mod.rs index 70366c90139..c604c804ddf 100644 --- a/src/librustdoc/passes/mod.rs +++ b/src/librustdoc/passes/mod.rs @@ -312,12 +312,7 @@ fn fold_item(&mut self, i: Item) -> Option { } } -pub fn look_for_tests<'tcx>( - cx: &DocContext<'tcx>, - dox: &str, - item: &Item, - check_missing_code: bool, -) { +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, None => { @@ -340,12 +335,24 @@ fn add_test(&mut self, _: String, _: LangString, _: usize) { find_testable_code(&dox, &mut tests, ErrorCodes::No, false, None); - if check_missing_code && tests.found_tests == 0 { - let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span()); - cx.tcx.struct_span_lint_hir(lint::builtin::MISSING_DOC_CODE_EXAMPLES, hir_id, sp, |lint| { - lint.build("missing code example in this documentation").emit() - }); - } else if !check_missing_code + if tests.found_tests == 0 { + use clean::ItemEnum::*; + + let should_report = match item.inner { + ExternCrateItem(_, _) | ImportItem(_) | PrimitiveItem(_) | KeywordItem(_) => false, + _ => true, + }; + if should_report { + 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( + lint::builtin::MISSING_DOC_CODE_EXAMPLES, + hir_id, + sp, + |lint| lint.build("missing code example in this documentation").emit(), + ); + } + } else if rustc_feature::UnstableFeatures::from_environment().is_nightly_build() && tests.found_tests > 0 && !cx.renderinfo.borrow().access_levels.is_public(item.def_id) { diff --git a/src/librustdoc/passes/private_items_doc_tests.rs b/src/librustdoc/passes/private_items_doc_tests.rs index aec5a6bd4e2..77ed578ca77 100644 --- a/src/librustdoc/passes/private_items_doc_tests.rs +++ b/src/librustdoc/passes/private_items_doc_tests.rs @@ -30,7 +30,7 @@ fn fold_item(&mut self, item: Item) -> Option { let cx = self.cx; let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new); - look_for_tests(&cx, &dox, &item, false); + look_for_tests(&cx, &dox, &item); self.fold_item_recur(item) } diff --git a/src/test/rustdoc-ui/lint-group.stderr b/src/test/rustdoc-ui/lint-group.stderr index 14d72e9aad3..ad923c714da 100644 --- a/src/test/rustdoc-ui/lint-group.stderr +++ b/src/test/rustdoc-ui/lint-group.stderr @@ -1,3 +1,16 @@ +error: missing code example in this documentation + --> $DIR/lint-group.rs:16:1 + | +LL | /// wait, this doesn't have a doctest? + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/lint-group.rs:7:9 + | +LL | #![deny(rustdoc)] + | ^^^^^^^ + = note: `#[deny(missing_doc_code_examples)]` implied by `#[deny(rustdoc)]` + error: documentation test in private item --> $DIR/lint-group.rs:19:1 | @@ -29,18 +42,5 @@ LL | #![deny(rustdoc)] = note: `#[deny(intra_doc_link_resolution_failure)]` implied by `#[deny(rustdoc)]` = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` -error: missing code example in this documentation - --> $DIR/lint-group.rs:16:1 - | -LL | /// wait, this doesn't have a doctest? - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: the lint level is defined here - --> $DIR/lint-group.rs:7:9 - | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(missing_doc_code_examples)]` implied by `#[deny(rustdoc)]` - error: aborting due to 3 previous errors -- 2.44.0