diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index a528b2bc2d1..4fdcb88bbf0 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1497,6 +1497,10 @@ impl Static { db.static_data(self.id).mutable } + pub fn value(self, db: &dyn HirDatabase) -> Option { + self.source(db)?.value.body() + } + pub fn ty(self, db: &dyn HirDatabase) -> Type { let data = db.static_data(self.id); let resolver = self.id.resolver(db.upcast()); diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs index 46fe7f2b7d2..e872d9b1fb2 100644 --- a/crates/ide/src/hover/render.rs +++ b/crates/ide/src/hover/render.rs @@ -1,6 +1,8 @@ //! Logic for rendering the different hover messages +use std::fmt::Display; + use either::Either; -use hir::{AsAssocItem, Const, HasAttrs, HasSource, HirDisplay, Semantics, TypeInfo}; +use hir::{AsAssocItem, HasAttrs, HasSource, HirDisplay, Semantics, TypeInfo}; use ide_db::{ base_db::SourceDatabase, defs::Definition, @@ -352,8 +354,8 @@ pub(super) fn definition( Definition::Function(it) => label_and_docs(db, it), Definition::Adt(it) => label_and_docs(db, it), Definition::Variant(it) => label_and_docs(db, it), - Definition::Const(it) => const_label_value_and_docs(db, it), - Definition::Static(it) => label_and_docs(db, it), + Definition::Const(it) => label_value_and_docs(db, it, |it| it.value(db)), + Definition::Static(it) => label_value_and_docs(db, it, |it| it.value(db)), Definition::Trait(it) => label_and_docs(db, it), Definition::TypeAlias(it) => label_and_docs(db, it), Definition::BuiltinType(it) => { @@ -381,18 +383,22 @@ where (label, docs) } -fn const_label_value_and_docs( +fn label_value_and_docs( db: &RootDatabase, - konst: Const, -) -> (String, Option) { - let label = if let Some(expr) = konst.value(db) { - format!("{} = {}", konst.display(db), expr) + def: D, + value_extractor: E, +) -> (String, Option) +where + D: HasAttrs + HirDisplay, + E: Fn(&D) -> Option, + V: Display, +{ + let label = if let Some(value) = (value_extractor)(&def) { + format!("{} = {}", def.display(db), value) } else { - konst.display(db).to_string() + def.display(db).to_string() }; - - let docs = konst.attrs(db).docs(); - + let docs = def.attrs(db).docs(); (label, docs) } diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs index 897f8d7b831..91a4db33fb2 100644 --- a/crates/ide/src/hover/tests.rs +++ b/crates/ide/src/hover/tests.rs @@ -539,16 +539,16 @@ const foo$0: u32 = { check( r#"static foo$0: u32 = 456;"#, expect![[r#" - *foo* + *foo* - ```rust - test - ``` + ```rust + test + ``` - ```rust - static foo: u32 - ``` - "#]], + ```rust + static foo: u32 = 456 + ``` + "#]], ); }