From 147d173d02ea030af23fad07c7e99b2900e710f2 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Wed, 8 Feb 2017 21:15:20 +0000 Subject: [PATCH] rustdoc: Show attributes on all item types Currently attributes are only shown for structs, unions and enums but they should be shown for all items. For example it is useful to know if a function is `#[no_mangle]`. --- src/librustdoc/html/render.rs | 20 +++++++++++++++----- src/test/rustdoc/attributes.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/test/rustdoc/attributes.rs diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 40eb7e5ab78c3..fe397e980bdcc 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1936,7 +1936,9 @@ impl<'a> fmt::Display for Initializer<'a> { fn item_constant(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, c: &clean::Constant) -> fmt::Result { - write!(w, "
{vis}const \
+    write!(w, "
")?;
+    render_attributes(w, it)?;
+    write!(w, "{vis}const \
                {name}: {typ}{init}
", vis = VisSpace(&it.visibility), name = it.name.as_ref().unwrap(), @@ -1947,7 +1949,9 @@ fn item_constant(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, fn item_static(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, s: &clean::Static) -> fmt::Result { - write!(w, "
{vis}static {mutability}\
+    write!(w, "
")?;
+    render_attributes(w, it)?;
+    write!(w, "{vis}static {mutability}\
                {name}: {typ}{init}
", vis = VisSpace(&it.visibility), mutability = MutableSpace(s.mutability), @@ -1971,7 +1975,9 @@ fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, AbiSpace(f.abi), it.name.as_ref().unwrap(), f.generics).len(); - write!(w, "
{vis}{constness}{unsafety}{abi}fn \
+    write!(w, "
")?;
+    render_attributes(w, it)?;
+    write!(w, "{vis}{constness}{unsafety}{abi}fn \
                {name}{generics}{decl}{where_clause}
", vis = VisSpace(&it.visibility), constness = ConstnessSpace(vis_constness), @@ -2006,7 +2012,9 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, } // Output the trait definition - write!(w, "
{}{}trait {}{}{}{} ",
+    write!(w, "
")?;
+    render_attributes(w, it)?;
+    write!(w, "{}{}trait {}{}{}{} ",
            VisSpace(&it.visibility),
            UnsafetySpace(t.unsafety),
            it.name.as_ref().unwrap(),
@@ -2987,7 +2995,9 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
 fn item_typedef(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
                 t: &clean::Typedef) -> fmt::Result {
     let indent = format!("type {}{:#} ", it.name.as_ref().unwrap(), t.generics).len();
-    write!(w, "
type {}{}{where_clause} = {type_};
", + write!(w, "
")?;
+    render_attributes(w, it)?;
+    write!(w, "type {}{}{where_clause} = {type_};
", it.name.as_ref().unwrap(), t.generics, where_clause = WhereClause(&t.generics, indent), diff --git a/src/test/rustdoc/attributes.rs b/src/test/rustdoc/attributes.rs new file mode 100644 index 0000000000000..22e509001137e --- /dev/null +++ b/src/test/rustdoc/attributes.rs @@ -0,0 +1,27 @@ +// Copyright 2017 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. + +#![crate_name = "foo"] + +// @has foo/fn.f.html '//*[@class="docblock attributes"]' '#[no_mangle]' +#[no_mangle] +pub extern "C" fn f() {} + +// @has foo/fn.g.html '//*[@class="docblock attributes"]' '#[export_name = "bar"]' +#[export_name = "bar"] +pub extern "C" fn g() {} + +// @has foo/enum.Foo.html '//*[@class="docblock attributes"]' '#[repr(i64)]' +// @has foo/enum.Foo.html '//*[@class="docblock attributes"]' '#[must_use]' +#[repr(i64)] +#[must_use] +pub enum Foo { + Bar, +}