From 47e294e75860e74f8bea81f7b90bc40b931a25f5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 1 Dec 2018 14:46:25 +0100 Subject: [PATCH] check missing docs for reexported macros as well --- src/librustc_lint/builtin.rs | 49 +++++++++++-------- src/libstd/macros.rs | 1 + .../rustdoc-ui/deny-missing-docs-crate.rs | 13 +++++ .../rustdoc-ui/deny-missing-docs-crate.stderr | 22 +++++++++ .../rustdoc-ui/deny-missing-docs-macro.rs | 18 +++++++ .../rustdoc-ui/deny-missing-docs-macro.stderr | 14 ++++++ 6 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 src/test/rustdoc-ui/deny-missing-docs-crate.rs create mode 100644 src/test/rustdoc-ui/deny-missing-docs-crate.stderr create mode 100644 src/test/rustdoc-ui/deny-missing-docs-macro.rs create mode 100644 src/test/rustdoc-ui/deny-missing-docs-macro.stderr diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index a555b7790971f..5678f30dabccd 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -297,6 +297,26 @@ pub struct MissingDoc { private_traits: FxHashSet, } +fn has_doc(attr: &ast::Attribute) -> bool { + if !attr.check_name("doc") { + return false; + } + + if attr.is_value_str() { + return true; + } + + if let Some(list) = attr.meta_item_list() { + for meta in list { + if meta.check_name("include") || meta.check_name("hidden") { + return true; + } + } + } + + false +} + impl MissingDoc { pub fn new() -> MissingDoc { MissingDoc { @@ -335,26 +355,6 @@ impl MissingDoc { } } - fn has_doc(attr: &ast::Attribute) -> bool { - if !attr.check_name("doc") { - return false; - } - - if attr.is_value_str() { - return true; - } - - if let Some(list) = attr.meta_item_list() { - for meta in list { - if meta.check_name("include") { - return true; - } - } - } - - false - } - let has_doc = attrs.iter().any(|a| has_doc(a)); if !has_doc { cx.span_lint(MISSING_DOCS, @@ -389,6 +389,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc { fn check_crate(&mut self, cx: &LateContext, krate: &hir::Crate) { self.check_missing_docs_attrs(cx, None, &krate.attrs, krate.span, "crate"); + + for macro_def in &krate.exported_macros { + let has_doc = macro_def.attrs.iter().any(|a| has_doc(a)); + if !has_doc { + cx.span_lint(MISSING_DOCS, + cx.tcx.sess.source_map().def_span(macro_def.span), + "missing documentation for macro"); + } + } } fn check_item(&mut self, cx: &LateContext, it: &hir::Item) { diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index c92365df03a8e..b87257188df10 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -322,6 +322,7 @@ macro_rules! dbg { } } +/// A macro to await on an async call. #[macro_export] #[unstable(feature = "await_macro", issue = "50547")] #[allow_internal_unstable] diff --git a/src/test/rustdoc-ui/deny-missing-docs-crate.rs b/src/test/rustdoc-ui/deny-missing-docs-crate.rs new file mode 100644 index 0000000000000..910c99314e49b --- /dev/null +++ b/src/test/rustdoc-ui/deny-missing-docs-crate.rs @@ -0,0 +1,13 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![deny(missing_docs)] //~ ERROR + +pub struct Foo; //~ ERROR diff --git a/src/test/rustdoc-ui/deny-missing-docs-crate.stderr b/src/test/rustdoc-ui/deny-missing-docs-crate.stderr new file mode 100644 index 0000000000000..7f0590e0b229b --- /dev/null +++ b/src/test/rustdoc-ui/deny-missing-docs-crate.stderr @@ -0,0 +1,22 @@ +error: missing documentation for crate + --> $DIR/deny-missing-docs-crate.rs:11:1 + | +LL | / #![deny(missing_docs)] //~ ERROR +LL | | +LL | | pub struct Foo; //~ ERROR + | |_______________^ + | +note: lint level defined here + --> $DIR/deny-missing-docs-crate.rs:11:9 + | +LL | #![deny(missing_docs)] //~ ERROR + | ^^^^^^^^^^^^ + +error: missing documentation for a struct + --> $DIR/deny-missing-docs-crate.rs:13:1 + | +LL | pub struct Foo; //~ ERROR + | ^^^^^^^^^^^^^^^ + +error: Compilation failed, aborting rustdoc + diff --git a/src/test/rustdoc-ui/deny-missing-docs-macro.rs b/src/test/rustdoc-ui/deny-missing-docs-macro.rs new file mode 100644 index 0000000000000..a12fe17e0cb61 --- /dev/null +++ b/src/test/rustdoc-ui/deny-missing-docs-macro.rs @@ -0,0 +1,18 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! foo + +#![deny(missing_docs)] + +#[macro_export] +macro_rules! foo { //~ ERROR + () => {} +} diff --git a/src/test/rustdoc-ui/deny-missing-docs-macro.stderr b/src/test/rustdoc-ui/deny-missing-docs-macro.stderr new file mode 100644 index 0000000000000..686a45030e6ca --- /dev/null +++ b/src/test/rustdoc-ui/deny-missing-docs-macro.stderr @@ -0,0 +1,14 @@ +error: missing documentation for macro + --> $DIR/deny-missing-docs-macro.rs:16:1 + | +LL | macro_rules! foo { //~ ERROR + | ^^^^^^^^^^^^^^^^ + | +note: lint level defined here + --> $DIR/deny-missing-docs-macro.rs:13:9 + | +LL | #![deny(missing_docs)] + | ^^^^^^^^^^^^ + +error: Compilation failed, aborting rustdoc +