From 2b9076ee19da12e3a70bdb2c630e55f8395173d2 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 7 Apr 2015 14:22:55 -0700 Subject: [PATCH] rustdoc: Encode ABI in all methods This commit ensures that the ABI of functions is propagated all the way through to the documentation. Closes #22038 --- src/librustdoc/clean/inline.rs | 5 +++-- src/librustdoc/clean/mod.rs | 12 +++++++++++- src/librustdoc/doctree.rs | 2 ++ src/librustdoc/html/format.rs | 12 ++++++++++++ src/librustdoc/html/render.rs | 5 +++-- src/librustdoc/visit_ast.rs | 3 ++- src/test/auxiliary/issue-22025.rs | 18 ++++++++++++++++++ src/test/rustdoc/ffi.rs | 4 ++-- src/test/rustdoc/issue-22025.rs | 15 +++++++++++++++ src/test/rustdoc/issue-22038.rs | 29 +++++++++++++++++++++++++++++ 10 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/test/auxiliary/issue-22025.rs create mode 100644 src/test/rustdoc/issue-22025.rs create mode 100644 src/test/rustdoc/issue-22038.rs diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 24184bae95b..4237eb68d28 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -163,8 +163,8 @@ pub fn build_external_trait(cx: &DocContext, tcx: &ty::ctxt, fn build_external_function(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> clean::Function { let t = ty::lookup_item_type(tcx, did); - let (decl, style) = match t.ty.sty { - ty::ty_bare_fn(_, ref f) => ((did, &f.sig).clean(cx), f.unsafety), + let (decl, style, abi) = match t.ty.sty { + ty::ty_bare_fn(_, ref f) => ((did, &f.sig).clean(cx), f.unsafety, f.abi), _ => panic!("bad function"), }; let predicates = ty::lookup_predicates(tcx, did); @@ -172,6 +172,7 @@ fn build_external_function(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> decl: decl, generics: (&t.generics, &predicates, subst::FnSpace).clean(cx), unsafety: style, + abi: abi, } } diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 6c243a5d795..6c59205cd3e 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -1054,6 +1054,7 @@ pub struct Function { pub decl: FnDecl, pub generics: Generics, pub unsafety: ast::Unsafety, + pub abi: abi::Abi } impl Clean for doctree::Function { @@ -1069,6 +1070,7 @@ impl Clean for doctree::Function { decl: self.decl.clean(cx), generics: self.generics.clean(cx), unsafety: self.unsafety, + abi: self.abi, }), } } @@ -2316,7 +2318,14 @@ impl Clean for ast::PathListItem { impl Clean> for ast::ForeignMod { fn clean(&self, cx: &DocContext) -> Vec { - self.items.clean(cx) + let mut items = self.items.clean(cx); + for item in &mut items { + match item.inner { + ForeignFunctionItem(ref mut f) => f.abi = self.abi, + _ => {} + } + } + items } } @@ -2328,6 +2337,7 @@ impl Clean for ast::ForeignItem { decl: decl.clean(cx), generics: generics.clean(cx), unsafety: ast::Unsafety::Unsafe, + abi: abi::Rust, }) } ast::ForeignItemStatic(ref ty, mutbl) => { diff --git a/src/librustdoc/doctree.rs b/src/librustdoc/doctree.rs index c6d8b9428c5..862bca1b813 100644 --- a/src/librustdoc/doctree.rs +++ b/src/librustdoc/doctree.rs @@ -15,6 +15,7 @@ pub use self::TypeBound::*; use syntax; use syntax::codemap::Span; +use syntax::abi; use syntax::ast; use syntax::attr; use syntax::ast::{Ident, NodeId}; @@ -134,6 +135,7 @@ pub struct Function { pub unsafety: ast::Unsafety, pub whence: Span, pub generics: ast::Generics, + pub abi: abi::Abi, } pub struct Typedef { diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index ae9d9761001..f6215dcb00c 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -18,6 +18,7 @@ use std::fmt; use std::iter::repeat; +use syntax::abi::Abi; use syntax::ast; use syntax::ast_util; @@ -54,6 +55,7 @@ pub struct WhereClause<'a>(pub &'a clean::Generics); pub struct TyParamBounds<'a>(pub &'a [clean::TyParamBound]); /// Wrapper struct for emitting a comma-separated list of items pub struct CommaSep<'a, T: 'a>(pub &'a [T]); +pub struct AbiSpace(pub Abi); impl VisSpace { pub fn get(&self) -> Option { @@ -691,6 +693,16 @@ impl fmt::Display for RawMutableSpace { } } +impl fmt::Display for AbiSpace { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self.0 { + Abi::Rust => Ok(()), + Abi::C => write!(f, "extern "), + abi => write!(f, "extern {} ", abi), + } + } +} + impl<'a> fmt::Display for Stability<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let Stability(stab) = *self; diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 92fe5b019db..a1ec58cd3dd 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -62,7 +62,7 @@ use clean; use doctree; use fold::DocFolder; use html::format::{VisSpace, Method, UnsafetySpace, MutableSpace, Stability}; -use html::format::{ConciseStability, TyParamBounds, WhereClause, href}; +use html::format::{ConciseStability, TyParamBounds, WhereClause, href, AbiSpace}; use html::highlight; use html::item_type::ItemType; use html::layout; @@ -1746,10 +1746,11 @@ fn item_static(w: &mut fmt::Formatter, it: &clean::Item, fn item_function(w: &mut fmt::Formatter, it: &clean::Item, f: &clean::Function) -> fmt::Result { - try!(write!(w, "
{vis}{unsafety}fn \
+    try!(write!(w, "
{vis}{unsafety}{abi}fn \
                     {name}{generics}{decl}{where_clause}
", vis = VisSpace(it.visibility), unsafety = UnsafetySpace(f.unsafety), + abi = AbiSpace(f.abi), name = it.name.as_ref().unwrap(), generics = f.generics, where_clause = WhereClause(&f.generics), diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 6ed6626d64c..a1fa96322a4 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -123,7 +123,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { pub fn visit_fn(&mut self, item: &ast::Item, name: ast::Ident, fd: &ast::FnDecl, - unsafety: &ast::Unsafety, _abi: &abi::Abi, + unsafety: &ast::Unsafety, abi: &abi::Abi, gen: &ast::Generics) -> Function { debug!("Visiting fn"); Function { @@ -136,6 +136,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { whence: item.span, generics: gen.clone(), unsafety: *unsafety, + abi: *abi, } } diff --git a/src/test/auxiliary/issue-22025.rs b/src/test/auxiliary/issue-22025.rs new file mode 100644 index 00000000000..554b580ae2b --- /dev/null +++ b/src/test/auxiliary/issue-22025.rs @@ -0,0 +1,18 @@ +// Copyright 2015 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. + +pub mod foo { + + pub trait Foo {} + pub struct Bar; + + impl Foo for Bar {} + +} diff --git a/src/test/rustdoc/ffi.rs b/src/test/rustdoc/ffi.rs index a720e39497d..8ccc6a0f2fb 100644 --- a/src/test/rustdoc/ffi.rs +++ b/src/test/rustdoc/ffi.rs @@ -12,10 +12,10 @@ extern crate rustdoc_ffi as lib; -// @has ffi/fn.foreigner.html //pre 'pub unsafe fn foreigner(cold_as_ice: u32)' +// @has ffi/fn.foreigner.html //pre 'pub unsafe extern fn foreigner(cold_as_ice: u32)' pub use lib::foreigner; extern "C" { - // @has ffi/fn.another.html //pre 'pub unsafe fn another(cold_as_ice: u32)' + // @has ffi/fn.another.html //pre 'pub unsafe extern fn another(cold_as_ice: u32)' pub fn another(cold_as_ice: u32); } diff --git a/src/test/rustdoc/issue-22025.rs b/src/test/rustdoc/issue-22025.rs new file mode 100644 index 00000000000..544dad07cda --- /dev/null +++ b/src/test/rustdoc/issue-22025.rs @@ -0,0 +1,15 @@ +// Copyright 2015 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. + +// aux-build:issue-22025.rs + +extern crate issue_22025; + +pub use issue_22025::foo::{Foo, Bar}; diff --git a/src/test/rustdoc/issue-22038.rs b/src/test/rustdoc/issue-22038.rs new file mode 100644 index 00000000000..6f84428b079 --- /dev/null +++ b/src/test/rustdoc/issue-22038.rs @@ -0,0 +1,29 @@ +// Copyright 2015 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. + +extern { + // @has issue_22038/fn.foo1.html \ + // '//*[@class="rust fn"]' 'pub unsafe extern fn foo1()' + pub fn foo1(); +} + +extern "system" { + // @has issue_22038/fn.foo2.html \ + // '//*[@class="rust fn"]' 'pub unsafe extern "system" fn foo2()' + pub fn foo2(); +} + +// @has issue_22038/fn.bar.html \ +// '//*[@class="rust fn"]' 'pub extern fn bar()' +pub extern fn bar() {} + +// @has issue_22038/fn.baz.html \ +// '//*[@class="rust fn"]' 'pub extern "system" fn baz()' +pub extern "system" fn baz() {}