diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 37055f851b4..ef0c3fbb252 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -1466,7 +1466,7 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext, encode_def_id(rbml_w, local_def(nitem.id)); encode_visibility(rbml_w, nitem.vis); match nitem.node { - ast::ForeignItemFn(..) => { + ast::ForeignItemFn(ref fndecl, _) => { encode_family(rbml_w, FN_FAMILY); encode_bounds_and_type(rbml_w, ecx, &lookup_item_type(ecx.tcx,local_def(nitem.id))); @@ -1478,6 +1478,7 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext, let stab = stability::lookup(ecx.tcx, ast_util::local_def(nitem.id)); encode_stability(rbml_w, stab); encode_symbol(ecx, rbml_w, nitem.id); + encode_method_argument_names(rbml_w, &*fndecl); } ast::ForeignItemStatic(_, mutbl) => { if mutbl { 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 3641370d818..7ab9d8c6672 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/format.rs b/src/librustdoc/html/format.rs index 7a6157b63b5..cc2cf21095e 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -460,7 +460,8 @@ impl fmt::Display for clean::Type { f.write_str(name) } clean::ResolvedPath{ did, ref typarams, ref path } => { - try!(resolved_path(f, did, path, false)); + // Paths like Self::Output should be rendered with all segments + try!(resolved_path(f, did, path, path.segments[0].name == "Self")); tybounds(f, typarams) } clean::Infer => write!(f, "_"), 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-assoc-types/Makefile b/src/test/run-make/rustdoc-assoc-types/Makefile new file mode 100644 index 00000000000..74fca83f5f9 --- /dev/null +++ b/src/test/run-make/rustdoc-assoc-types/Makefile @@ -0,0 +1,5 @@ +-include ../tools.mk + +all: lib.rs + $(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc lib.rs + $(HTMLDOCCK) $(TMPDIR)/doc lib.rs diff --git a/src/test/run-make/rustdoc-assoc-types/lib.rs b/src/test/run-make/rustdoc-assoc-types/lib.rs new file mode 100644 index 00000000000..3e6e0ad5600 --- /dev/null +++ b/src/test/run-make/rustdoc-assoc-types/lib.rs @@ -0,0 +1,20 @@ +// 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"] + +// @has lib/trait.Index.html +pub trait Index { + // @has - '//*[@id="associatedtype.Output"]//code' 'type Output: ?Sized' + type Output: ?Sized; + // @has - '//*[@id="tymethod.index"]//code' \ + // "fn index<'a>(&'a self, index: I) -> &'a Self::Output" + fn index<'a>(&'a self, index: I) -> &'a Self::Output; +} 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 } +} diff --git a/src/test/run-make/rustdoc-ffi/Makefile b/src/test/run-make/rustdoc-ffi/Makefile new file mode 100644 index 00000000000..c312efe12f5 --- /dev/null +++ b/src/test/run-make/rustdoc-ffi/Makefile @@ -0,0 +1,8 @@ +-include ../tools.mk + +all: lib.rs + $(HOST_RPATH_ENV) $(RUSTC) lib.rs + $(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc lib.rs + $(HOST_RPATH_ENV) $(RUSTDOC) -L $(TMPDIR) -w html -o $(TMPDIR)/doc user.rs + $(HTMLDOCCK) $(TMPDIR)/doc lib.rs + $(HTMLDOCCK) $(TMPDIR)/doc user.rs diff --git a/src/test/run-make/rustdoc-ffi/lib.rs b/src/test/run-make/rustdoc-ffi/lib.rs new file mode 100644 index 00000000000..e06dbe76dbb --- /dev/null +++ b/src/test/run-make/rustdoc-ffi/lib.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"] + +extern "C" { + // @has lib/fn.foreigner.html //pre 'pub unsafe fn foreigner(cold_as_ice: u32)' + pub fn foreigner(cold_as_ice: u32); +} diff --git a/src/test/run-make/rustdoc-ffi/user.rs b/src/test/run-make/rustdoc-ffi/user.rs new file mode 100644 index 00000000000..09d7a7c536c --- /dev/null +++ b/src/test/run-make/rustdoc-ffi/user.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"] + +extern crate lib; + +// @has user/fn.foreigner.html //pre 'pub unsafe fn foreigner(cold_as_ice: u32)' +pub use lib::foreigner; diff --git a/src/test/run-make/rustdoc-hidden-line/foo.rs b/src/test/run-make/rustdoc-hidden-line/foo.rs index c538a132fb1..3906d9ee8ae 100644 --- a/src/test/run-make/rustdoc-hidden-line/foo.rs +++ b/src/test/run-make/rustdoc-hidden-line/foo.rs @@ -32,5 +32,4 @@ pub fn foo() {} // @!has foo/fn.foo.html invisible -// @matches - //pre '#.*\[.*derive.*\(.*Eq.*\).*\].*//.*Bar' - +// @matches - //pre "#\[derive\(PartialEq\)\] // Bar" diff --git a/src/test/run-make/rustdoc-negative-impl/foo.rs b/src/test/run-make/rustdoc-negative-impl/foo.rs index eaa3af86563..b5fcbf46c5c 100644 --- a/src/test/run-make/rustdoc-negative-impl/foo.rs +++ b/src/test/run-make/rustdoc-negative-impl/foo.rs @@ -15,8 +15,8 @@ pub struct Alpha; // @matches foo/struct.Bravo.html '//pre' "pub struct Bravo" pub struct Bravo; -// @matches foo/struct.Alpha.html '//*[@class="impl"]//code' "impl !.*Send.* for .*Alpha" +// @matches foo/struct.Alpha.html '//*[@class="impl"]//code' "impl !Send for Alpha" impl !Send for Alpha {} -// @matches foo/struct.Bravo.html '//*[@class="impl"]//code' "impl !.*Send.* for .*Bravo.*" +// @matches foo/struct.Bravo.html '//*[@class="impl"]//code' "impl !Send for Bravo" impl !Send for Bravo {} diff --git a/src/test/run-make/rustdoc-where/foo.rs b/src/test/run-make/rustdoc-where/foo.rs index 9f38ff13805..68fde60564e 100644 --- a/src/test/run-make/rustdoc-where/foo.rs +++ b/src/test/run-make/rustdoc-where/foo.rs @@ -10,29 +10,30 @@ pub trait MyTrait {} -// @matches foo/struct.Alpha.html '//pre' "Alpha.*where.*A:.*MyTrait" +// @has foo/struct.Alpha.html '//pre' "pub struct Alpha where A: MyTrait" pub struct Alpha where A: MyTrait; -// @matches foo/trait.Bravo.html '//pre' "Bravo.*where.*B:.*MyTrait" +// @has foo/trait.Bravo.html '//pre' "pub trait Bravo where B: MyTrait" pub trait Bravo where B: MyTrait {} -// @matches foo/fn.charlie.html '//pre' "charlie.*where.*C:.*MyTrait" +// @has foo/fn.charlie.html '//pre' "pub fn charlie() where C: MyTrait" pub fn charlie() where C: MyTrait {} pub struct Delta; -// @matches foo/struct.Delta.html '//*[@class="impl"]//code' "impl.*Delta.*where.*D:.*MyTrait" +// @has foo/struct.Delta.html '//*[@class="impl"]//code' \ +// "impl Delta where D: MyTrait" impl Delta where D: MyTrait { pub fn delta() {} } pub struct Echo; -// @matches foo/struct.Echo.html '//*[@class="impl"]//code' \ -// "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait" -// @matches foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \ -// "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait" +// @has foo/struct.Echo.html '//*[@class="impl"]//code' \ +// "impl MyTrait for Echo where E: MyTrait" +// @has foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \ +// "impl MyTrait for Echo where E: MyTrait" impl MyTrait for Echo where E: MyTrait {} pub enum Foxtrot {} -// @matches foo/enum.Foxtrot.html '//*[@class="impl"]//code' \ -// "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait" -// @matches foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \ -// "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait" +// @has foo/enum.Foxtrot.html '//*[@class="impl"]//code' \ +// "impl MyTrait for Foxtrot where F: MyTrait" +// @has foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \ +// "impl MyTrait for Foxtrot where F: MyTrait" impl MyTrait for Foxtrot where F: MyTrait {}