Auto merge of #88679 - petrochenkov:doctrscope, r=GuillaumeGomez
rustdoc: Pre-calculate traits that are in scope for doc links This eliminates one more late use of resolver (part of #83761). At early doc link resolution time we go through parent modules of items from the current crate, reexports of items from other crates, trait items, and impl items collected by `collect-intra-doc-links` pass, determine traits that are in scope in each such module, and put those traits into a map used by later rustdoc passes. r? `@jyn514`
This commit is contained in:
commit
788b1fe5b7
7 changed files with 131 additions and 41 deletions
|
@ -1373,11 +1373,15 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
self.root.traits.decode(self).map(move |index| self.local_def_id(index))
|
||||
}
|
||||
|
||||
fn get_trait_impls(self) -> impl Iterator<Item = (DefId, Option<SimplifiedType>)> + 'a {
|
||||
self.cdata.trait_impls.values().flat_map(move |impls| {
|
||||
impls
|
||||
.decode(self)
|
||||
.map(move |(idx, simplified_self_ty)| (self.local_def_id(idx), simplified_self_ty))
|
||||
fn get_trait_impls(self) -> impl Iterator<Item = (DefId, DefId, Option<SimplifiedType>)> + 'a {
|
||||
self.cdata.trait_impls.iter().flat_map(move |((trait_cnum_raw, trait_index), impls)| {
|
||||
let trait_def_id = DefId {
|
||||
krate: self.cnum_map[CrateNum::from_u32(*trait_cnum_raw)],
|
||||
index: *trait_index,
|
||||
};
|
||||
impls.decode(self).map(move |(impl_index, simplified_self_ty)| {
|
||||
(trait_def_id, self.local_def_id(impl_index), simplified_self_ty)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -493,7 +493,7 @@ impl CStore {
|
|||
pub fn trait_impls_in_crate_untracked(
|
||||
&self,
|
||||
cnum: CrateNum,
|
||||
) -> impl Iterator<Item = (DefId, Option<SimplifiedType>)> + '_ {
|
||||
) -> impl Iterator<Item = (DefId, DefId, Option<SimplifiedType>)> + '_ {
|
||||
self.get_crate_data(cnum).get_trait_impls()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ impl<'a> Resolver<'a> {
|
|||
/// Reachable macros with block module parents exist due to `#[macro_export] macro_rules!`,
|
||||
/// but they cannot use def-site hygiene, so the assumption holds
|
||||
/// (<https://github.com/rust-lang/rust/pull/77984#issuecomment-712445508>).
|
||||
crate fn get_nearest_non_block_module(&mut self, mut def_id: DefId) -> Module<'a> {
|
||||
pub fn get_nearest_non_block_module(&mut self, mut def_id: DefId) -> Module<'a> {
|
||||
loop {
|
||||
match self.get_module(def_id) {
|
||||
Some(module) => return module,
|
||||
|
|
|
@ -614,7 +614,8 @@ impl<'a> ModuleData<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn def_id(&self) -> DefId {
|
||||
// Public for rustdoc.
|
||||
pub fn def_id(&self) -> DefId {
|
||||
self.opt_def_id().expect("`ModuleData::def_id` is called on a block module")
|
||||
}
|
||||
|
||||
|
@ -3407,6 +3408,16 @@ impl<'a> Resolver<'a> {
|
|||
&self.all_macros
|
||||
}
|
||||
|
||||
/// For rustdoc.
|
||||
/// For local modules returns only reexports, for external modules returns all children.
|
||||
pub fn module_children_or_reexports(&self, def_id: DefId) -> Vec<ModChild> {
|
||||
if let Some(def_id) = def_id.as_local() {
|
||||
self.reexport_map.get(&def_id).cloned().unwrap_or_default()
|
||||
} else {
|
||||
self.cstore().module_children_untracked(def_id, self.session)
|
||||
}
|
||||
}
|
||||
|
||||
/// Retrieves the span of the given `DefId` if `DefId` is in the local crate.
|
||||
#[inline]
|
||||
pub fn opt_span(&self, def_id: DefId) -> Option<Span> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue