From 02e6b861eb04737915636a63eec00ef126f59dd5 Mon Sep 17 00:00:00 2001
From: Roman <romaaan.git@gmail.com>
Date: Tue, 1 Sep 2020 14:19:24 +0200
Subject: [PATCH] rustdoc: skip allow missing doc in cover. report

During the document coverage reporting with
```bash
rustdoc something.rs -Z unstable-options --show-coverage
```

the coverage report also includes parts of the code that are marked
with `#[allow(missing_docs)]`, which outputs lower numbers in the
coverage report even though these parts should be ignored for the
calculation.

Co-authored-by: Joshua Nelson <joshua@yottadb.com>
---
 .../passes/calculate_doc_coverage.rs          | 21 +++++++++++--
 .../rustdoc-ui/coverage/allow_missing_docs.rs | 31 +++++++++++++++++++
 .../coverage/allow_missing_docs.stdout        |  7 +++++
 3 files changed, 57 insertions(+), 2 deletions(-)
 create mode 100644 src/test/rustdoc-ui/coverage/allow_missing_docs.rs
 create mode 100644 src/test/rustdoc-ui/coverage/allow_missing_docs.stdout

diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs
index 4bca3996eb4..30dd8def70e 100644
--- a/src/librustdoc/passes/calculate_doc_coverage.rs
+++ b/src/librustdoc/passes/calculate_doc_coverage.rs
@@ -5,7 +5,7 @@ use crate::fold::{self, DocFolder};
 use crate::html::markdown::{find_testable_code, ErrorCodes};
 use crate::passes::doc_test_lints::{should_have_doc_example, Tests};
 use crate::passes::Pass;
-use rustc_span::symbol::sym;
+use rustc_span::symbol::{sym, Ident};
 use rustc_span::FileName;
 use serde::Serialize;
 
@@ -41,8 +41,11 @@ impl ItemCount {
         has_docs: bool,
         has_doc_example: bool,
         should_have_doc_examples: bool,
+        should_have_docs: bool,
     ) {
-        self.total += 1;
+        if has_docs || should_have_docs {
+            self.total += 1;
+        }
 
         if has_docs {
             self.with_docs += 1;
@@ -229,6 +232,15 @@ impl fold::DocFolder for CoverageCalculator {
             }
             _ => {
                 let has_docs = !i.attrs.doc_strings.is_empty();
+                let should_have_docs = !i.attrs.other_attrs.iter().any(|a| {
+                    a.has_name(sym::allow)
+                        && a.meta_item_list().iter().any(|meta_list_item| {
+                            meta_list_item.iter().any(|li| match li.ident() {
+                                Some(ident) => ident == Ident::from_str("missing_docs"),
+                                _ => false,
+                            })
+                        })
+                });
                 let mut tests = Tests { found_tests: 0 };
 
                 find_testable_code(
@@ -250,7 +262,12 @@ impl fold::DocFolder for CoverageCalculator {
                     has_docs,
                     has_doc_example,
                     should_have_doc_example(&i.inner),
+                    should_have_docs,
                 );
+
+                if !should_have_docs {
+                    return Some(i);
+                }
             }
         }
 
diff --git a/src/test/rustdoc-ui/coverage/allow_missing_docs.rs b/src/test/rustdoc-ui/coverage/allow_missing_docs.rs
new file mode 100644
index 00000000000..8c076761ede
--- /dev/null
+++ b/src/test/rustdoc-ui/coverage/allow_missing_docs.rs
@@ -0,0 +1,31 @@
+// compile-flags:-Z unstable-options --show-coverage
+// check-pass
+
+//! Make sure to have some docs on your crate root
+
+#[allow(missing_docs)]
+pub mod mod_foo {
+    pub struct Bar;
+}
+
+/// This is a struct with a `#[allow(missing_docs)]`
+pub struct AllowTheMissingDocs {
+    #[allow(missing_docs)]
+    pub empty_str: String,
+
+    /// This has
+    #[allow(missing_docs)]
+    /// but also has documentation comments
+    pub hello: usize,
+
+    /// The doc id just to create a boilerplate comment
+    pub doc_id: Vec<u8>,
+}
+
+/// A function that has a documentation
+pub fn this_is_func() {}
+
+#[allow(missing_docs)]
+pub struct DemoStruct {
+    something: usize,
+}
diff --git a/src/test/rustdoc-ui/coverage/allow_missing_docs.stdout b/src/test/rustdoc-ui/coverage/allow_missing_docs.stdout
new file mode 100644
index 00000000000..ea5380e3204
--- /dev/null
+++ b/src/test/rustdoc-ui/coverage/allow_missing_docs.stdout
@@ -0,0 +1,7 @@
++-------------------------------------+------------+------------+------------+------------+
+| File                                | Documented | Percentage |   Examples | Percentage |
++-------------------------------------+------------+------------+------------+------------+
+| ...i/coverage/allow_missing_docs.rs |          5 |     100.0% |          0 |       0.0% |
++-------------------------------------+------------+------------+------------+------------+
+| Total                               |          5 |     100.0% |          0 |       0.0% |
++-------------------------------------+------------+------------+------------+------------+