diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 1 | ||||
-rw-r--r-- | crates/ide/src/hover.rs | 29 | ||||
-rw-r--r-- | crates/rust-analyzer/src/config.rs | 4 | ||||
-rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 31 |
4 files changed, 64 insertions, 1 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index b2ce739bd..d0b1db5d1 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -1062,6 +1062,7 @@ impl DefCollector<'_> { | |||
1062 | .collect(&[*mod_item]); | 1062 | .collect(&[*mod_item]); |
1063 | 1063 | ||
1064 | // Remove the original directive since we resolved it. | 1064 | // Remove the original directive since we resolved it. |
1065 | res = ReachedFixedPoint::No; | ||
1065 | return false; | 1066 | return false; |
1066 | } | 1067 | } |
1067 | } | 1068 | } |
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 573ffd10d..ed4f18e1f 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs | |||
@@ -34,6 +34,7 @@ use crate::{ | |||
34 | #[derive(Clone, Debug, PartialEq, Eq)] | 34 | #[derive(Clone, Debug, PartialEq, Eq)] |
35 | pub struct HoverConfig { | 35 | pub struct HoverConfig { |
36 | pub implementations: bool, | 36 | pub implementations: bool, |
37 | pub references: bool, | ||
37 | pub run: bool, | 38 | pub run: bool, |
38 | pub debug: bool, | 39 | pub debug: bool, |
39 | pub goto_type_def: bool, | 40 | pub goto_type_def: bool, |
@@ -44,6 +45,7 @@ pub struct HoverConfig { | |||
44 | impl HoverConfig { | 45 | impl HoverConfig { |
45 | pub const NO_ACTIONS: Self = Self { | 46 | pub const NO_ACTIONS: Self = Self { |
46 | implementations: false, | 47 | implementations: false, |
48 | references: false, | ||
47 | run: false, | 49 | run: false, |
48 | debug: false, | 50 | debug: false, |
49 | goto_type_def: false, | 51 | goto_type_def: false, |
@@ -52,7 +54,7 @@ impl HoverConfig { | |||
52 | }; | 54 | }; |
53 | 55 | ||
54 | pub fn any(&self) -> bool { | 56 | pub fn any(&self) -> bool { |
55 | self.implementations || self.runnable() || self.goto_type_def | 57 | self.implementations || self.references || self.runnable() || self.goto_type_def |
56 | } | 58 | } |
57 | 59 | ||
58 | pub fn none(&self) -> bool { | 60 | pub fn none(&self) -> bool { |
@@ -68,6 +70,7 @@ impl HoverConfig { | |||
68 | pub enum HoverAction { | 70 | pub enum HoverAction { |
69 | Runnable(Runnable), | 71 | Runnable(Runnable), |
70 | Implementation(FilePosition), | 72 | Implementation(FilePosition), |
73 | Reference(FilePosition), | ||
71 | GoToType(Vec<HoverGotoTypeData>), | 74 | GoToType(Vec<HoverGotoTypeData>), |
72 | } | 75 | } |
73 | 76 | ||
@@ -159,6 +162,10 @@ pub(crate) fn hover( | |||
159 | res.actions.push(action); | 162 | res.actions.push(action); |
160 | } | 163 | } |
161 | 164 | ||
165 | if let Some(action) = show_fn_references_action(db, definition) { | ||
166 | res.actions.push(action); | ||
167 | } | ||
168 | |||
162 | if let Some(action) = runnable_action(&sema, definition, position.file_id) { | 169 | if let Some(action) = runnable_action(&sema, definition, position.file_id) { |
163 | res.actions.push(action); | 170 | res.actions.push(action); |
164 | } | 171 | } |
@@ -262,6 +269,18 @@ fn show_implementations_action(db: &RootDatabase, def: Definition) -> Option<Hov | |||
262 | adt.try_to_nav(db).map(to_action) | 269 | adt.try_to_nav(db).map(to_action) |
263 | } | 270 | } |
264 | 271 | ||
272 | fn show_fn_references_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> { | ||
273 | match def { | ||
274 | Definition::ModuleDef(ModuleDef::Function(it)) => it.try_to_nav(db).map(|nav_target| { | ||
275 | HoverAction::Reference(FilePosition { | ||
276 | file_id: nav_target.file_id, | ||
277 | offset: nav_target.focus_or_full_range().start(), | ||
278 | }) | ||
279 | }), | ||
280 | _ => None, | ||
281 | } | ||
282 | } | ||
283 | |||
265 | fn runnable_action( | 284 | fn runnable_action( |
266 | sema: &Semantics<RootDatabase>, | 285 | sema: &Semantics<RootDatabase>, |
267 | def: Definition, | 286 | def: Definition, |
@@ -2428,6 +2447,14 @@ fn foo_$0test() {} | |||
2428 | "#, | 2447 | "#, |
2429 | expect![[r#" | 2448 | expect![[r#" |
2430 | [ | 2449 | [ |
2450 | Reference( | ||
2451 | FilePosition { | ||
2452 | file_id: FileId( | ||
2453 | 0, | ||
2454 | ), | ||
2455 | offset: 11, | ||
2456 | }, | ||
2457 | ), | ||
2431 | Runnable( | 2458 | Runnable( |
2432 | Runnable { | 2459 | Runnable { |
2433 | nav: NavigationTarget { | 2460 | nav: NavigationTarget { |
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index d1f3c1b06..3b20d741a 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs | |||
@@ -152,6 +152,9 @@ config_data! { | |||
152 | /// Whether to show `Implementations` action. Only applies when | 152 | /// Whether to show `Implementations` action. Only applies when |
153 | /// `#rust-analyzer.hoverActions.enable#` is set. | 153 | /// `#rust-analyzer.hoverActions.enable#` is set. |
154 | hoverActions_implementations: bool = "true", | 154 | hoverActions_implementations: bool = "true", |
155 | /// Whether to show `References` action. Only applies when | ||
156 | /// `#rust-analyzer.hoverActions.enable#` is set. | ||
157 | hoverActions_references: bool = "false", | ||
155 | /// Whether to show `Run` action. Only applies when | 158 | /// Whether to show `Run` action. Only applies when |
156 | /// `#rust-analyzer.hoverActions.enable#` is set. | 159 | /// `#rust-analyzer.hoverActions.enable#` is set. |
157 | hoverActions_run: bool = "true", | 160 | hoverActions_run: bool = "true", |
@@ -719,6 +722,7 @@ impl Config { | |||
719 | HoverConfig { | 722 | HoverConfig { |
720 | implementations: self.data.hoverActions_enable | 723 | implementations: self.data.hoverActions_enable |
721 | && self.data.hoverActions_implementations, | 724 | && self.data.hoverActions_implementations, |
725 | references: self.data.hoverActions_enable && self.data.hoverActions_references, | ||
722 | run: self.data.hoverActions_enable && self.data.hoverActions_run, | 726 | run: self.data.hoverActions_enable && self.data.hoverActions_run, |
723 | debug: self.data.hoverActions_enable && self.data.hoverActions_debug, | 727 | debug: self.data.hoverActions_enable && self.data.hoverActions_debug, |
724 | goto_type_def: self.data.hoverActions_enable && self.data.hoverActions_gotoTypeDef, | 728 | goto_type_def: self.data.hoverActions_enable && self.data.hoverActions_gotoTypeDef, |
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 49ee4b922..70511c5ca 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs | |||
@@ -1506,6 +1506,36 @@ fn show_impl_command_link( | |||
1506 | None | 1506 | None |
1507 | } | 1507 | } |
1508 | 1508 | ||
1509 | fn show_ref_command_link( | ||
1510 | snap: &GlobalStateSnapshot, | ||
1511 | position: &FilePosition, | ||
1512 | ) -> Option<lsp_ext::CommandLinkGroup> { | ||
1513 | if snap.config.hover().implementations { | ||
1514 | if let Some(ref_search_res) = snap.analysis.find_all_refs(*position, None).unwrap_or(None) { | ||
1515 | let uri = to_proto::url(snap, position.file_id); | ||
1516 | let line_index = snap.file_line_index(position.file_id).ok()?; | ||
1517 | let position = to_proto::position(&line_index, position.offset); | ||
1518 | let locations: Vec<_> = ref_search_res | ||
1519 | .references | ||
1520 | .into_iter() | ||
1521 | .flat_map(|(file_id, ranges)| { | ||
1522 | ranges.into_iter().filter_map(move |(range, _)| { | ||
1523 | to_proto::location(snap, FileRange { file_id, range }).ok() | ||
1524 | }) | ||
1525 | }) | ||
1526 | .collect(); | ||
1527 | let title = to_proto::reference_title(locations.len()); | ||
1528 | let command = to_proto::command::show_references(title, &uri, position, locations); | ||
1529 | |||
1530 | return Some(lsp_ext::CommandLinkGroup { | ||
1531 | commands: vec![to_command_link(command, "Go to references".into())], | ||
1532 | ..Default::default() | ||
1533 | }); | ||
1534 | } | ||
1535 | } | ||
1536 | None | ||
1537 | } | ||
1538 | |||
1509 | fn runnable_action_links( | 1539 | fn runnable_action_links( |
1510 | snap: &GlobalStateSnapshot, | 1540 | snap: &GlobalStateSnapshot, |
1511 | runnable: Runnable, | 1541 | runnable: Runnable, |
@@ -1566,6 +1596,7 @@ fn prepare_hover_actions( | |||
1566 | .iter() | 1596 | .iter() |
1567 | .filter_map(|it| match it { | 1597 | .filter_map(|it| match it { |
1568 | HoverAction::Implementation(position) => show_impl_command_link(snap, position), | 1598 | HoverAction::Implementation(position) => show_impl_command_link(snap, position), |
1599 | HoverAction::Reference(position) => show_ref_command_link(snap, position), | ||
1569 | HoverAction::Runnable(r) => runnable_action_links(snap, r.clone()), | 1600 | HoverAction::Runnable(r) => runnable_action_links(snap, r.clone()), |
1570 | HoverAction::GoToType(targets) => goto_type_action_links(snap, targets), | 1601 | HoverAction::GoToType(targets) => goto_type_action_links(snap, targets), |
1571 | }) | 1602 | }) |