diff options
| author | roife <roifewu@gmail.com> | 2024-12-31 13:05:29 +0800 |
|---|---|---|
| committer | roife <roifewu@gmail.com> | 2024-12-31 13:05:29 +0800 |
| commit | f581774e23f28795deca9a21a9ef159c617b83fe (patch) | |
| tree | c83281b975428c55629feb0efa08051608c01492 | |
| parent | 65bf7f790b7427fee291f1aa0e69e5c7c2d5ecd2 (diff) | |
| download | rust-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.rs | 11 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide/src/hover/render.rs | 2 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide/src/hover/tests.rs | 47 |
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( ¬able_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, ¬able_traits, edition), + goto_type_action_for_def(sema.db, def, ¬able_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( " |
