match node {
ast::Name(name) => NameClass::classify(&sema, &name).and_then(|d| d.defined(sema.db)),
ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)),
+ ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime)
+ .map_or_else(|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(sema.db)), |d| d.defined(sema.db)),
_ => None,
}
};
ModuleDef::Static(it) => from_def_source(db, it, mod_path),
ModuleDef::Trait(it) => from_def_source(db, it, mod_path),
ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path),
- ModuleDef::BuiltinType(it) => return Some(it.to_string().into()),
+ ModuleDef::BuiltinType(it) => Some(Markup::fenced_block(&it)),
},
- Definition::Local(it) => return Some(Markup::fenced_block(&it.ty(db).display(db))),
+ Definition::Local(it) => Some(Markup::fenced_block(&it.ty(db).display(db))),
Definition::SelfType(impl_def) => {
impl_def.target_ty(db).as_adt().and_then(|adt| match adt {
Adt::Struct(it) => from_def_source(db, it, mod_path),
Adt::Enum(it) => from_def_source(db, it, mod_path),
})
}
- Definition::TypeParam(_)
- | Definition::LifetimeParam(_)
- | Definition::ConstParam(_)
- | Definition::Label(_) => {
+ Definition::Label(it) => Some(Markup::fenced_block(&it.name(db))),
+ Definition::LifetimeParam(it) => Some(Markup::fenced_block(&it.name(db))),
+ Definition::TypeParam(_) | Definition::ConstParam(_) => {
// FIXME: Hover for generic param
None
}
return tokens.max_by_key(priority);
fn priority(n: &SyntaxToken) -> usize {
match n.kind() {
- IDENT | INT_NUMBER => 3,
+ IDENT | INT_NUMBER | LIFETIME_IDENT => 3,
T!['('] | T![')'] => 2,
kind if kind.is_trivia() => 0,
_ => 1,
r#"struct TS(String, i32<|>);"#,
expect![[r#"
*i32*
+
+ ```rust
i32
+ ```
"#]],
)
}
"#,
);
}
+
+ #[test]
+ fn hover_label() {
+ check(
+ r#"
+fn foo() {
+ 'label<|>: loop {}
+}
+"#,
+ expect![[r#"
+ *'label*
+
+ ```rust
+ 'label
+ ```
+ "#]],
+ );
+ }
+
+ #[test]
+ fn hover_lifetime() {
+ check(
+ r#"fn foo<'lifetime>(_: &'lifetime<|> ()) {}"#,
+ expect![[r#"
+ *'lifetime*
+
+ ```rust
+ 'lifetime
+ ```
+ "#]],
+ );
+ }
}