Skip to content

Commit

Permalink
expose #[target_feature] attributes in rustdoc
Browse files Browse the repository at this point in the history
  • Loading branch information
QuietMisdreavus committed Mar 14, 2018
1 parent d089fe9 commit 017bfc3
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
40 changes: 38 additions & 2 deletions src/librustdoc/clean/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = Html(self).to_string();
let mut msg = ShortHtml(self).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();
Expand All @@ -149,7 +149,13 @@ impl Cfg {

/// Renders the configuration for long display, as a long HTML description.
pub(crate) fn render_long_html(&self) -> String {
let mut msg = format!("This is supported on <strong>{}</strong>", Html(self));
let on = if self.should_use_with_in_description() {
"with"
} else {
"on"
};

let mut msg = format!("This is supported {} <strong>{}</strong>", on, Html(self));
if self.should_append_only_to_description() {
msg.push_str(" only");
}
Expand Down Expand Up @@ -180,6 +186,13 @@ impl Cfg {
}
}
}

fn should_use_with_in_description(&self) -> bool {
match *self {
Cfg::Cfg(ref name, _) if name == &"target_feature" => true,
_ => false,
}
}
}

impl ops::Not for Cfg {
Expand Down Expand Up @@ -376,6 +389,8 @@ 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 !human_readable.is_empty() {
Expand All @@ -390,6 +405,19 @@ 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;
Expand Down Expand Up @@ -824,6 +852,10 @@ mod test {
).render_short_html(),
"(Debug-assertions enabled or Windows) and Unix"
);
assert_eq!(
name_value_cfg("target_feature", "sse2").render_short_html(),
"<code>sse2</code>"
);
})
}

Expand Down Expand Up @@ -898,6 +930,10 @@ mod test {
"This is supported on <strong>(debug-assertions enabled or Windows) and Unix\
</strong> only."
);
assert_eq!(
name_value_cfg("target_feature", "sse2").render_long_html(),
"This is supported with <strong>target feature <code>sse2</code></strong> only."
);
})
}
}
13 changes: 13 additions & 0 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,19 @@ impl Attributes {
})
}).collect();

// treat #[target_feature(enable = "feat")] attributes as if they were
// #[doc(cfg(target_feature = "feat"))] attributes as well
for attr in attrs.lists("target_feature") {
if attr.check_name("enable") {
if let Some(feat) = attr.value_str() {
let meta = attr::mk_name_value_item_str("target_feature".into(), feat);
if let Ok(feat_cfg) = Cfg::parse(&meta) {
cfg &= feat_cfg;
}
}
}
}

Attributes {
doc_strings,
other_attrs,
Expand Down

0 comments on commit 017bfc3

Please sign in to comment.