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
|
@ -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 {
|
fn build_external_function(cx: &DocContext, tcx: &ty::ctxt, did: ast::DefId) -> clean::Function {
|
||||||
let t = ty::lookup_item_type(tcx, did);
|
let t = ty::lookup_item_type(tcx, did);
|
||||||
let (decl, style) = match t.ty.sty {
|
let (decl, style, abi) = match t.ty.sty {
|
||||||
ty::ty_bare_fn(_, ref f) => ((did, &f.sig).clean(cx), f.unsafety),
|
ty::ty_bare_fn(_, ref f) => ((did, &f.sig).clean(cx), f.unsafety, f.abi),
|
||||||
_ => panic!("bad function"),
|
_ => panic!("bad function"),
|
||||||
};
|
};
|
||||||
let predicates = ty::lookup_predicates(tcx, did);
|
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,
|
decl: decl,
|
||||||
generics: (&t.generics, &predicates, subst::FnSpace).clean(cx),
|
generics: (&t.generics, &predicates, subst::FnSpace).clean(cx),
|
||||||
unsafety: style,
|
unsafety: style,
|
||||||
|
abi: abi,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1054,6 +1054,7 @@ pub struct Function {
|
||||||
pub decl: FnDecl,
|
pub decl: FnDecl,
|
||||||
pub generics: Generics,
|
pub generics: Generics,
|
||||||
pub unsafety: ast::Unsafety,
|
pub unsafety: ast::Unsafety,
|
||||||
|
pub abi: abi::Abi
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Clean<Item> for doctree::Function {
|
impl Clean<Item> for doctree::Function {
|
||||||
|
@ -1069,6 +1070,7 @@ impl Clean<Item> for doctree::Function {
|
||||||
decl: self.decl.clean(cx),
|
decl: self.decl.clean(cx),
|
||||||
generics: self.generics.clean(cx),
|
generics: self.generics.clean(cx),
|
||||||
unsafety: self.unsafety,
|
unsafety: self.unsafety,
|
||||||
|
abi: self.abi,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2316,7 +2318,14 @@ impl Clean<ViewListIdent> for ast::PathListItem {
|
||||||
|
|
||||||
impl Clean<Vec<Item>> for ast::ForeignMod {
|
impl Clean<Vec<Item>> for ast::ForeignMod {
|
||||||
fn clean(&self, cx: &DocContext) -> Vec<Item> {
|
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),
|
decl: decl.clean(cx),
|
||||||
generics: generics.clean(cx),
|
generics: generics.clean(cx),
|
||||||
unsafety: ast::Unsafety::Unsafe,
|
unsafety: ast::Unsafety::Unsafe,
|
||||||
|
abi: abi::Rust,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ast::ForeignItemStatic(ref ty, mutbl) => {
|
ast::ForeignItemStatic(ref ty, mutbl) => {
|
||||||
|
|
|
@ -15,6 +15,7 @@ pub use self::TypeBound::*;
|
||||||
|
|
||||||
use syntax;
|
use syntax;
|
||||||
use syntax::codemap::Span;
|
use syntax::codemap::Span;
|
||||||
|
use syntax::abi;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use syntax::attr;
|
use syntax::attr;
|
||||||
use syntax::ast::{Ident, NodeId};
|
use syntax::ast::{Ident, NodeId};
|
||||||
|
@ -134,6 +135,7 @@ pub struct Function {
|
||||||
pub unsafety: ast::Unsafety,
|
pub unsafety: ast::Unsafety,
|
||||||
pub whence: Span,
|
pub whence: Span,
|
||||||
pub generics: ast::Generics,
|
pub generics: ast::Generics,
|
||||||
|
pub abi: abi::Abi,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Typedef {
|
pub struct Typedef {
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter::repeat;
|
use std::iter::repeat;
|
||||||
|
|
||||||
|
use syntax::abi::Abi;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use syntax::ast_util;
|
use syntax::ast_util;
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@ pub struct WhereClause<'a>(pub &'a clean::Generics);
|
||||||
pub struct TyParamBounds<'a>(pub &'a [clean::TyParamBound]);
|
pub struct TyParamBounds<'a>(pub &'a [clean::TyParamBound]);
|
||||||
/// Wrapper struct for emitting a comma-separated list of items
|
/// Wrapper struct for emitting a comma-separated list of items
|
||||||
pub struct CommaSep<'a, T: 'a>(pub &'a [T]);
|
pub struct CommaSep<'a, T: 'a>(pub &'a [T]);
|
||||||
|
pub struct AbiSpace(pub Abi);
|
||||||
|
|
||||||
impl VisSpace {
|
impl VisSpace {
|
||||||
pub fn get(&self) -> Option<ast::Visibility> {
|
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> {
|
impl<'a> fmt::Display for Stability<'a> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
let Stability(stab) = *self;
|
let Stability(stab) = *self;
|
||||||
|
|
|
@ -62,7 +62,7 @@ use clean;
|
||||||
use doctree;
|
use doctree;
|
||||||
use fold::DocFolder;
|
use fold::DocFolder;
|
||||||
use html::format::{VisSpace, Method, UnsafetySpace, MutableSpace, Stability};
|
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::highlight;
|
||||||
use html::item_type::ItemType;
|
use html::item_type::ItemType;
|
||||||
use html::layout;
|
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,
|
fn item_function(w: &mut fmt::Formatter, it: &clean::Item,
|
||||||
f: &clean::Function) -> fmt::Result {
|
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>",
|
{name}{generics}{decl}{where_clause}</pre>",
|
||||||
vis = VisSpace(it.visibility),
|
vis = VisSpace(it.visibility),
|
||||||
unsafety = UnsafetySpace(f.unsafety),
|
unsafety = UnsafetySpace(f.unsafety),
|
||||||
|
abi = AbiSpace(f.abi),
|
||||||
name = it.name.as_ref().unwrap(),
|
name = it.name.as_ref().unwrap(),
|
||||||
generics = f.generics,
|
generics = f.generics,
|
||||||
where_clause = WhereClause(&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,
|
pub fn visit_fn(&mut self, item: &ast::Item,
|
||||||
name: ast::Ident, fd: &ast::FnDecl,
|
name: ast::Ident, fd: &ast::FnDecl,
|
||||||
unsafety: &ast::Unsafety, _abi: &abi::Abi,
|
unsafety: &ast::Unsafety, abi: &abi::Abi,
|
||||||
gen: &ast::Generics) -> Function {
|
gen: &ast::Generics) -> Function {
|
||||||
debug!("Visiting fn");
|
debug!("Visiting fn");
|
||||||
Function {
|
Function {
|
||||||
|
@ -136,6 +136,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
whence: item.span,
|
whence: item.span,
|
||||||
generics: gen.clone(),
|
generics: gen.clone(),
|
||||||
unsafety: *unsafety,
|
unsafety: *unsafety,
|
||||||
|
abi: *abi,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
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;
|
pub use lib::foreigner;
|
||||||
|
|
||||||
extern "C" {
|
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);
|
pub fn another(cold_as_ice: u32);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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};
|
|
@ -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…
Reference in New Issue