about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-05-23 00:26:11 +0800
committerGitHub <noreply@github.com>2018-05-23 00:26:11 +0800
commit42b4c49b450decbc68f5caabb8f12a2da0ccccc0 (patch)
tree7d752d4c59f0ab8eccae569bb027cb9c296e2e55 /src
parente7e3261121c2a600da27d89906c8734d8a346852 (diff)
parentd8265621d8d90cc6a37e7322c34e1969db0a26bf (diff)
downloadrust-42b4c49b450decbc68f5caabb8f12a2da0ccccc0.tar.gz
rust-42b4c49b450decbc68f5caabb8f12a2da0ccccc0.zip
Rollup merge of #50875 - QuietMisdreavus:short-features, r=GuillaumeGomez
rustdoc: use "short form" doc(cfg) printing even when combined with other conditionals

Fixes https://github.com/rust-lang/rust/issues/49334

The original "short form" printing was introduced when `target_feature` was added to the `doc(cfg)` handling. However, it didn't properly propagate the "short form" indicator if the cfg was a combination of multiple conditionals, so the linked issue happened. This changes the handling to use a bool in the original `Html` wrapper, rather than a separate wrapper struct that defers to the original one.
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/clean/cfg.rs52
1 files changed, 30 insertions, 22 deletions
diff --git a/src/librustdoc/clean/cfg.rs b/src/librustdoc/clean/cfg.rs
index d5e0f95ddf4..dceb04a7daa 100644
--- a/src/librustdoc/clean/cfg.rs
+++ b/src/librustdoc/clean/cfg.rs
@@ -138,7 +138,7 @@ impl Cfg {
 
     /// Renders the configuration for human display, as a short HTML description.
     pub(crate) fn render_short_html(&self) -> String {
-        let mut msg = ShortHtml(self).to_string();
+        let mut msg = Html(self, true).to_string();
         if self.should_capitalize_first_letter() {
             if let Some(i) = msg.find(|c: char| c.is_ascii_alphanumeric()) {
                 msg[i .. i+1].make_ascii_uppercase();
@@ -155,7 +155,7 @@ impl Cfg {
             "on"
         };
 
-        let mut msg = format!("This is supported {} <strong>{}</strong>", on, Html(self));
+        let mut msg = format!("This is supported {} <strong>{}</strong>", on, Html(self, false));
         if self.should_append_only_to_description() {
             msg.push_str(" only");
         }
@@ -265,7 +265,9 @@ impl ops::BitOr for Cfg {
     }
 }
 
-struct Html<'a>(&'a Cfg);
+/// Pretty-print wrapper for a `Cfg`. Also indicates whether the "short-form" rendering should be
+/// used.
+struct Html<'a>(&'a Cfg, bool);
 
 fn write_with_opt_paren<T: fmt::Display>(
     fmt: &mut fmt::Formatter,
@@ -295,12 +297,12 @@ impl<'a> fmt::Display for Html<'a> {
                     };
                     for (i, sub_cfg) in sub_cfgs.iter().enumerate() {
                         fmt.write_str(if i == 0 { "neither " } else { separator })?;
-                        write_with_opt_paren(fmt, !sub_cfg.is_all(), Html(sub_cfg))?;
+                        write_with_opt_paren(fmt, !sub_cfg.is_all(), Html(sub_cfg, self.1))?;
                     }
                     Ok(())
                 }
-                ref simple @ Cfg::Cfg(..) => write!(fmt, "non-{}", Html(simple)),
-                ref c => write!(fmt, "not ({})", Html(c)),
+                ref simple @ Cfg::Cfg(..) => write!(fmt, "non-{}", Html(simple, self.1)),
+                ref c => write!(fmt, "not ({})", Html(c, self.1)),
             },
 
             Cfg::Any(ref sub_cfgs) => {
@@ -313,7 +315,7 @@ impl<'a> fmt::Display for Html<'a> {
                     if i != 0 {
                         fmt.write_str(separator)?;
                     }
-                    write_with_opt_paren(fmt, !sub_cfg.is_all(), Html(sub_cfg))?;
+                    write_with_opt_paren(fmt, !sub_cfg.is_all(), Html(sub_cfg, self.1))?;
                 }
                 Ok(())
             },
@@ -323,7 +325,7 @@ impl<'a> fmt::Display for Html<'a> {
                     if i != 0 {
                         fmt.write_str(" and ")?;
                     }
-                    write_with_opt_paren(fmt, !sub_cfg.is_simple(), Html(sub_cfg))?;
+                    write_with_opt_paren(fmt, !sub_cfg.is_simple(), Html(sub_cfg, self.1))?;
                 }
                 Ok(())
             },
@@ -390,7 +392,11 @@ impl<'a> fmt::Display for Html<'a> {
                     ("target_endian", Some(endian)) => return write!(fmt, "{}-endian", endian),
                     ("target_pointer_width", Some(bits)) => return write!(fmt, "{}-bit", bits),
                     ("target_feature", Some(feat)) =>
-                        return write!(fmt, "target feature <code>{}</code>", feat),
+                        if self.1 {
+                            return write!(fmt, "<code>{}</code>", feat);
+                        } else {
+                            return write!(fmt, "target feature <code>{}</code>", feat);
+                        },
                     _ => "",
                 };
                 if !human_readable.is_empty() {
@@ -405,19 +411,6 @@ impl<'a> fmt::Display for Html<'a> {
     }
 }
 
-struct ShortHtml<'a>(&'a Cfg);
-
-impl<'a> fmt::Display for ShortHtml<'a> {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-        match *self.0 {
-            Cfg::Cfg(ref name, Some(ref vendor)) if name == &"target_feature" => {
-                write!(fmt, "<code>{}</code>", vendor)
-            },
-            ref cfg => write!(fmt, "{}", Html(cfg)),
-        }
-    }
-}
-
 #[cfg(test)]
 mod test {
     use super::Cfg;
@@ -740,6 +733,13 @@ mod test {
                 name_value_cfg("target_feature", "sse2").render_short_html(),
                 "<code>sse2</code>"
             );
+            assert_eq!(
+                (
+                    name_value_cfg("target_arch", "x86_64") &
+                    name_value_cfg("target_feature", "sse2")
+                ).render_short_html(),
+                "x86-64 and <code>sse2</code>"
+            );
         })
     }
 
@@ -818,6 +818,14 @@ mod test {
                 name_value_cfg("target_feature", "sse2").render_long_html(),
                 "This is supported with <strong>target feature <code>sse2</code></strong> only."
             );
+            assert_eq!(
+                (
+                    name_value_cfg("target_arch", "x86_64") &
+                    name_value_cfg("target_feature", "sse2")
+                ).render_long_html(),
+                "This is supported on <strong>x86-64 and target feature \
+                <code>sse2</code></strong> only."
+            );
         })
     }
 }