Unify item relative path computation in one function
This commit is contained in:
parent
f3c24833c5
commit
14e0dab96b
@ -191,6 +191,20 @@ pub(crate) fn load_attrs<'hir>(cx: &DocContext<'hir>, did: DefId) -> &'hir [ast:
|
||||
cx.tcx.get_attrs_unchecked(did)
|
||||
}
|
||||
|
||||
pub(crate) fn item_relative_path(tcx: TyCtxt<'_>, def_id: DefId) -> Vec<Symbol> {
|
||||
tcx.def_path(def_id)
|
||||
.data
|
||||
.into_iter()
|
||||
.filter_map(|elem| {
|
||||
// extern blocks (and a few others things) have an empty name.
|
||||
match elem.data.get_opt_name() {
|
||||
Some(s) if !s.is_empty() => Some(s),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Record an external fully qualified name in the external_paths cache.
|
||||
///
|
||||
/// These names are used later on by HTML rendering to generate things like
|
||||
@ -206,8 +220,7 @@ pub(crate) fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemT
|
||||
|
||||
let crate_name = cx.tcx.crate_name(did.krate);
|
||||
|
||||
let relative =
|
||||
cx.tcx.def_path(did).data.into_iter().filter_map(|elem| elem.data.get_opt_name());
|
||||
let relative = item_relative_path(cx.tcx, did);
|
||||
let fqn = if let ItemType::Macro = kind {
|
||||
// Check to see if it is a macro 2.0 or built-in macro
|
||||
if matches!(
|
||||
@ -218,7 +231,7 @@ pub(crate) fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemT
|
||||
) {
|
||||
once(crate_name).chain(relative).collect()
|
||||
} else {
|
||||
vec![crate_name, relative.last().expect("relative was empty")]
|
||||
vec![crate_name, *relative.last().expect("relative was empty")]
|
||||
}
|
||||
} else {
|
||||
once(crate_name).chain(relative).collect()
|
||||
|
@ -586,18 +586,7 @@ fn generate_macro_def_id_path(
|
||||
let crate_name = tcx.crate_name(def_id.krate);
|
||||
let cache = cx.cache();
|
||||
|
||||
let fqp: Vec<Symbol> = tcx
|
||||
.def_path(def_id)
|
||||
.data
|
||||
.into_iter()
|
||||
.filter_map(|elem| {
|
||||
// extern blocks (and a few others things) have an empty name.
|
||||
match elem.data.get_opt_name() {
|
||||
Some(s) if !s.is_empty() => Some(s),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
let fqp = clean::inline::item_relative_path(tcx, def_id);
|
||||
let mut relative = fqp.iter().copied();
|
||||
let cstore = CStore::from_tcx(tcx);
|
||||
// We need this to prevent a `panic` when this function is used from intra doc links...
|
||||
@ -680,18 +669,7 @@ fn generate_item_def_id_path(
|
||||
.unwrap_or(def_id);
|
||||
}
|
||||
|
||||
let relative: Vec<Symbol> = tcx
|
||||
.def_path(def_id)
|
||||
.data
|
||||
.into_iter()
|
||||
.filter_map(|elem| {
|
||||
// extern blocks (and a few others things) have an empty name.
|
||||
match elem.data.get_opt_name() {
|
||||
Some(s) if !s.is_empty() => Some(s),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
let relative = clean::inline::item_relative_path(tcx, def_id);
|
||||
let fqp: Vec<Symbol> = once(crate_name).chain(relative).collect();
|
||||
|
||||
let def_kind = tcx.def_kind(def_id);
|
||||
|
@ -2,14 +2,47 @@
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
use std::sync::atomic::AtomicIsize;
|
||||
|
||||
// @has 'src/foo/jump-to-non-local-method.rs.html'
|
||||
// @has - '//a[@href="https://doc.rust-lang.org/nightly/core/sync/atomic/struct.AtomicIsize.html#method.new"]' 'AtomicIsize::new'
|
||||
|
||||
pub fn bar() {
|
||||
let _ = AtomicIsize::new(0);
|
||||
b();
|
||||
// @has - '//a[@href="{{channel}}/core/sync/atomic/struct.AtomicIsize.html"]' 'std::sync::atomic::AtomicIsize'
|
||||
use std::sync::atomic::AtomicIsize;
|
||||
// @has - '//a[@href="{{channel}}/std/io/trait.Read.html"]' 'std::io::Read'
|
||||
use std::io::Read;
|
||||
// @has - '//a[@href="{{channel}}/std/io/index.html"]' 'std::io'
|
||||
use std::io;
|
||||
// @has - '//a[@href="{{channel}}/std/process/fn.exit.html"]' 'std::process::exit'
|
||||
use std::process::exit;
|
||||
use std::cmp::Ordering;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub fn bar2<T: Read>(readable: T) {
|
||||
// @has - '//a[@href="{{channel}}/std/io/trait.Read.html#tymethod.read"]' 'read'
|
||||
let _ = readable.read(&mut []);
|
||||
}
|
||||
|
||||
fn b() {}
|
||||
pub fn bar() {
|
||||
// @has - '//a[@href="{{channel}}/core/sync/atomic/struct.AtomicIsize.html#method.new"]' 'AtomicIsize::new'
|
||||
let _ = AtomicIsize::new(0);
|
||||
// @has - '//a[@href="#48"]' 'local_private'
|
||||
local_private();
|
||||
}
|
||||
|
||||
pub fn extern_call() {
|
||||
// @has - '//a[@href="{{channel}}/std/process/fn.exit.html"]' 'exit'
|
||||
exit(0);
|
||||
}
|
||||
|
||||
pub fn macro_call() -> Result<(), ()> {
|
||||
// @has - '//a[@href="{{channel}}/core/macro.try.html"]' 'try!'
|
||||
try!(Err(()));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn variant() {
|
||||
// @has - '//a[@href="{{channel}}/core/cmp/enum.Ordering.html#variant.Less"]' 'Ordering::Less'
|
||||
let _ = Ordering::Less;
|
||||
// @has - '//a[@href="{{channel}}/core/marker/struct.PhantomData.html"]' 'PhantomData'
|
||||
let _: PhantomData::<usize> = PhantomData;
|
||||
}
|
||||
|
||||
fn local_private() {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user