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
This commit is contained in:
Alex Crichton 2015-04-07 14:22:55 -07:00
parent 6950f68870
commit 2b9076ee19
10 changed files with 97 additions and 8 deletions

View File

@ -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,
}
}

View File

@ -1054,6 +1054,7 @@ pub struct Function {
pub decl: FnDecl,
pub generics: Generics,
pub unsafety: ast::Unsafety,
pub abi: abi::Abi
}
impl Clean<Item> for doctree::Function {
@ -1069,6 +1070,7 @@ impl Clean<Item> 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<ViewListIdent> for ast::PathListItem {
impl Clean<Vec<Item>> for ast::ForeignMod {
fn clean(&self, cx: &DocContext) -> Vec<Item> {
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<Item> for ast::ForeignItem {
decl: decl.clean(cx),
generics: generics.clean(cx),
unsafety: ast::Unsafety::Unsafe,
abi: abi::Rust,
})
}
ast::ForeignItemStatic(ref ty, mutbl) => {

View File

@ -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 {

View File

@ -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<ast::Visibility> {
@ -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;

View File

@ -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, "<pre class='rust fn'>{vis}{unsafety}fn \
try!(write!(w, "<pre class='rust fn'>{vis}{unsafety}{abi}fn \
{name}{generics}{decl}{where_clause}</pre>",
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),

View File

@ -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,
}
}

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 {}
}

View File

@ -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);
}

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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};

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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() {}