Refactor resolve_link into a separate function

This commit is contained in:
Joshua Nelson 2020-09-13 16:48:51 -04:00
parent 7402a39447
commit 245f69ad3c

View file

@ -843,7 +843,6 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
self.mod_ids.push(item.def_id);
}
let cx = self.cx;
let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new);
trace!("got documentation '{}'", dox);
@ -885,27 +884,66 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
});
for (ori_link, link_range) in markdown_links(&dox) {
self.resolve_link(
&mut item,
&dox,
&current_item,
parent_node,
&parent_name,
ori_link,
link_range,
);
}
if item.is_mod() && !item.attrs.inner_docs {
self.mod_ids.push(item.def_id);
}
if item.is_mod() {
let ret = self.fold_item_recur(item);
self.mod_ids.pop();
ret
} else {
self.fold_item_recur(item)
}
}
}
impl LinkCollector<'_, '_> {
fn resolve_link(
&self,
item: &mut Item,
dox: &str,
current_item: &Option<String>,
parent_node: Option<DefId>,
parent_name: &Option<String>,
ori_link: String,
link_range: Option<Range<usize>>,
) {
trace!("considering link '{}'", ori_link);
// Bail early for real links.
if ori_link.contains('/') {
continue;
return;
}
// [] is mostly likely not supposed to be a link
if ori_link.is_empty() {
continue;
return;
}
let cx = self.cx;
let link = ori_link.replace("`", "");
let parts = link.split('#').collect::<Vec<_>>();
let (link, extra_fragment) = if parts.len() > 2 {
anchor_failure(cx, &item, &link, &dox, link_range, AnchorFailure::MultipleAnchors);
continue;
anchor_failure(cx, &item, &link, dox, link_range, AnchorFailure::MultipleAnchors);
return;
} else if parts.len() == 2 {
if parts[0].trim().is_empty() {
// This is an anchor to an element of the current page, nothing to do in here!
continue;
return;
}
(parts[0], Some(parts[1].to_owned()))
} else {
@ -926,7 +964,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
.trim();
if path_str.contains(|ch: char| !(ch.is_alphanumeric() || ch == ':' || ch == '_')) {
continue;
return;
}
// We stripped `()` and `!` when parsing the disambiguator.
@ -962,8 +1000,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
match disambiguator.map(Disambiguator::ns) {
Some(ns @ (ValueNS | TypeNS)) => {
match self.resolve(path_str, ns, &current_item, base_node, &extra_fragment)
{
match self.resolve(path_str, ns, &current_item, base_node, &extra_fragment) {
Ok(res) => res,
Err(ErrorKind::Resolve(box mut kind)) => {
// We only looked in one namespace. Try to give a better error if possible.
@ -987,18 +1024,18 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
&item,
path_str,
disambiguator,
&dox,
dox,
link_range,
smallvec![kind],
);
// This could just be a normal link or a broken link
// we could potentially check if something is
// "intra-doc-link-like" and warn in that case.
continue;
return;
}
Err(ErrorKind::AnchorFailure(msg)) => {
anchor_failure(cx, &item, &ori_link, &dox, link_range, msg);
continue;
anchor_failure(cx, &item, &ori_link, dox, link_range, msg);
return;
}
}
}
@ -1020,8 +1057,8 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
Ok(res)
}
Err(ErrorKind::AnchorFailure(msg)) => {
anchor_failure(cx, &item, &ori_link, &dox, link_range, msg);
continue;
anchor_failure(cx, &item, &ori_link, dox, link_range, msg);
return;
}
Err(ErrorKind::Resolve(box kind)) => Err(kind),
},
@ -1034,8 +1071,8 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
) {
Ok(res) => Ok(res),
Err(ErrorKind::AnchorFailure(msg)) => {
anchor_failure(cx, &item, &ori_link, &dox, link_range, msg);
continue;
anchor_failure(cx, &item, &ori_link, dox, link_range, msg);
return;
}
Err(ErrorKind::Resolve(box kind)) => Err(kind),
}
@ -1064,12 +1101,12 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
&item,
path_str,
disambiguator,
&dox,
dox,
link_range,
candidates.into_iter().filter_map(|res| res.err()).collect(),
);
// this could just be a normal link
continue;
return;
}
if len == 1 {
@ -1087,11 +1124,11 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
cx,
&item,
path_str,
&dox,
dox,
link_range,
candidates.present_items().collect(),
);
continue;
return;
}
}
Some(MacroNS) => {
@ -1116,11 +1153,11 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
&item,
path_str,
disambiguator,
&dox,
dox,
link_range,
smallvec![kind],
);
continue;
return;
}
}
}
@ -1143,19 +1180,19 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
cx,
&item,
path_str,
&dox,
dox,
link_range,
AnchorFailure::RustdocAnchorConflict(prim),
);
continue;
return;
}
res = prim;
fragment = Some(path.to_owned());
} else {
// `[char]` when a `char` module is in scope
let candidates = vec![res, prim];
ambiguity_error(cx, &item, path_str, &dox, link_range, candidates);
continue;
ambiguity_error(cx, &item, path_str, dox, link_range, candidates);
return;
}
}
}
@ -1163,7 +1200,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
let report_mismatch = |specified: Disambiguator, resolved: Disambiguator| {
// The resolved item did not match the disambiguator; give a better error than 'not found'
let msg = format!("incompatible link kind for `{}`", path_str);
report_diagnostic(cx, &msg, &item, &dox, &link_range, |diag, sp| {
report_diagnostic(cx, &msg, &item, dox, &link_range, |diag, sp| {
let note = format!(
"this link resolved to {} {}, which is not {} {}",
resolved.article(),
@ -1172,7 +1209,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
specified.descr()
);
diag.note(&note);
suggest_disambiguator(resolved, diag, path_str, &dox, sp, &link_range);
suggest_disambiguator(resolved, diag, path_str, dox, sp, &link_range);
});
};
if let Res::PrimTy(_) = res {
@ -1187,7 +1224,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
}
Some(other) => {
report_mismatch(other, Disambiguator::Primitive);
continue;
return;
}
}
} else {
@ -1210,7 +1247,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
(actual, Some(Disambiguator::Kind(expected))) if actual == expected => {}
(_, Some(specified @ Disambiguator::Kind(_) | specified @ Disambiguator::Primitive)) => {
report_mismatch(specified, Disambiguator::Kind(kind));
continue;
return;
}
}
}
@ -1229,32 +1266,12 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
if self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_src)
&& !self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_dst)
{
privacy_error(cx, &item, &path_str, &dox, link_range);
continue;
privacy_error(cx, &item, &path_str, dox, link_range);
return;
}
}
let id = register_res(cx, res);
item.attrs.links.push(ItemLink {
link: ori_link,
link_text,
did: Some(id),
fragment,
});
}
}
if item.is_mod() && !item.attrs.inner_docs {
self.mod_ids.push(item.def_id);
}
if item.is_mod() {
let ret = self.fold_item_recur(item);
self.mod_ids.pop();
ret
} else {
self.fold_item_recur(item)
item.attrs.links.push(ItemLink { link: ori_link, link_text, did: Some(id), fragment });
}
}
}