Unnamed repository; edit this file 'description' to name the repository.
ide: display static values in hover
Jake Heinz 2021-11-18
parent 64a73dc · commit e8d0989
-rw-r--r--crates/hir/src/lib.rs4
-rw-r--r--crates/ide/src/hover/render.rs30
-rw-r--r--crates/ide/src/hover/tests.rs16
3 files changed, 30 insertions, 20 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index a528b2bc2d..4fdcb88bbf 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<ast::Expr> {
+ 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 46fe7f2b7d..e872d9b1fb 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<D, E, V>(
db: &RootDatabase,
- konst: Const,
-) -> (String, Option<hir::Documentation>) {
- let label = if let Some(expr) = konst.value(db) {
- format!("{} = {}", konst.display(db), expr)
+ def: D,
+ value_extractor: E,
+) -> (String, Option<hir::Documentation>)
+where
+ D: HasAttrs + HirDisplay,
+ E: Fn(&D) -> Option<V>,
+ 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 897f8d7b83..91a4db33fb 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
+ ```
+ "#]],
);
}