aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/hover.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/hover.rs')
-rw-r--r--crates/ide/src/hover.rs47
1 files changed, 43 insertions, 4 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index 73245fbe7..98c7bfbe5 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -109,6 +109,8 @@ pub(crate) fn hover(
109 match node { 109 match node {
110 ast::Name(name) => NameClass::classify(&sema, &name).and_then(|d| d.defined(sema.db)), 110 ast::Name(name) => NameClass::classify(&sema, &name).and_then(|d| d.defined(sema.db)),
111 ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), 111 ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)),
112 ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime)
113 .map_or_else(|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(sema.db)), |d| d.defined(sema.db)),
112 _ => None, 114 _ => None,
113 } 115 }
114 }; 116 };
@@ -360,9 +362,9 @@ fn hover_for_definition(db: &RootDatabase, def: Definition) -> Option<Markup> {
360 ModuleDef::Static(it) => from_def_source(db, it, mod_path), 362 ModuleDef::Static(it) => from_def_source(db, it, mod_path),
361 ModuleDef::Trait(it) => from_def_source(db, it, mod_path), 363 ModuleDef::Trait(it) => from_def_source(db, it, mod_path),
362 ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path), 364 ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path),
363 ModuleDef::BuiltinType(it) => return Some(it.to_string().into()), 365 ModuleDef::BuiltinType(it) => Some(Markup::fenced_block(&it)),
364 }, 366 },
365 Definition::Local(it) => return Some(Markup::fenced_block(&it.ty(db).display(db))), 367 Definition::Local(it) => Some(Markup::fenced_block(&it.ty(db).display(db))),
366 Definition::SelfType(impl_def) => { 368 Definition::SelfType(impl_def) => {
367 impl_def.target_ty(db).as_adt().and_then(|adt| match adt { 369 impl_def.target_ty(db).as_adt().and_then(|adt| match adt {
368 Adt::Struct(it) => from_def_source(db, it, mod_path), 370 Adt::Struct(it) => from_def_source(db, it, mod_path),
@@ -370,7 +372,9 @@ fn hover_for_definition(db: &RootDatabase, def: Definition) -> Option<Markup> {
370 Adt::Enum(it) => from_def_source(db, it, mod_path), 372 Adt::Enum(it) => from_def_source(db, it, mod_path),
371 }) 373 })
372 } 374 }
373 Definition::TypeParam(_) | Definition::LifetimeParam(_) | Definition::Label(_) => { 375 Definition::Label(it) => Some(Markup::fenced_block(&it.name(db))),
376 Definition::LifetimeParam(it) => Some(Markup::fenced_block(&it.name(db))),
377 Definition::TypeParam(_) | Definition::ConstParam(_) => {
374 // FIXME: Hover for generic param 378 // FIXME: Hover for generic param
375 None 379 None
376 } 380 }
@@ -403,7 +407,7 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
403 return tokens.max_by_key(priority); 407 return tokens.max_by_key(priority);
404 fn priority(n: &SyntaxToken) -> usize { 408 fn priority(n: &SyntaxToken) -> usize {
405 match n.kind() { 409 match n.kind() {
406 IDENT | INT_NUMBER => 3, 410 IDENT | INT_NUMBER | LIFETIME_IDENT => 3,
407 T!['('] | T![')'] => 2, 411 T!['('] | T![')'] => 2,
408 kind if kind.is_trivia() => 0, 412 kind if kind.is_trivia() => 0,
409 _ => 1, 413 _ => 1,
@@ -1169,7 +1173,10 @@ fn f() { fo<|>o!(); }
1169 r#"struct TS(String, i32<|>);"#, 1173 r#"struct TS(String, i32<|>);"#,
1170 expect![[r#" 1174 expect![[r#"
1171 *i32* 1175 *i32*
1176
1177 ```rust
1172 i32 1178 i32
1179 ```
1173 "#]], 1180 "#]],
1174 ) 1181 )
1175 } 1182 }
@@ -3221,4 +3228,36 @@ fn no_hover() {
3221"#, 3228"#,
3222 ); 3229 );
3223 } 3230 }
3231
3232 #[test]
3233 fn hover_label() {
3234 check(
3235 r#"
3236fn foo() {
3237 'label<|>: loop {}
3238}
3239"#,
3240 expect![[r#"
3241 *'label*
3242
3243 ```rust
3244 'label
3245 ```
3246 "#]],
3247 );
3248 }
3249
3250 #[test]
3251 fn hover_lifetime() {
3252 check(
3253 r#"fn foo<'lifetime>(_: &'lifetime<|> ()) {}"#,
3254 expect![[r#"
3255 *'lifetime*
3256
3257 ```rust
3258 'lifetime
3259 ```
3260 "#]],
3261 );
3262 }
3224} 3263}