From abae840f450c6f2b38f6ebf83cfcf1a7928138b7 Mon Sep 17 00:00:00 2001 From: Tom Jakubowski Date: Fri, 6 Feb 2015 00:51:38 -0800 Subject: [PATCH] rustdoc: Show non-Rust ABIs on methods Fix #21621 --- src/librustdoc/clean/inline.rs | 3 ++- src/librustdoc/clean/mod.rs | 6 +++++ src/librustdoc/html/render.rs | 20 +++++++++++----- .../run-make/rustdoc-extern-method/Makefile | 8 +++++++ .../run-make/rustdoc-extern-method/bar.rs | 24 +++++++++++++++++++ .../run-make/rustdoc-extern-method/foo.rs | 16 +++++++++++++ 6 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/test/run-make/rustdoc-extern-method/Makefile create mode 100644 src/test/run-make/rustdoc-extern-method/bar.rs create mode 100644 src/test/run-make/rustdoc-extern-method/foo.rs diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 9cdad8fccbe..dfa5b01270e 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -306,13 +306,14 @@ fn build_impl(cx: &DocContext, tcx: &ty::ctxt, let mut item = method.clean(cx); item.inner = match item.inner.clone() { clean::TyMethodItem(clean::TyMethod { - unsafety, decl, self_, generics + unsafety, decl, self_, generics, abi }) => { clean::MethodItem(clean::Method { unsafety: unsafety, decl: decl, self_: self_, generics: generics, + abi: abi }) } _ => panic!("not a tymethod"), diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 248ce99ff9b..c840a0cbbd8 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -27,6 +27,7 @@ pub use self::FunctionRetTy::*; pub use self::TraitMethod::*; use syntax; +use syntax::abi; use syntax::ast; use syntax::ast_util; use syntax::ast_util::PostExpansionMethod; @@ -945,6 +946,7 @@ pub struct Method { pub self_: SelfTy, pub unsafety: ast::Unsafety, pub decl: FnDecl, + pub abi: abi::Abi } impl Clean for ast::Method { @@ -973,6 +975,7 @@ impl Clean for ast::Method { self_: self.pe_explicit_self().node.clean(cx), unsafety: self.pe_unsafety().clone(), decl: decl, + abi: self.pe_abi() }), } } @@ -984,6 +987,7 @@ pub struct TyMethod { pub decl: FnDecl, pub generics: Generics, pub self_: SelfTy, + pub abi: abi::Abi } impl Clean for ast::TypeMethod { @@ -1011,6 +1015,7 @@ impl Clean for ast::TypeMethod { decl: decl, self_: self.explicit_self.node.clean(cx), generics: self.generics.clean(cx), + abi: self.abi }), } } @@ -1301,6 +1306,7 @@ impl<'tcx> Clean for ty::Method<'tcx> { generics: (&self.generics, subst::FnSpace).clean(cx), self_: self_, decl: (self.def_id, &sig).clean(cx), + abi: self.fty.abi }) } } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index f413ef7e926..b30b251e8ba 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -50,6 +50,7 @@ use externalfiles::ExternalHtml; use serialize::json; use serialize::json::ToJson; +use syntax::abi; use syntax::ast; use syntax::ast_util; use rustc::util::nodemap::NodeSet; @@ -1809,15 +1810,22 @@ fn assoc_type(w: &mut fmt::Formatter, it: &clean::Item, } fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result { - fn method(w: &mut fmt::Formatter, it: &clean::Item, unsafety: ast::Unsafety, - g: &clean::Generics, selfty: &clean::SelfTy, - d: &clean::FnDecl) -> fmt::Result { - write!(w, "{}fn {name}\ + fn method(w: &mut fmt::Formatter, it: &clean::Item, + unsafety: ast::Unsafety, abi: abi::Abi, + g: &clean::Generics, selfty: &clean::SelfTy, + d: &clean::FnDecl) -> fmt::Result { + use syntax::abi::Abi; + + write!(w, "{}{}fn {name}\ {generics}{decl}{where_clause}", match unsafety { ast::Unsafety::Unsafe => "unsafe ", _ => "", }, + match abi { + Abi::Rust => String::new(), + a => format!("extern {} ", a.to_string()) + }, ty = shortty(it), name = it.name.as_ref().unwrap(), generics = *g, @@ -1826,10 +1834,10 @@ fn render_method(w: &mut fmt::Formatter, meth: &clean::Item) -> fmt::Result { } match meth.inner { clean::TyMethodItem(ref m) => { - method(w, meth, m.unsafety, &m.generics, &m.self_, &m.decl) + method(w, meth, m.unsafety, m.abi, &m.generics, &m.self_, &m.decl) } clean::MethodItem(ref m) => { - method(w, meth, m.unsafety, &m.generics, &m.self_, &m.decl) + method(w, meth, m.unsafety, m.abi, &m.generics, &m.self_, &m.decl) } clean::AssociatedTypeItem(ref typ) => { assoc_type(w, meth, typ) diff --git a/src/test/run-make/rustdoc-extern-method/Makefile b/src/test/run-make/rustdoc-extern-method/Makefile new file mode 100644 index 00000000000..c87684f59ea --- /dev/null +++ b/src/test/run-make/rustdoc-extern-method/Makefile @@ -0,0 +1,8 @@ +-include ../tools.mk + +all: foo.rs bar.rs + $(HOST_RPATH_ENV) $(RUSTC) foo.rs + $(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc foo.rs + $(HOST_RPATH_ENV) $(RUSTDOC) -L $(TMPDIR) -w html -o $(TMPDIR)/doc bar.rs + $(HTMLDOCCK) $(TMPDIR)/doc bar.rs + diff --git a/src/test/run-make/rustdoc-extern-method/bar.rs b/src/test/run-make/rustdoc-extern-method/bar.rs new file mode 100644 index 00000000000..672090c13a2 --- /dev/null +++ b/src/test/run-make/rustdoc-extern-method/bar.rs @@ -0,0 +1,24 @@ +// 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 crate foo; + +// @has bar/trait.Foo.html //pre "pub trait Foo" +// @has - '//*[@id="tymethod.foo"]//code' 'extern "rust-call" fn foo' +// @has - '//*[@id="tymethod.foo_"]//code' 'extern "rust-call" fn foo_' +pub use foo::Foo; + +// @has bar/trait.Bar.html //pre "pub trait Bar" +pub trait Bar { + // @has - '//*[@id="tymethod.bar"]//code' 'extern "rust-call" fn bar' + extern "rust-call" fn bar(&self, _: ()); + // @has - '//*[@id="method.bar_"]//code' 'extern "rust-call" fn bar_' + extern "rust-call" fn bar_(&self, _: ()) { } +} diff --git a/src/test/run-make/rustdoc-extern-method/foo.rs b/src/test/run-make/rustdoc-extern-method/foo.rs new file mode 100644 index 00000000000..fc5f03e8bd3 --- /dev/null +++ b/src/test/run-make/rustdoc-extern-method/foo.rs @@ -0,0 +1,16 @@ +// 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. + +#![crate_type="lib"] + +pub trait Foo { + extern "rust-call" fn foo(&self, _: ()) -> i32; + extern "rust-call" fn foo_(&self, _: ()) -> i32 { 0 } +}