Skip to content

Commit

Permalink
Rollup merge of rust-lang#63286 - Mark-Simulacrum:resolve-no-cb, r=pe…
Browse files Browse the repository at this point in the history
…trochenkov

Replace error callback with Result

r? @petrochenkov
  • Loading branch information
Centril authored Aug 6, 2019
2 parents a389521 + 3cd7f08 commit 949b49a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 24 deletions.
41 changes: 17 additions & 24 deletions src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1771,8 +1771,13 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
path: &ast::Path,
is_value: bool,
) -> Res {
self.resolve_ast_path_cb(path, is_value,
|resolver, span, error| resolve_error(resolver, span, error))
match self.resolve_ast_path_inner(path, is_value) {
Ok(r) => r,
Err((span, error)) => {
resolve_error(self, span, error);
Res::Err
}
}
}

fn resolve_str_path(
Expand Down Expand Up @@ -1833,8 +1838,6 @@ impl<'a> Resolver<'a> {
/// just that an error occurred.
pub fn resolve_str_path_error(&mut self, span: Span, path_str: &str, is_value: bool)
-> Result<(ast::Path, Res), ()> {
let mut errored = false;

let path = if path_str.starts_with("::") {
ast::Path {
span,
Expand All @@ -1855,48 +1858,38 @@ impl<'a> Resolver<'a> {
.collect(),
}
};
let res = self.resolve_ast_path_cb(&path, is_value, |_, _, _| errored = true);
if errored || res == def::Res::Err {
Err(())
} else {
Ok((path, res))
}
let res = self.resolve_ast_path_inner(&path, is_value).map_err(|_| ())?;
Ok((path, res))
}

/// Like `resolve_ast_path`, but takes a callback in case there was an error.
// FIXME(eddyb) use `Result` or something instead of callbacks.
fn resolve_ast_path_cb<F>(
fn resolve_ast_path_inner(
&mut self,
path: &ast::Path,
is_value: bool,
error_callback: F,
) -> Res
where F: for<'c, 'b> FnOnce(&'c mut Resolver<'_>, Span, ResolutionError<'b>)
{
) -> Result<Res, (Span, ResolutionError<'a>)> {
let namespace = if is_value { ValueNS } else { TypeNS };
let span = path.span;
let path = Segment::from_path(&path);
// FIXME(Manishearth): intra-doc links won't get warned of epoch changes.
match self.resolve_path_without_parent_scope(&path, Some(namespace), true,
span, CrateLint::No) {
PathResult::Module(ModuleOrUniformRoot::Module(module)) =>
module.res().unwrap(),
Ok(module.res().unwrap()),
PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 =>
path_res.base_res(),
Ok(path_res.base_res()),
PathResult::NonModule(..) => {
error_callback(self, span, ResolutionError::FailedToResolve {
Err((span, ResolutionError::FailedToResolve {
label: String::from("type-relative paths are not supported in this context"),
suggestion: None,
});
Res::Err
}))
}
PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),
PathResult::Failed { span, label, suggestion, .. } => {
error_callback(self, span, ResolutionError::FailedToResolve {
Err((span, ResolutionError::FailedToResolve {
label,
suggestion,
});
Res::Err
}))
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
resolver.resolve_str_path_error(DUMMY_SP, &path_str, ns == ValueNS)
})
});
let result = match result {
Ok((_, Res::Err)) => Err(()),
_ => result,
};

if let Ok((_, res)) = result {
let res = res.map_id(|_| panic!("unexpected node_id"));
Expand Down Expand Up @@ -134,6 +138,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
let (_, ty_res) = cx.enter_resolver(|resolver| resolver.with_scope(node_id, |resolver| {
resolver.resolve_str_path_error(DUMMY_SP, &path, false)
}))?;
if let Res::Err = ty_res {
return Err(());
}
let ty_res = ty_res.map_id(|_| panic!("unexpected node_id"));
match ty_res {
Res::Def(DefKind::Struct, did)
Expand Down

0 comments on commit 949b49a

Please sign in to comment.