942: Hover for associated items in patterns r=matklad a=kjeremy



Co-authored-by: kjeremy <kjeremy@gmail.com>
This commit is contained in:
bors[bot] 2019-03-07 09:57:04 +00:00
commit b94e1eee83
2 changed files with 46 additions and 4 deletions

View file

@ -100,6 +100,7 @@ pub(crate) fn reference_definition(
} }
} }
} }
// Try name resolution // Try name resolution
let resolver = hir::source_binder::resolver_for_node(db, file_id, name_ref.syntax()); let resolver = hir::source_binder::resolver_for_node(db, file_id, name_ref.syntax());
if let Some(path) = if let Some(path) =
@ -126,17 +127,35 @@ pub(crate) fn reference_definition(
None => { None => {
// If we failed to resolve then check associated items // If we failed to resolve then check associated items
if let Some(function) = function { if let Some(function) = function {
// Should we do this above and then grab path from the PathExpr? // Resolve associated item for path expressions
if let Some(path_expr) = if let Some(path_expr) =
name_ref.syntax().ancestors().find_map(ast::PathExpr::cast) name_ref.syntax().ancestors().find_map(ast::PathExpr::cast)
{ {
let infer_result = function.infer(db); let infer_result = function.infer(db);
let source_map = function.body_source_map(db); let source_map = function.body_source_map(db);
let expr = ast::Expr::cast(path_expr.syntax()).unwrap();
if let Some(expr) = ast::Expr::cast(path_expr.syntax()) {
if let Some(res) = source_map
.node_expr(expr)
.and_then(|it| infer_result.assoc_resolutions_for_expr(it.into()))
{
return Exact(NavigationTarget::from_impl_item(db, res));
}
}
}
// Resolve associated item for path patterns
if let Some(path_pat) =
name_ref.syntax().ancestors().find_map(ast::PathPat::cast)
{
let infer_result = function.infer(db);
let source_map = function.body_source_map(db);
let pat: &ast::Pat = path_pat.into();
if let Some(res) = source_map if let Some(res) = source_map
.node_expr(expr) .node_pat(pat)
.and_then(|it| infer_result.assoc_resolutions_for_expr(it.into())) .and_then(|it| infer_result.assoc_resolutions_for_pat(it.into()))
{ {
return Exact(NavigationTarget::from_impl_item(db, res)); return Exact(NavigationTarget::from_impl_item(db, res));
} }

View file

@ -534,4 +534,27 @@ mod tests {
assert_eq!(trim_markup_opt(hover.info.first()), Some("fn new() -> Thing")); assert_eq!(trim_markup_opt(hover.info.first()), Some("fn new() -> Thing"));
assert_eq!(hover.info.is_exact(), true); assert_eq!(hover.info.is_exact(), true);
} }
#[test]
fn test_hover_infer_associated_const_in_pattern() {
let (analysis, position) = single_file_with_position(
"
struct X;
impl X {
const C: u32 = 1;
}
fn main() {
match 1 {
X::C<|> => {},
2 => {},
_ => {}
};
}
",
);
let hover = analysis.hover(position).unwrap().unwrap();
assert_eq!(trim_markup_opt(hover.info.first()), Some("const C: u32"));
assert_eq!(hover.info.is_exact(), true);
}
} }