aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src')
-rw-r--r--crates/ide/src/hover.rs29
1 files changed, 28 insertions, 1 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index 04598cd06..455a27e48 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -28,6 +28,7 @@ use crate::{
28#[derive(Clone, Debug, PartialEq, Eq)] 28#[derive(Clone, Debug, PartialEq, Eq)]
29pub struct HoverConfig { 29pub struct HoverConfig {
30 pub implementations: bool, 30 pub implementations: bool,
31 pub references: bool,
31 pub run: bool, 32 pub run: bool,
32 pub debug: bool, 33 pub debug: bool,
33 pub goto_type_def: bool, 34 pub goto_type_def: bool,
@@ -38,6 +39,7 @@ pub struct HoverConfig {
38impl HoverConfig { 39impl HoverConfig {
39 pub const NO_ACTIONS: Self = Self { 40 pub const NO_ACTIONS: Self = Self {
40 implementations: false, 41 implementations: false,
42 references: false,
41 run: false, 43 run: false,
42 debug: false, 44 debug: false,
43 goto_type_def: false, 45 goto_type_def: false,
@@ -46,7 +48,7 @@ impl HoverConfig {
46 }; 48 };
47 49
48 pub fn any(&self) -> bool { 50 pub fn any(&self) -> bool {
49 self.implementations || self.runnable() || self.goto_type_def 51 self.implementations || self.references || self.runnable() || self.goto_type_def
50 } 52 }
51 53
52 pub fn none(&self) -> bool { 54 pub fn none(&self) -> bool {
@@ -62,6 +64,7 @@ impl HoverConfig {
62pub enum HoverAction { 64pub enum HoverAction {
63 Runnable(Runnable), 65 Runnable(Runnable),
64 Implementation(FilePosition), 66 Implementation(FilePosition),
67 Reference(FilePosition),
65 GoToType(Vec<HoverGotoTypeData>), 68 GoToType(Vec<HoverGotoTypeData>),
66} 69}
67 70
@@ -148,6 +151,10 @@ pub(crate) fn hover(
148 res.actions.push(action); 151 res.actions.push(action);
149 } 152 }
150 153
154 if let Some(action) = show_fn_references_action(db, definition) {
155 res.actions.push(action);
156 }
157
151 if let Some(action) = runnable_action(&sema, definition, position.file_id) { 158 if let Some(action) = runnable_action(&sema, definition, position.file_id) {
152 res.actions.push(action); 159 res.actions.push(action);
153 } 160 }
@@ -211,6 +218,18 @@ fn show_implementations_action(db: &RootDatabase, def: Definition) -> Option<Hov
211 adt.try_to_nav(db).map(to_action) 218 adt.try_to_nav(db).map(to_action)
212} 219}
213 220
221fn show_fn_references_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> {
222 match def {
223 Definition::ModuleDef(ModuleDef::Function(it)) => it.try_to_nav(db).map(|nav_target| {
224 HoverAction::Reference(FilePosition {
225 file_id: nav_target.file_id,
226 offset: nav_target.focus_or_full_range().start(),
227 })
228 }),
229 _ => None,
230 }
231}
232
214fn runnable_action( 233fn runnable_action(
215 sema: &Semantics<RootDatabase>, 234 sema: &Semantics<RootDatabase>,
216 def: Definition, 235 def: Definition,
@@ -2377,6 +2396,14 @@ fn foo_$0test() {}
2377"#, 2396"#,
2378 expect![[r#" 2397 expect![[r#"
2379 [ 2398 [
2399 Reference(
2400 FilePosition {
2401 file_id: FileId(
2402 0,
2403 ),
2404 offset: 11,
2405 },
2406 ),
2380 Runnable( 2407 Runnable(
2381 Runnable { 2408 Runnable {
2382 nav: NavigationTarget { 2409 nav: NavigationTarget {