about summary refs log tree commit diff
diff options
context:
space:
mode:
authorroife <roifewu@gmail.com>2024-12-31 13:05:29 +0800
committerroife <roifewu@gmail.com>2024-12-31 13:05:29 +0800
commitf581774e23f28795deca9a21a9ef159c617b83fe (patch)
treec83281b975428c55629feb0efa08051608c01492
parent65bf7f790b7427fee291f1aa0e69e5c7c2d5ecd2 (diff)
downloadrust-f581774e23f28795deca9a21a9ef159c617b83fe.tar.gz
rust-f581774e23f28795deca9a21a9ef159c617b83fe.zip
feat: show go-to-type-def actions for subst when hovering
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/hover.rs11
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/hover/render.rs2
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/hover/tests.rs47
3 files changed, 57 insertions, 3 deletions
diff --git a/src/tools/rust-analyzer/crates/ide/src/hover.rs b/src/tools/rust-analyzer/crates/ide/src/hover.rs
index e3d50fdfa90..1431bd8ca29 100644
--- a/src/tools/rust-analyzer/crates/ide/src/hover.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/hover.rs
@@ -429,7 +429,7 @@ pub(crate) fn hover_for_definition(
         &notable_traits,
         macro_arm,
         hovered_definition,
-        subst_types,
+        subst_types.as_ref(),
         config,
         edition,
     );
@@ -439,7 +439,7 @@ pub(crate) fn hover_for_definition(
             show_fn_references_action(sema.db, def),
             show_implementations_action(sema.db, def),
             runnable_action(sema, def, file_id),
-            goto_type_action_for_def(sema.db, def, &notable_traits, edition),
+            goto_type_action_for_def(sema.db, def, &notable_traits, subst_types, edition),
         ]
         .into_iter()
         .flatten()
@@ -531,6 +531,7 @@ fn goto_type_action_for_def(
     db: &RootDatabase,
     def: Definition,
     notable_traits: &[(hir::Trait, Vec<(Option<hir::Type>, hir::Name)>)],
+    subst_types: Option<Vec<(hir::Symbol, hir::Type)>>,
     edition: Edition,
 ) -> Option<HoverAction> {
     let mut targets: Vec<hir::ModuleDef> = Vec::new();
@@ -568,6 +569,12 @@ fn goto_type_action_for_def(
         walk_and_push_ty(db, &ty, &mut push_new_def);
     }
 
+    if let Some(subst_types) = subst_types {
+        for (_, ty) in subst_types {
+            walk_and_push_ty(db, &ty, &mut push_new_def);
+        }
+    }
+
     HoverAction::goto_type_from_targets(db, targets, edition)
 }
 
diff --git a/src/tools/rust-analyzer/crates/ide/src/hover/render.rs b/src/tools/rust-analyzer/crates/ide/src/hover/render.rs
index e979fa02c43..03ab9d1ba45 100644
--- a/src/tools/rust-analyzer/crates/ide/src/hover/render.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/hover/render.rs
@@ -432,7 +432,7 @@ pub(super) fn definition(
     notable_traits: &[(Trait, Vec<(Option<Type>, Name)>)],
     macro_arm: Option<u32>,
     hovered_definition: bool,
-    subst_types: Option<Vec<(Symbol, Type)>>,
+    subst_types: Option<&Vec<(Symbol, Type)>>,
     config: &HoverConfig,
     edition: Edition,
 ) -> Markup {
diff --git a/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs b/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
index 53e9763f504..aca7bd37511 100644
--- a/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
@@ -2323,6 +2323,53 @@ fn foo(Foo { b$0ar }: &Foo) {}
 }
 
 #[test]
+fn test_hover_show_type_def_for_subst() {
+    check_actions(
+        r#"
+fn f<T>(t: T) {
+
+}
+
+struct S;
+
+fn test() {
+    let a = S;
+    f$0(a);
+}
+"#,
+        expect![[r#"
+            [
+                Reference(
+                    FilePositionWrapper {
+                        file_id: FileId(
+                            0,
+                        ),
+                        offset: 3,
+                    },
+                ),
+                GoToType(
+                    [
+                        HoverGotoTypeData {
+                            mod_path: "ra_test_fixture::S",
+                            nav: NavigationTarget {
+                                file_id: FileId(
+                                    0,
+                                ),
+                                full_range: 20..29,
+                                focus_range: 27..28,
+                                name: "S",
+                                kind: Struct,
+                                description: "struct S",
+                            },
+                        },
+                    ],
+                ),
+            ]
+        "#]],
+    );
+}
+
+#[test]
 fn test_hover_non_ascii_space_doc() {
     check(
         "