about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2020-02-17 13:53:27 +0100
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2020-03-02 13:19:10 +0100
commitf1070b152546827e599cdee1f64c55faaf8bf082 (patch)
tree9c71ce5bf54bdeabffcc1c96a97d9aebd0747697
parent15babed8b7936e03ed4cd57afd5c91c44dc4f0be (diff)
downloadrust-f1070b152546827e599cdee1f64c55faaf8bf082.tar.gz
rust-f1070b152546827e599cdee1f64c55faaf8bf082.zip
Replace ToJson with serde
-rw-r--r--src/librustdoc/config.rs16
-rw-r--r--src/librustdoc/passes/calculate_doc_coverage.rs90
-rw-r--r--src/test/rustdoc-ui/coverage/html.rs4
-rw-r--r--src/test/rustdoc-ui/coverage/html.stderr2
-rw-r--r--src/test/rustdoc-ui/coverage/json.rs2
-rw-r--r--src/test/rustdoc-ui/coverage/json.stdout8
-rw-r--r--src/test/rustdoc-ui/coverage/output-format-fail-check.rs (renamed from src/test/rustdoc/output-format-fail-check.rs)1
-rw-r--r--src/test/rustdoc-ui/coverage/output-format-fail-check.stderr6
8 files changed, 51 insertions, 78 deletions
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs
index 99a55f3c682..58c8a7d82bf 100644
--- a/src/librustdoc/config.rs
+++ b/src/librustdoc/config.rs
@@ -1,6 +1,6 @@
 use std::collections::BTreeMap;
-use std::ffi::OsStr;
 use std::convert::TryFrom;
+use std::ffi::OsStr;
 use std::fmt;
 use std::path::PathBuf;
 
@@ -28,12 +28,12 @@ use crate::theme;
 #[derive(Clone, Copy, PartialEq, Eq, Debug)]
 pub enum OutputFormat {
     Json,
-    HTML,
+    Html,
 }
 
 impl OutputFormat {
     pub fn is_json(&self) -> bool {
-        match *self {
+        match self {
             OutputFormat::Json => true,
             _ => false,
         }
@@ -46,7 +46,7 @@ impl TryFrom<&str> for OutputFormat {
     fn try_from(value: &str) -> Result<Self, Self::Error> {
         match value {
             "json" => Ok(OutputFormat::Json),
-            "html" => Ok(OutputFormat::HTML),
+            "html" => Ok(OutputFormat::Html),
             _ => Err(format!("unknown output format `{}`", value)),
         }
     }
@@ -498,6 +498,12 @@ impl Options {
                         diag.struct_err("json output format isn't supported for doc generation")
                             .emit();
                         return Err(1);
+                    } else if !o.is_json() && show_coverage {
+                        diag.struct_err(
+                            "html output format isn't supported for the --show-coverage option",
+                        )
+                        .emit();
+                        return Err(1);
                     }
                     Some(o)
                 }
@@ -505,7 +511,7 @@ impl Options {
                     diag.struct_err(&e).emit();
                     return Err(1);
                 }
-            }
+            },
             None => None,
         };
         let crate_name = matches.opt_str("crate-name");
diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs
index 0ca5a956bdb..f48224512ba 100644
--- a/src/librustdoc/passes/calculate_doc_coverage.rs
+++ b/src/librustdoc/passes/calculate_doc_coverage.rs
@@ -7,7 +7,8 @@ use crate::passes::Pass;
 use rustc_ast::attr;
 use rustc_span::symbol::sym;
 use rustc_span::FileName;
-use serialize::json::{ToJson, Json};
+use serde::Serialize;
+use serde_json;
 
 use std::collections::BTreeMap;
 use std::ops;
@@ -18,16 +19,16 @@ pub const CALCULATE_DOC_COVERAGE: Pass = Pass {
     description: "counts the number of items with and without documentation",
 };
 
