Allow using Self::
in doc
This commit is contained in:
parent
458a3e7629
commit
fc0675bf75
2 changed files with 138 additions and 4 deletions
|
@ -431,6 +431,43 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
|
|
||||||
look_for_tests(&cx, &dox, &item, true);
|
look_for_tests(&cx, &dox, &item, true);
|
||||||
|
|
||||||
|
// find item's parent to resolve `Self` in item's docs below
|
||||||
|
let parent_name = self.cx.as_local_hir_id(item.def_id).and_then(|item_hir| {
|
||||||
|
let parent_hir = self.cx.tcx.hir().get_parent_item(item_hir);
|
||||||
|
let item_parent = self.cx.tcx.hir().find(parent_hir);
|
||||||
|
match item_parent {
|
||||||
|
Some(hir::Node::Item(hir::Item {
|
||||||
|
kind:
|
||||||
|
hir::ItemKind::Impl {
|
||||||
|
self_ty:
|
||||||
|
hir::Ty {
|
||||||
|
kind:
|
||||||
|
hir::TyKind::Path(hir::QPath::Resolved(
|
||||||
|
_,
|
||||||
|
hir::Path { segments, .. },
|
||||||
|
)),
|
||||||
|
..
|
||||||
|
},
|
||||||
|
..
|
||||||
|
},
|
||||||
|
..
|
||||||
|
})) => segments.first().and_then(|seg| Some(seg.ident.to_string())),
|
||||||
|
Some(hir::Node::Item(hir::Item {
|
||||||
|
ident, kind: hir::ItemKind::Enum(..), ..
|
||||||
|
}))
|
||||||
|
| Some(hir::Node::Item(hir::Item {
|
||||||
|
ident, kind: hir::ItemKind::Struct(..), ..
|
||||||
|
}))
|
||||||
|
| Some(hir::Node::Item(hir::Item {
|
||||||
|
ident, kind: hir::ItemKind::Union(..), ..
|
||||||
|
}))
|
||||||
|
| Some(hir::Node::Item(hir::Item {
|
||||||
|
ident, kind: hir::ItemKind::Trait(..), ..
|
||||||
|
})) => Some(ident.to_string()),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for (ori_link, link_range) in markdown_links(&dox) {
|
for (ori_link, link_range) in markdown_links(&dox) {
|
||||||
// Bail early for real links.
|
// Bail early for real links.
|
||||||
if ori_link.contains('/') {
|
if ori_link.contains('/') {
|
||||||
|
@ -467,7 +504,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
let (res, fragment) = {
|
let (res, fragment) = {
|
||||||
let mut kind = None;
|
let mut kind = None;
|
||||||
let path_str = if let Some(prefix) =
|
let mut path_str = if let Some(prefix) =
|
||||||
["struct@", "enum@", "type@", "trait@", "union@"]
|
["struct@", "enum@", "type@", "trait@", "union@"]
|
||||||
.iter()
|
.iter()
|
||||||
.find(|p| link.starts_with(**p))
|
.find(|p| link.starts_with(**p))
|
||||||
|
@ -521,6 +558,15 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
let base_node =
|
let base_node =
|
||||||
if item.is_mod() && item.attrs.inner_docs { None } else { parent_node };
|
if item.is_mod() && item.attrs.inner_docs { None } else { parent_node };
|
||||||
|
|
||||||
|
let resolved_self;
|
||||||
|
// replace `Self` with suitable item's parent name
|
||||||
|
if path_str.starts_with("Self::") {
|
||||||
|
if let Some(ref name) = parent_name {
|
||||||
|
resolved_self = format!("{}::{}", name, &path_str[6..]);
|
||||||
|
path_str = &resolved_self;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match kind {
|
match kind {
|
||||||
Some(ns @ ValueNS) => {
|
Some(ns @ ValueNS) => {
|
||||||
match self.resolve(
|
match self.resolve(
|
||||||
|
@ -529,7 +575,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
¤t_item,
|
¤t_item,
|
||||||
base_node,
|
base_node,
|
||||||
&extra_fragment,
|
&extra_fragment,
|
||||||
None,
|
Some(&item),
|
||||||
) {
|
) {
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
Err(ErrorKind::ResolutionFailure) => {
|
Err(ErrorKind::ResolutionFailure) => {
|
||||||
|
@ -552,7 +598,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
¤t_item,
|
¤t_item,
|
||||||
base_node,
|
base_node,
|
||||||
&extra_fragment,
|
&extra_fragment,
|
||||||
None,
|
Some(&item),
|
||||||
) {
|
) {
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
Err(ErrorKind::ResolutionFailure) => {
|
Err(ErrorKind::ResolutionFailure) => {
|
||||||
|
@ -577,7 +623,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
|
||||||
¤t_item,
|
¤t_item,
|
||||||
base_node,
|
base_node,
|
||||||
&extra_fragment,
|
&extra_fragment,
|
||||||
None,
|
Some(&item),
|
||||||
) {
|
) {
|
||||||
Err(ErrorKind::AnchorFailure(msg)) => {
|
Err(ErrorKind::AnchorFailure(msg)) => {
|
||||||
anchor_failure(cx, &item, &ori_link, &dox, link_range, msg);
|
anchor_failure(cx, &item, &ori_link, &dox, link_range, msg);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#![crate_name = "foo"]
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
// @has foo/index.html '//a/@href' '../foo/struct.Foo.html#method.new'
|
// @has foo/index.html '//a/@href' '../foo/struct.Foo.html#method.new'
|
||||||
// @has foo/struct.Foo.html '//a/@href' '../foo/struct.Foo.html#method.new'
|
// @has foo/struct.Foo.html '//a/@href' '../foo/struct.Foo.html#method.new'
|
||||||
|
|
||||||
|
@ -27,3 +29,89 @@ impl Bar {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct MyStruct {
|
||||||
|
// @has foo/struct.MyStruct.html '//a/@href' '../foo/struct.MyStruct.html#structfield.struct_field'
|
||||||
|
|
||||||
|
/// [`struct_field`]
|
||||||
|
///
|
||||||
|
/// [`struct_field`]: Self::struct_field
|
||||||
|
pub struct_field: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum MyEnum {
|
||||||
|
// @has foo/enum.MyEnum.html '//a/@href' '../foo/enum.MyEnum.html#EnumVariant.v'
|
||||||
|
|
||||||
|
/// [`EnumVariant`]
|
||||||
|
///
|
||||||
|
/// [`EnumVariant`]: Self::EnumVariant
|
||||||
|
EnumVariant,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub union MyUnion {
|
||||||
|
// @has foo/union.MyUnion.html '//a/@href' '../foo/union.MyUnion.html#structfield.union_field'
|
||||||
|
|
||||||
|
/// [`union_field`]
|
||||||
|
///
|
||||||
|
/// [`union_field`]: Self::union_field
|
||||||
|
pub union_field: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait MyTrait {
|
||||||
|
// @has foo/trait.MyTrait.html '//a/@href' '../foo/trait.MyTrait.html#associatedtype.AssoType'
|
||||||
|
|
||||||
|
/// [`AssoType`]
|
||||||
|
///
|
||||||
|
/// [`AssoType`]: Self::AssoType
|
||||||
|
type AssoType;
|
||||||
|
|
||||||
|
// @has foo/trait.MyTrait.html '//a/@href' '../foo/trait.MyTrait.html#associatedconstant.ASSO_CONST'
|
||||||
|
|
||||||
|
/// [`ASSO_CONST`]
|
||||||
|
///
|
||||||
|
/// [`ASSO_CONST`]: Self::ASSO_CONST
|
||||||
|
const ASSO_CONST: i32 = 1;
|
||||||
|
|
||||||
|
// @has foo/trait.MyTrait.html '//a/@href' '../foo/trait.MyTrait.html#method.asso_fn'
|
||||||
|
|
||||||
|
/// [`asso_fn`]
|
||||||
|
///
|
||||||
|
/// [`asso_fn`]: Self::asso_fn
|
||||||
|
fn asso_fn() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyStruct {
|
||||||
|
// @has foo/struct.MyStruct.html '//a/@href' '../foo/struct.MyStruct.html#method.for_impl'
|
||||||
|
|
||||||
|
/// [`for_impl`]
|
||||||
|
///
|
||||||
|
/// [`for_impl`]: Self::for_impl
|
||||||
|
pub fn for_impl() {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyTrait for MyStruct {
|
||||||
|
// @has foo/struct.MyStruct.html '//a/@href' '../foo/struct.MyStruct.html#associatedtype.AssoType'
|
||||||
|
|
||||||
|
/// [`AssoType`]
|
||||||
|
///
|
||||||
|
/// [`AssoType`]: Self::AssoType
|
||||||
|
type AssoType = u32;
|
||||||
|
|
||||||
|
// @has foo/struct.MyStruct.html '//a/@href' '../foo/struct.MyStruct.html#associatedconstant.ASSO_CONST'
|
||||||
|
|
||||||
|
/// [`ASSO_CONST`]
|
||||||
|
///
|
||||||
|
/// [`ASSO_CONST`]: Self::ASSO_CONST
|
||||||
|
const ASSO_CONST: i32 = 10;
|
||||||
|
|
||||||
|
// @has foo/struct.MyStruct.html '//a/@href' '../foo/struct.MyStruct.html#method.asso_fn'
|
||||||
|
|
||||||
|
/// [`asso_fn`]
|
||||||
|
///
|
||||||
|
/// [`asso_fn`]: Self::asso_fn
|
||||||
|
fn asso_fn() {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue