rustdoc: Detect provided methods on inlined traits

Closes #23864
This commit is contained in:
Alex Crichton 2015-04-07 11:50:14 -07:00
parent 947f1b66cb
commit d7fcee8347
5 changed files with 64 additions and 9 deletions

View File

@ -1296,6 +1296,35 @@ impl<'tcx> Clean<Item> for ty::Method<'tcx> {
}
};
let generics = (&self.generics, &self.predicates,
subst::FnSpace).clean(cx);
let decl = (self.def_id, &sig).clean(cx);
let provided = match self.container {
ty::ImplContainer(..) => false,
ty::TraitContainer(did) => {
ty::provided_trait_methods(cx.tcx(), did).iter().any(|m| {
m.def_id == self.def_id
})
}
};
let inner = if provided {
MethodItem(Method {
unsafety: self.fty.unsafety,
generics: generics,
self_: self_,
decl: decl,
abi: self.fty.abi
})
} else {
TyMethodItem(TyMethod {
unsafety: self.fty.unsafety,
generics: generics,
self_: self_,
decl: decl,
abi: self.fty.abi
})
};
Item {
name: Some(self.name.clean(cx)),
visibility: Some(ast::Inherited),
@ -1303,13 +1332,7 @@ impl<'tcx> Clean<Item> for ty::Method<'tcx> {
def_id: self.def_id,
attrs: inline::load_attrs(cx, cx.tcx(), self.def_id),
source: Span::empty(),
inner: TyMethodItem(TyMethod {
unsafety: self.fty.unsafety,
generics: (&self.generics, &self.predicates, subst::FnSpace).clean(cx),
self_: self_,
decl: (self.def_id, &sig).clean(cx),
abi: self.fty.abi
})
inner: inner,
}
}
}

View File

@ -0,0 +1,14 @@
// 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 trait Foo {
fn bar(&self);
fn foo(&mut self) {}
}

View File

@ -16,7 +16,7 @@ extern crate rustdoc_extern_method as foo;
// @has extern_method/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_'
// @has - '//*[@id="method.foo_"]//code' 'extern "rust-call" fn foo_'
pub use foo::Foo;
// @has extern_method/trait.Bar.html //pre "pub trait Bar"

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.
// aux-build:inline-default-methods.rs
extern crate inline_default_methods;
// @has inline_default_methods/trait.Foo.html
// @has - '//*[@class="rust trait"]' 'fn bar(&self);'
// @has - '//*[@class="rust trait"]' 'fn foo(&mut self) { ... }'
pub use inline_default_methods::Foo;

View File

@ -15,6 +15,6 @@ extern crate issue_17476;
pub struct Foo;
// @has issue_17476/struct.Foo.html \
// '//*[@href="http://example.com/issue_17476/trait.Foo.html#tymethod.foo"]' \
// '//*[@href="http://example.com/issue_17476/trait.Foo.html#method.foo"]' \
// 'foo'
impl issue_17476::Foo for Foo {}