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:
parent
6950f68870
commit
2b9076ee19
10 changed files with 97 additions and 8 deletions
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) => {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
18
src/test/auxiliary/issue-22025.rs
Normal file
18
src/test/auxiliary/issue-22025.rs
Normal 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 {}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
15
src/test/rustdoc/issue-22025.rs
Normal file
15
src/test/rustdoc/issue-22025.rs
Normal 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};
|
29
src/test/rustdoc/issue-22038.rs
Normal file
29
src/test/rustdoc/issue-22038.rs
Normal 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() {}
|
Loading…
Add table
Reference in a new issue