about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYury Ivanou <lumenian@gmail.com>2023-05-07 18:21:07 +0300
committerYury Ivanou <lumenian@gmail.com>2023-05-07 18:21:07 +0300
commit4ed0fa84145772419e3940aa450cec51f41fa3ba (patch)
tree8eaa0c368277fe98daeaef98c5c6be96645de8c7
parentecc081d6252007ab1ef3749646e7c733296f827b (diff)
downloadrust-4ed0fa84145772419e3940aa450cec51f41fa3ba.tar.gz
rust-4ed0fa84145772419e3940aa450cec51f41fa3ba.zip
Add config for disabling hover memory layout data
-rw-r--r--crates/ide/src/hover.rs1
-rw-r--r--crates/ide/src/hover/render.rs14
-rw-r--r--crates/ide/src/hover/tests.rs38
-rw-r--r--crates/ide/src/static_index.rs1
-rw-r--r--crates/rust-analyzer/src/config.rs5
-rw-r--r--docs/user/generated_config.adoc7
-rw-r--r--editors/code/package.json7
7 files changed, 63 insertions, 10 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index c47f85b7bf9..baaf8c80480 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -27,6 +27,7 @@ use crate::{
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub struct HoverConfig {
     pub links_in_hover: bool,
+    pub memory_layout: bool,
     pub documentation: bool,
     pub keywords: bool,
     pub format: HoverDocFormat,
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index a7c50081e46..078a4de671e 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -415,7 +415,7 @@ pub(super) fn definition(
     let mod_path = definition_mod_path(db, &def);
     let (label, docs) = match def {
         Definition::Macro(it) => label_and_docs(db, it),
-        Definition::Field(it) => label_and_layout_info_and_docs(db, it, |&it| {
+        Definition::Field(it) => label_and_layout_info_and_docs(db, it, config, |&it| {
             let var_def = it.parent_def(db);
             let id = it.index();
             let layout = it.layout(db).ok()?;
@@ -435,7 +435,7 @@ pub(super) fn definition(
         }),
         Definition::Module(it) => label_and_docs(db, it),
         Definition::Function(it) => label_and_docs(db, it),
-        Definition::Adt(it) => label_and_layout_info_and_docs(db, it, |&it| {
+        Definition::Adt(it) => label_and_layout_info_and_docs(db, it, config, |&it| {
             let layout = it.layout(db).ok()?;
             Some(format!("size = {}, align = {}", layout.size.bytes(), layout.align.abi.bytes()))
         }),
@@ -473,7 +473,7 @@ pub(super) fn definition(
         }),
         Definition::Trait(it) => label_and_docs(db, it),
         Definition::TraitAlias(it) => label_and_docs(db, it),
-        Definition::TypeAlias(it) => label_and_layout_info_and_docs(db, it, |&it| {
+        Definition::TypeAlias(it) => label_and_layout_info_and_docs(db, it, config, |&it| {
             let layout = it.ty(db).layout(db).ok()?;
             Some(format!("size = {}, align = {}", layout.size.bytes(), layout.align.abi.bytes()))
         }),
@@ -577,6 +577,7 @@ where
 fn label_and_layout_info_and_docs<D, E, V>(
     db: &RootDatabase,
     def: D,
+    config: &HoverConfig,
     value_extractor: E,
 ) -> (String, Option<hir::Documentation>)
 where
@@ -584,10 +585,9 @@ where
     E: Fn(&D) -> Option<V>,
     V: Display,
 {
-    let label = if let Some(value) = value_extractor(&def) {
-        format!("{} // {value}", def.display(db))
-    } else {
-        def.display(db).to_string()
+    let label = match value_extractor(&def) {
+        Some(value) if config.memory_layout => format!("{} // {value}", def.display(db)),
+        _ => def.display(db).to_string(),
     };
     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 04d239d255e..559571a1a41 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -6,6 +6,7 @@ use crate::{fixture, HoverConfig, HoverDocFormat};
 
 const HOVER_BASE_CONFIG: HoverConfig = HoverConfig {
     links_in_hover: false,
+    memory_layout: true,
     documentation: true,
     format: HoverDocFormat::Markdown,
     keywords: true,
@@ -57,6 +58,23 @@ fn check_hover_no_links(ra_fixture: &str, expect: Expect) {
     expect.assert_eq(&actual)
 }
 
+fn check_hover_no_memory_layout(ra_fixture: &str, expect: Expect) {
+    let (analysis, position) = fixture::position(ra_fixture);
+    let hover = analysis
+        .hover(
+            &HoverConfig { memory_layout: false, ..HOVER_BASE_CONFIG },
+            FileRange { file_id: position.file_id, range: TextRange::empty(position.offset) },
+        )
+        .unwrap()
+        .unwrap();
+
+    let content = analysis.db.file_text(position.file_id);
+    let hovered_element = &content[hover.range];
+
+    let actual = format!("*{hovered_element}*\n{}\n", hover.info.markup);
+    expect.assert_eq(&actual)
+}
+
 fn check_hover_no_markdown(ra_fixture: &str, expect: Expect) {
     let (analysis, position) = fixture::position(ra_fixture);
     let hover = analysis
@@ -1746,6 +1764,26 @@ pub fn fo$0o() {}
 }
 
 #[test]
+fn test_hover_no_memory_layout() {
+    check_hover_no_memory_layout(
+        r#"
+struct Foo { fiel$0d_a: u8, field_b: i32, field_c: i16 }
+"#,
+        expect![[r#"
+            *field_a*
+
+            ```rust
+            test::Foo
+            ```
+
+            ```rust
+            field_a: u8
+            ```
+        "#]],
+    );
+}
+
+#[test]
 fn test_hover_macro_generated_struct_fn_doc_comment() {
     cov_mark::check!(hover_macro_generated_struct_fn_doc_comment);
 
diff --git a/crates/ide/src/static_index.rs b/crates/ide/src/static_index.rs
index 7ce20e973bb..dd6ec21ffff 100644
--- a/crates/ide/src/static_index.rs
+++ b/crates/ide/src/static_index.rs
@@ -137,6 +137,7 @@ impl StaticIndex<'_> {
         });
         let hover_config = HoverConfig {
             links_in_hover: true,
+            memory_layout: true,
             documentation: true,
             keywords: true,
             format: crate::HoverDocFormat::Markdown,
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 51874382a8b..cfb86e8a92a 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -313,8 +313,10 @@ config_data! {
         /// Whether to show keyword hover popups. Only applies when
         /// `#rust-analyzer.hover.documentation.enable#` is set.
         hover_documentation_keywords_enable: bool  = "true",
-        /// Use markdown syntax for links in hover.
+        /// Use markdown syntax for links on hover.
         hover_links_enable: bool = "true",
+        /// Whether to show memory layout data on hover.
+        hover_memory_layout_enable: bool = "true",
 
         /// Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.
         imports_granularity_enforce: bool              = "false",
@@ -1472,6 +1474,7 @@ impl Config {
     pub fn hover(&self) -> HoverConfig {
         HoverConfig {
             links_in_hover: self.data.hover_links_enable,
+            memory_layout: self.data.hover_memory_layout_enable,
             documentation: self.data.hover_documentation_enable,
             format: {
                 let is_markdown = try_or_def!(self
diff --git a/docs/user/generated_config.adoc b/docs/user/generated_config.adoc
index aad6969671c..c46056866b2 100644
--- a/docs/user/generated_config.adoc
+++ b/docs/user/generated_config.adoc
@@ -421,7 +421,12 @@ Whether to show keyword hover popups. Only applies when
 [[rust-analyzer.hover.links.enable]]rust-analyzer.hover.links.enable (default: `true`)::
 +
 --
-Use markdown syntax for links in hover.
+Use markdown syntax for links on hover.
+--
+[[rust-analyzer.hover.memory.layout.enable]]rust-analyzer.hover.memory.layout.enable (default: `true`)::
++
+--
+Whether to show memory layout data on hover.
 --
 [[rust-analyzer.imports.granularity.enforce]]rust-analyzer.imports.granularity.enforce (default: `false`)::
 +
diff --git a/editors/code/package.json b/editors/code/package.json
index ca00da9f361..163a9530308 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -955,7 +955,12 @@
                     "type": "boolean"
                 },
                 "rust-analyzer.hover.links.enable": {
-                    "markdownDescription": "Use markdown syntax for links in hover.",
+                    "markdownDescription": "Use markdown syntax for links on hover.",
+                    "default": true,
+                    "type": "boolean"
+                },
+                "rust-analyzer.hover.memory.layout.enable": {
+                    "markdownDescription": "Whether to show memory layout data on hover.",
                     "default": true,
                     "type": "boolean"
                 },