-fn calculate_doc_coverage( krate: clean::Crate, ctx: &DocContext<'_>) -> clean::Crate {
-    let mut calc = CoverageCalculator::new(ctx.renderinfo.borrow().output_format);
+fn calculate_doc_coverage(krate: clean::Crate, ctx: &DocContext<'_>) -> clean::Crate {
+    let mut calc = CoverageCalculator::new();
     let krate = calc.fold_crate(krate);
 
-    calc.print_results();
+    calc.print_results(ctx.renderinfo.borrow().output_format);
 
     krate
 }
 
-#[derive(Default, Copy, Clone)]
+#[derive(Default, Copy, Clone, Serialize)]
 struct ItemCount {
     total: u64,
     with_docs: u64,
@@ -68,68 +69,37 @@ impl ops::AddAssign for ItemCount {
 
 struct CoverageCalculator {
     items: BTreeMap<FileName, ItemCount>,
-    output_format: Option<OutputFormat>,
 }
 
 fn limit_filename_len(filename: String) -> String {
-    // if a filename is too long, shorten it so we don't blow out the table
-    // FIXME(misdreavus): this needs to count graphemes, and probably also track
-    // double-wide characters...
-    if filename.len() > 35 {
-        "...".to_string() + &filename[filename.len() - 32..]
+    let nb_chars = filename.chars().count();
+    if nb_chars > 35 {
+        "...".to_string()
+            + &filename[filename.char_indices().nth(nb_chars - 32).map(|x| x.0).unwrap_or(0)..]
     } else {
         filename
     }
 }
 
-impl ToJson for CoverageCalculator {
-    fn to_json(&self) -> Json {
-        let mut total = ItemCount::default();
-        let mut entries = BTreeMap::default();
-
-        entries.insert("files".to_owned(), Json::Array(self.items
-            .iter()
-            .filter_map(|(file, &count)| {
-                count.percentage().map(|percent| {
-                    (limit_filename_len(file.to_string()), count, percent)
-                })
-            })
-            .map(|(name, count, percentage)| {
-                let mut fields = BTreeMap::default();
-
-                fields.insert("documented".to_owned(), Json::U64(count.with_docs));
-                fields.insert("total".to_owned(), Json::U64(count.total));
-                fields.insert("percentage".to_owned(), Json::F64(percentage));
-
-                total += count;
-
-                let mut obj = BTreeMap::default();
-                obj.insert(name, Json::Object(fields));
-
-                Json::Object(obj)
-            })
-            .collect::<Vec<_>>()));
-        let mut fields = BTreeMap::default();
-        fields.insert("documented".to_owned(), Json::U64(total.with_docs));
-        fields.insert("total".to_owned(), Json::U64(total.total));
-        fields.insert("percentage".to_owned(), Json::F64(total.percentage().unwrap_or(0.0)));
-
-        entries.insert("total".to_owned(), Json::Object(fields));
-        Json::Object(entries)
+impl CoverageCalculator {
+    fn new() -> CoverageCalculator {
+        CoverageCalculator { items: Default::default() }
     }
-}
 
-impl CoverageCalculator {
-    fn new(output_format: Option<OutputFormat>) -> CoverageCalculator {
-        CoverageCalculator {
-            items: Default::default(),
-            output_format,
-        }
+    fn to_json(&self) -> String {
+        serde_json::to_string(
+            &self
+                .items
+                .iter()
+                .map(|(k, v)| (k.to_string(), v))
+                .collect::<BTreeMap<String, &ItemCount>>(),
+        )
+        .expect("failed to convert JSON data to string")
     }
 
-    fn print_results(&self) {
-        if self.output_format.map(|o| o.is_json()).unwrap_or_else(|| false) {
-            println!("{}", self.to_json().pretty());
+    fn print_results(&self, output_format: Option<OutputFormat>) {
+        if output_format.map(|o| o.is_json()).unwrap_or_else(|| false) {
+            println!("{}", self.to_json());
             return;
         }
         let mut total = ItemCount::default();
@@ -154,15 +124,7 @@ impl CoverageCalculator {
 
         for (file, &count) in &self.items {
             if let Some(percentage) = count.percentage() {
-                let mut name = file.to_string();
-                // if a filename is too long, shorten it so we don't blow out the table
-                // FIXME(misdreavus): this needs to count graphemes, and probably also track
-                // double-wide characters...
-                if name.len() > 35 {
-                    name = "...".to_string() + &name[name.len() - 32..];
-                }
-
-                print_table_record(&name, count, percentage);
+                print_table_record(&limit_filename_len(file.to_string()), count, percentage);
 
                 total += count;
             }
diff --git a/src/test/rustdoc-ui/coverage/html.rs b/src/test/rustdoc-ui/coverage/html.rs
new file mode 100644
index 00000000000..181cb4c5061
--- /dev/null
+++ b/src/test/rustdoc-ui/coverage/html.rs
@@ -0,0 +1,4 @@
+// compile-flags:-Z unstable-options --output-format html --show-coverage
+
+/// Foo
+pub struct Xo;
diff --git a/src/test/rustdoc-ui/coverage/html.stderr b/src/test/rustdoc-ui/coverage/html.stderr
new file mode 100644
index 00000000000..adca375d4bc
--- /dev/null
+++ b/src/test/rustdoc-ui/coverage/html.stderr
@@ -0,0 +1,2 @@
+error: html output format isn't supported for the --show-coverage option
+
diff --git a/src/test/rustdoc-ui/coverage/json.rs b/src/test/rustdoc-ui/coverage/json.rs
index 8b80244f825..b1220b32e91 100644
--- a/src/test/rustdoc-ui/coverage/json.rs
+++ b/src/test/rustdoc-ui/coverage/json.rs
@@ -1,5 +1,5 @@
 // build-pass
-// compile-flags:-Z unstable-options --show-coverage
+// compile-flags:-Z unstable-options --output-format json --show-coverage
 
 pub mod foo {
     /// Hello!
diff --git a/src/test/rustdoc-ui/coverage/json.stdout b/src/test/rustdoc-ui/coverage/json.stdout
index be56a8c0ffa..63b22a7d94b 100644
--- a/src/test/rustdoc-ui/coverage/json.stdout
+++ b/src/test/rustdoc-ui/coverage/json.stdout
@@ -1,7 +1 @@
-+-------------------------------------+------------+------------+------------+
-| File                                | Documented |      Total | Percentage |
-+-------------------------------------+------------+------------+------------+
-| ...test/rustdoc-ui/coverage/json.rs |          7 |         13 |      53.8% |
-+-------------------------------------+------------+------------+------------+
-| Total                               |          7 |         13 |      53.8% |
-+-------------------------------------+------------+------------+------------+
+{"$DIR/json.rs":{"total":13,"with_docs":7}}
diff --git a/src/test/rustdoc/output-format-fail-check.rs b/src/test/rustdoc-ui/coverage/output-format-fail-check.rs
index a78811078be..30b525df763 100644
--- a/src/test/rustdoc/output-format-fail-check.rs
+++ b/src/test/rustdoc-ui/coverage/output-format-fail-check.rs
@@ -1,5 +1,4 @@
 // compile-flags:-Z unstable-options --output-format
-// should-fail
 
 /// toudoum!
 pub struct SomeStruct;
diff --git a/src/test/rustdoc-ui/coverage/output-format-fail-check.stderr b/src/test/rustdoc-ui/coverage/output-format-fail-check.stderr
new file mode 100644
index 00000000000..9e9aa0e0501
--- /dev/null
+++ b/src/test/rustdoc-ui/coverage/output-format-fail-check.stderr
@@ -0,0 +1,6 @@
+warning: the 'output-format' flag is considered deprecated
+   |
+   = warning: see issue #44136 <https://github.com/rust-lang/rust/issues/44136> for more information
+
+error: too many file operands
+