Skip to content

Commit a53c5de

Browse files
committed
Add an explanatory message when we use the Query fallback
1 parent a2659ab commit a53c5de

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

crates/ra_ide_api/src/goto_definition.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ pub(crate) fn goto_definition(
1313
let file = db.source_file(position.file_id);
1414
let syntax = file.syntax();
1515
if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) {
16-
let navs = reference_definition(db, position.file_id, name_ref)?;
17-
return Ok(Some(RangeInfo::new(name_ref.syntax().range(), navs)));
16+
let navs = reference_definition(db, position.file_id, name_ref)?.to_vec();
17+
return Ok(Some(RangeInfo::new(
18+
name_ref.syntax().range(),
19+
navs.to_vec(),
20+
)));
1821
}
1922
if let Some(name) = find_node_at_offset::<ast::Name>(syntax, position.offset) {
2023
let navs = ctry!(name_definition(db, position.file_id, name)?);
@@ -23,19 +26,35 @@ pub(crate) fn goto_definition(
2326
Ok(None)
2427
}
2528

29+
pub(crate) enum ReferenceResult {
30+
Exact(NavigationTarget),
31+
Approximate(Vec<NavigationTarget>),
32+
}
33+
34+
impl ReferenceResult {
35+
fn to_vec(self) -> Vec<NavigationTarget> {
36+
use self::ReferenceResult::*;
37+
match self {
38+
Exact(target) => vec![target],
39+
Approximate(vec) => vec,
40+
}
41+
}
42+
}
43+
2644
pub(crate) fn reference_definition(
2745
db: &RootDatabase,
2846
file_id: FileId,
2947
name_ref: &ast::NameRef,
30-
) -> Cancelable<Vec<NavigationTarget>> {
48+
) -> Cancelable<ReferenceResult> {
49+
use self::ReferenceResult::*;
3150
if let Some(fn_descr) =
3251
hir::source_binder::function_from_child_node(db, file_id, name_ref.syntax())?
3352
{
3453
let scope = fn_descr.scopes(db)?;
3554
// First try to resolve the symbol locally
3655
if let Some(entry) = scope.resolve_local_name(name_ref) {
3756
let nav = NavigationTarget::from_scope_entry(file_id, &entry);
38-
return Ok(vec![nav]);
57+
return Ok(Exact(nav));
3958
};
4059
}
4160
// Then try module name resolution
@@ -51,7 +70,7 @@ pub(crate) fn reference_definition(
5170
let resolved = module.resolve_path(db, &path)?;
5271
if let Some(def_id) = resolved.take_types().or(resolved.take_values()) {
5372
if let Some(target) = NavigationTarget::from_def(db, def_id.resolve(db)?)? {
54-
return Ok(vec![target]);
73+
return Ok(Exact(target));
5574
}
5675
}
5776
}
@@ -62,7 +81,7 @@ pub(crate) fn reference_definition(
6281
.into_iter()
6382
.map(NavigationTarget::from_symbol)
6483
.collect();
65-
Ok(navs)
84+
Ok(Approximate(navs))
6685
}
6786

6887
fn name_definition(

crates/ra_ide_api/src/hover.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,16 @@ pub(crate) fn hover(
1616

1717
let mut range = None;
1818
if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(file.syntax(), position.offset) {
19-
let navs = crate::goto_definition::reference_definition(db, position.file_id, name_ref)?;
20-
for nav in navs {
21-
res.extend(doc_text_for(db, nav)?)
19+
use crate::goto_definition::{ReferenceResult::*, reference_definition};
20+
let ref_result = reference_definition(db, position.file_id, name_ref)?;
21+
match ref_result {
22+
Exact(nav) => res.extend(doc_text_for(db, nav)?),
23+
Approximate(navs) => {
24+
res.push("Failed to exactly resolve the symbol. This is probably because rust_analyzer does not yet support glob imports or traits. \nThese methods were found instead:".to_string());
25+
for nav in navs {
26+
res.extend(doc_text_for(db, nav)?)
27+
}
28+
}
2229
}
2330
if !res.is_empty() {
2431
range = Some(name_ref.syntax().range())
@@ -34,7 +41,7 @@ pub(crate) fn hover(
3441
file_id: position.file_id,
3542
range: node.range(),
3643
};
37-
res.extend(type_of(db, frange)?);
44+
res.extend(type_of(db, frange)?.map(Into::into));
3845
range = Some(node.range());
3946
};
4047

0 commit comments

Comments
 (0)