pub(crate) struct LinkCollector<'a, 'tcx> {
pub(crate) cx: &'a mut DocContext<'tcx>,
pub(crate) visited_links: FxHashMap<ResolutionInfo, Option<(Res, Option<UrlFragment>)>>,
pub(crate) ambiguous_links: FxIndexMap<(ItemId, String), Vec<AmbiguousLinks>>,
}
Fields§
§cx: &'a mut DocContext<'tcx>
§visited_links: FxHashMap<ResolutionInfo, Option<(Res, Option<UrlFragment>)>>
Cache the resolved links so we can avoid resolving (and emitting errors for) the same link.
The link will be None
if it could not be resolved (i.e. the error was cached).
ambiguous_links: FxIndexMap<(ItemId, String), Vec<AmbiguousLinks>>
According to rustc_resolve
, these links are ambiguous.
However, we cannot link to an item that has been stripped from the documentation. If all
but one of the “possibilities” are stripped, then there is no real ambiguity. To determine
if an ambiguity is real, we delay resolving them until after Cache::populate
, then filter
every item that doesn’t have a cached path.
We could get correct results by simply delaying everything. This would have fewer happy codepaths, but we want to distinguish different kinds of error conditions, and this is easy to do by resolving links as soon as possible.
Implementations§
Source§impl<'a, 'tcx> LinkCollector<'a, 'tcx>
impl<'a, 'tcx> LinkCollector<'a, 'tcx>
Sourcefn variant_field<'path>(
&self,
path_str: &'path str,
item_id: DefId,
module_id: DefId,
) -> Result<(Res, DefId), UnresolvedPath<'path>>
fn variant_field<'path>( &self, path_str: &'path str, item_id: DefId, module_id: DefId, ) -> Result<(Res, DefId), UnresolvedPath<'path>>
Given a full link, parse it as an enum struct variant.
In particular, this will return an error whenever there aren’t three full path segments left in the link.
Sourcefn resolve_primitive_associated_item(
&self,
prim_ty: PrimitiveType,
ns: Namespace,
item_name: Symbol,
) -> Vec<(Res, DefId)>
fn resolve_primitive_associated_item( &self, prim_ty: PrimitiveType, ns: Namespace, item_name: Symbol, ) -> Vec<(Res, DefId)>
Given a primitive type, try to resolve an associated item.
fn resolve_self_ty( &self, path_str: &str, ns: Namespace, item_id: DefId, ) -> Option<Res>
Sourcefn resolve_path(
&self,
path_str: &str,
ns: Namespace,
item_id: DefId,
module_id: DefId,
) -> Option<Res>
fn resolve_path( &self, path_str: &str, ns: Namespace, item_id: DefId, module_id: DefId, ) -> Option<Res>
Convenience wrapper around doc_link_resolutions
.
This also handles resolving true
and false
as booleans.
NOTE: doc_link_resolutions
knows only about paths, not about types.
Associated items will never be resolved by this function.
Sourcefn resolve<'path>(
&mut self,
path_str: &'path str,
ns: Namespace,
disambiguator: Option<Disambiguator>,
item_id: DefId,
module_id: DefId,
) -> Result<Vec<(Res, Option<DefId>)>, UnresolvedPath<'path>>
fn resolve<'path>( &mut self, path_str: &'path str, ns: Namespace, disambiguator: Option<Disambiguator>, item_id: DefId, module_id: DefId, ) -> Result<Vec<(Res, Option<DefId>)>, UnresolvedPath<'path>>
Resolves a string as a path within a particular namespace. Returns an optional URL fragment in the case of variants and methods.
Sourcefn def_id_to_res(&self, ty_id: DefId) -> Option<Res>
fn def_id_to_res(&self, ty_id: DefId) -> Option<Res>
Convert a DefId to a Res, where possible.
This is used for resolving type aliases.
Sourcefn primitive_type_to_ty(&mut self, prim: PrimitiveType) -> Option<Ty<'tcx>>
fn primitive_type_to_ty(&mut self, prim: PrimitiveType) -> Option<Ty<'tcx>>
Convert a PrimitiveType to a Ty, where possible.
This is used for resolving trait impls for primitives
Source§impl LinkCollector<'_, '_>
impl LinkCollector<'_, '_>
fn resolve_links(&mut self, item: &Item)
pub(crate) fn save_link(&mut self, item_id: ItemId, link: ItemLink)
Sourcefn resolve_link(
&mut self,
dox: &String,
item: &Item,
item_id: DefId,
module_id: DefId,
PreprocessedMarkdownLink: &PreprocessedMarkdownLink,
) -> Option<ItemLink>
fn resolve_link( &mut self, dox: &String, item: &Item, item_id: DefId, module_id: DefId, PreprocessedMarkdownLink: &PreprocessedMarkdownLink, ) -> Option<ItemLink>
This is the entry point for resolving an intra-doc link.
FIXME(jynelson): this is way too many arguments
Sourcefn validate_link(&self, original_did: DefId) -> bool
fn validate_link(&self, original_did: DefId) -> bool
Returns true
if a link could be generated from the given intra-doc information.
This is a very light version of format::href_with_root_path
since we’re only interested
about whether we can generate a link to an item or not.
- If
original_did
is local, then we check if the item is reexported or public. - If
original_did
is not local, then we check if the crate it comes from is a direct public dependency.
pub(crate) fn resolve_ambiguities(&mut self)
fn compute_link( &mut self, res: Res, fragment: Option<UrlFragment>, path_str: &str, disambiguator: Option<Disambiguator>, diag_info: DiagnosticInfo<'_>, link_text: &Box<str>, ) -> Option<ItemLink>
fn verify_disambiguator( &self, path_str: &str, kind: DefKind, id: DefId, disambiguator: Option<Disambiguator>, diag_info: &DiagnosticInfo<'_>, ) -> Option<()>
fn report_disambiguator_mismatch( &self, path_str: &str, specified: Disambiguator, resolved: Res, diag_info: &DiagnosticInfo<'_>, )
fn report_rawptr_assoc_feature_gate( &self, dox: &str, ori_link: &MarkdownLinkRange, item: &Item, )
fn resolve_with_disambiguator_cached( &mut self, key: ResolutionInfo, diag: DiagnosticInfo<'_>, cache_errors: bool, ) -> Option<Vec<(Res, Option<UrlFragment>)>>
Sourcefn resolve_with_disambiguator(
&mut self,
key: &ResolutionInfo,
diag: DiagnosticInfo<'_>,
) -> Vec<(Res, Option<DefId>)>
fn resolve_with_disambiguator( &mut self, key: &ResolutionInfo, diag: DiagnosticInfo<'_>, ) -> Vec<(Res, Option<DefId>)>
After parsing the disambiguator, resolve the main part of the link.
Trait Implementations§
Source§impl<'a, 'tcx> DocVisitor<'_> for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> DocVisitor<'_> for LinkCollector<'a, 'tcx>
fn visit_item(&mut self, item: &Item)
Source§fn visit_inner_recur(&mut self, kind: &'a ItemKind)
fn visit_inner_recur(&mut self, kind: &'a ItemKind)
Source§fn visit_item_recur(&mut self, item: &'a Item)
fn visit_item_recur(&mut self, item: &'a Item)
fn visit_mod(&mut self, m: &'a Module)
Source§fn visit_crate(&mut self, c: &'a Crate)
fn visit_crate(&mut self, c: &'a Crate)
DocVisitor
.Auto Trait Implementations§
impl<'a, 'tcx> Freeze for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> !Send for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> !Sync for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> Unpin for LinkCollector<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for LinkCollector<'a, 'tcx>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 96 bytes