diff options
Diffstat (limited to 'crates/ide/src/hover.rs')
-rw-r--r-- | crates/ide/src/hover.rs | 113 |
1 files changed, 110 insertions, 3 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 1e66219e4..9de653739 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs | |||
@@ -82,6 +82,8 @@ pub struct HoverResult { | |||
82 | // | 82 | // |
83 | // Shows additional information, like type of an expression or documentation for definition when "focusing" code. | 83 | // Shows additional information, like type of an expression or documentation for definition when "focusing" code. |
84 | // Focusing is usually hovering with a mouse, but can also be triggered with a shortcut. | 84 | // Focusing is usually hovering with a mouse, but can also be triggered with a shortcut. |
85 | // | ||
86 | // image::https://user-images.githubusercontent.com/48062697/113020658-b5f98b80-917a-11eb-9f88-3dbc27320c95.gif[] | ||
85 | pub(crate) fn hover( | 87 | pub(crate) fn hover( |
86 | db: &RootDatabase, | 88 | db: &RootDatabase, |
87 | position: FilePosition, | 89 | position: FilePosition, |
@@ -203,7 +205,7 @@ fn show_implementations_action(db: &RootDatabase, def: Definition) -> Option<Hov | |||
203 | let adt = match def { | 205 | let adt = match def { |
204 | Definition::ModuleDef(ModuleDef::Trait(it)) => return it.try_to_nav(db).map(to_action), | 206 | Definition::ModuleDef(ModuleDef::Trait(it)) => return it.try_to_nav(db).map(to_action), |
205 | Definition::ModuleDef(ModuleDef::Adt(it)) => Some(it), | 207 | Definition::ModuleDef(ModuleDef::Adt(it)) => Some(it), |
206 | Definition::SelfType(it) => it.target_ty(db).as_adt(), | 208 | Definition::SelfType(it) => it.self_ty(db).as_adt(), |
207 | _ => None, | 209 | _ => None, |
208 | }?; | 210 | }?; |
209 | adt.try_to_nav(db).map(to_action) | 211 | adt.try_to_nav(db).map(to_action) |
@@ -326,7 +328,7 @@ fn definition_owner_name(db: &RootDatabase, def: &Definition) -> Option<String> | |||
326 | Definition::ModuleDef(md) => match md { | 328 | Definition::ModuleDef(md) => match md { |
327 | ModuleDef::Function(f) => match f.as_assoc_item(db)?.container(db) { | 329 | ModuleDef::Function(f) => match f.as_assoc_item(db)?.container(db) { |
328 | AssocItemContainer::Trait(t) => Some(t.name(db)), | 330 | AssocItemContainer::Trait(t) => Some(t.name(db)), |
329 | AssocItemContainer::Impl(i) => i.target_ty(db).as_adt().map(|adt| adt.name(db)), | 331 | AssocItemContainer::Impl(i) => i.self_ty(db).as_adt().map(|adt| adt.name(db)), |
330 | }, | 332 | }, |
331 | ModuleDef::Variant(e) => Some(e.parent_enum(db).name(db)), | 333 | ModuleDef::Variant(e) => Some(e.parent_enum(db).name(db)), |
332 | _ => None, | 334 | _ => None, |
@@ -384,7 +386,7 @@ fn hover_for_definition( | |||
384 | }, | 386 | }, |
385 | Definition::Local(it) => hover_for_local(it, db), | 387 | Definition::Local(it) => hover_for_local(it, db), |
386 | Definition::SelfType(impl_def) => { | 388 | Definition::SelfType(impl_def) => { |
387 | impl_def.target_ty(db).as_adt().and_then(|adt| from_hir_fmt(db, adt, mod_path)) | 389 | impl_def.self_ty(db).as_adt().and_then(|adt| from_hir_fmt(db, adt, mod_path)) |
388 | } | 390 | } |
389 | Definition::GenericParam(it) => from_hir_fmt(db, it, None), | 391 | Definition::GenericParam(it) => from_hir_fmt(db, it, None), |
390 | Definition::Label(it) => Some(Markup::fenced_block(&it.name(db))), | 392 | Definition::Label(it) => Some(Markup::fenced_block(&it.name(db))), |
@@ -3850,4 +3852,109 @@ pub fn gimme() -> theitem::TheItem { | |||
3850 | "#]], | 3852 | "#]], |
3851 | ); | 3853 | ); |
3852 | } | 3854 | } |
3855 | |||
3856 | #[test] | ||
3857 | fn hover_generic_assoc() { | ||
3858 | check( | ||
3859 | r#" | ||
3860 | fn foo<T: A>() where T::Assoc$0: {} | ||
3861 | |||
3862 | trait A { | ||
3863 | type Assoc; | ||
3864 | }"#, | ||
3865 | expect![[r#" | ||
3866 | *Assoc* | ||
3867 | |||
3868 | ```rust | ||
3869 | test | ||
3870 | ``` | ||
3871 | |||
3872 | ```rust | ||
3873 | type Assoc | ||
3874 | ``` | ||
3875 | "#]], | ||
3876 | ); | ||
3877 | check( | ||
3878 | r#" | ||
3879 | fn foo<T: A>() { | ||
3880 | let _: <T>::Assoc$0; | ||
3881 | } | ||
3882 | |||
3883 | trait A { | ||
3884 | type Assoc; | ||
3885 | }"#, | ||
3886 | expect![[r#" | ||
3887 | *Assoc* | ||
3888 | |||
3889 | ```rust | ||
3890 | test | ||
3891 | ``` | ||
3892 | |||
3893 | ```rust | ||
3894 | type Assoc | ||
3895 | ``` | ||
3896 | "#]], | ||
3897 | ); | ||
3898 | check( | ||
3899 | r#" | ||
3900 | trait A where | ||
3901 | Self::Assoc$0: , | ||
3902 | { | ||
3903 | type Assoc; | ||
3904 | }"#, | ||
3905 | expect![[r#" | ||
3906 | *Assoc* | ||
3907 | |||
3908 | ```rust | ||
3909 | test | ||
3910 | ``` | ||
3911 | |||
3912 | ```rust | ||
3913 | type Assoc | ||
3914 | ``` | ||
3915 | "#]], | ||
3916 | ); | ||
3917 | } | ||
3918 | |||
3919 | #[test] | ||
3920 | fn string_shadowed_with_inner_items() { | ||
3921 | check( | ||
3922 | r#" | ||
3923 | //- /main.rs crate:main deps:alloc | ||
3924 | |||
3925 | /// Custom `String` type. | ||
3926 | struct String; | ||
3927 | |||
3928 | fn f() { | ||
3929 | let _: String$0; | ||
3930 | |||
3931 | fn inner() {} | ||
3932 | } | ||
3933 | |||
3934 | //- /alloc.rs crate:alloc | ||
3935 | #[prelude_import] | ||
3936 | pub use string::*; | ||
3937 | |||
3938 | mod string { | ||
3939 | /// This is `alloc::String`. | ||
3940 | pub struct String; | ||
3941 | } | ||
3942 | "#, | ||
3943 | expect![[r#" | ||
3944 | *String* | ||
3945 | |||
3946 | ```rust | ||
3947 | main | ||
3948 | ``` | ||
3949 | |||
3950 | ```rust | ||
3951 | struct String | ||
3952 | ``` | ||
3953 | |||
3954 | --- | ||
3955 | |||
3956 | Custom `String` type. | ||
3957 | "#]], | ||
3958 | ) | ||
3959 | } | ||
3853 | } | 3960 | } |