about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-11-18 09:48:10 +0000
committerGitHub <noreply@github.com>2021-11-18 09:48:10 +0000
commitbf8cf09967b79fc6c6556b1c319e70a829c13ac9 (patch)
tree229685fca34f9533fb29eb90eaba6b5d4abe2e38
parentb844d453b2cf2c7928cf6c4969616d4e089c4e21 (diff)
parente8d098960627f2e1a6ee78c8699e314b76793c7f (diff)
Merge #10796
10796: ide: display static values in hover r=Veykril a=jhgg

Continuation from #10785 - does the same thing, but for `static`'s as well.

Co-authored-by: Jake Heinz <jh@discordapp.com>
-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 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<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 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<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 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
+            ```
+        "#]],
     );
 }