about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJake Heinz <jh@discordapp.com>2021-11-13 23:12:29 +0000
committerJake Heinz <jh@discordapp.com>2021-11-13 23:12:29 +0000
commitd3d768de0d8af96b51cdcdadde511028d3b3d87f (patch)
tree60a1cd6b25dfbb87808b05fae603ac5f924c9138
parentc634615b11f1d67d0e1bcd0d608fe23a04038e88 (diff)
downloadrust-d3d768de0d8af96b51cdcdadde511028d3b3d87f.tar.gz
rust-d3d768de0d8af96b51cdcdadde511028d3b3d87f.zip
inlay hints: add the option to always show constructor inlay hints
-rw-r--r--crates/ide/src/inlay_hints.rs68
-rw-r--r--crates/ide/src/static_index.rs1
-rw-r--r--crates/rust-analyzer/src/config.rs11
-rw-r--r--docs/user/generated_config.adoc5
-rw-r--r--editors/code/package.json5
-rw-r--r--editors/code/src/config.ts1
6 files changed, 86 insertions, 5 deletions
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index 710d6b78821..79c2475ee89 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -16,6 +16,7 @@ pub struct InlayHintsConfig {
     pub type_hints: bool,
     pub parameter_hints: bool,
     pub chaining_hints: bool,
+    pub hide_named_constructor_hints: bool,
     pub max_length: Option<usize>,
 }
 
@@ -213,7 +214,9 @@ fn get_bind_pat_hints(
         Some(label) => label,
         None => {
             let ty_name = ty.display_truncated(sema.db, config.max_length).to_string();
-            if is_named_constructor(sema, pat, &ty_name).is_some() {
+            if config.hide_named_constructor_hints
+                && is_named_constructor(sema, pat, &ty_name).is_some()
+            {
                 return None;
             }
             ty_name.into()
@@ -537,6 +540,7 @@ mod tests {
         type_hints: true,
         parameter_hints: true,
         chaining_hints: true,
+        hide_named_constructor_hints: true,
         max_length: None,
     };
 
@@ -552,6 +556,7 @@ mod tests {
                 parameter_hints: true,
                 type_hints: false,
                 chaining_hints: false,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             ra_fixture,
@@ -565,6 +570,7 @@ mod tests {
                 parameter_hints: false,
                 type_hints: true,
                 chaining_hints: false,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             ra_fixture,
@@ -578,6 +584,7 @@ mod tests {
                 parameter_hints: false,
                 type_hints: false,
                 chaining_hints: true,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             ra_fixture,
@@ -608,6 +615,7 @@ mod tests {
                 type_hints: false,
                 parameter_hints: false,
                 chaining_hints: false,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             r#"
@@ -1354,6 +1362,60 @@ fn fallible() -> ControlFlow<()> {
     }
 
     #[test]
+    fn shows_constructor_type_hints_when_enabled() {
+        check_with_config(
+            InlayHintsConfig {
+                type_hints: true,
+                parameter_hints: true,
+                chaining_hints: true,
+                hide_named_constructor_hints: false,
+                max_length: None,
+            },
+            r#"
+//- minicore: try
+use core::ops::ControlFlow;
+
+struct Struct;
+struct TupleStruct();
+
+impl Struct {
+    fn new() -> Self {
+        Struct
+    }
+    fn try_new() -> ControlFlow<(), Self> {
+        ControlFlow::Continue(Struct)
+    }
+}
+
+struct Generic<T>(T);
+impl Generic<i32> {
+    fn new() -> Self {
+        Generic(0)
+    }
+}
+
+fn main() {
+    let strukt = Struct::new();
+     // ^^^^^^ Struct
+    let tuple_struct = TupleStruct();
+     // ^^^^^^^^^^^^ TupleStruct
+    let generic0 = Generic::new();
+     // ^^^^^^^^ Generic<i32>
+    let generic1 = Generic::<i32>::new();
+     // ^^^^^^^^ Generic<i32>
+    let generic2 = <Generic<i32>>::new();
+     // ^^^^^^^^ Generic<i32>
+}
+
+fn fallible() -> ControlFlow<()> {
+    let strukt = Struct::try_new()?;
+     // ^^^^^^ Struct
+}
+"#,
+        );
+    }
+
+    #[test]
     fn closures() {
         check(
             r#"
@@ -1408,6 +1470,7 @@ fn main() {
                 parameter_hints: false,
                 type_hints: false,
                 chaining_hints: true,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             r#"
@@ -1464,6 +1527,7 @@ fn main() {
                 parameter_hints: false,
                 type_hints: false,
                 chaining_hints: true,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             r#"
@@ -1508,6 +1572,7 @@ fn main() {
                 parameter_hints: false,
                 type_hints: false,
                 chaining_hints: true,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             r#"
@@ -1553,6 +1618,7 @@ fn main() {
                 parameter_hints: false,
                 type_hints: false,
                 chaining_hints: true,
+                hide_named_constructor_hints: true,
                 max_length: None,
             },
             r#"
diff --git a/crates/ide/src/static_index.rs b/crates/ide/src/static_index.rs
index 75249a959dc..036839a801b 100644
--- a/crates/ide/src/static_index.rs
+++ b/crates/ide/src/static_index.rs
@@ -106,6 +106,7 @@ impl StaticIndex<'_> {
                     type_hints: true,
                     parameter_hints: true,
                     chaining_hints: true,
+                    hide_named_constructor_hints: false,
                     max_length: Some(25),
                 },
                 file_id,
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 81f4ccd365c..f2078d86958 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -195,14 +195,16 @@ config_data! {
         hoverActions_run: bool             = "true",
 
         /// Whether to show inlay type hints for method chains.
-        inlayHints_chainingHints: bool      = "true",
+        inlayHints_chainingHints: bool              = "true",
         /// Maximum length for inlay hints. Set to null to have an unlimited length.
-        inlayHints_maxLength: Option<usize> = "25",
+        inlayHints_maxLength: Option<usize>         = "25",
         /// Whether to show function parameter name inlay hints at the call
         /// site.
-        inlayHints_parameterHints: bool     = "true",
+        inlayHints_parameterHints: bool             = "true",
         /// Whether to show inlay type hints for variables.
-        inlayHints_typeHints: bool          = "true",
+        inlayHints_typeHints: bool                  = "true",
+        /// Whether to hide inlay hints for constructors.
+        inlayHints_hideNamedConstructorHints: bool  = "true",
 
         /// Join lines inserts else between consecutive ifs.
         joinLines_joinElseIf: bool = "true",
@@ -768,6 +770,7 @@ impl Config {
             type_hints: self.data.inlayHints_typeHints,
             parameter_hints: self.data.inlayHints_parameterHints,
             chaining_hints: self.data.inlayHints_chainingHints,
+            hide_named_constructor_hints: self.data.inlayHints_hideNamedConstructorHints,
             max_length: self.data.inlayHints_maxLength,
         }
     }
diff --git a/docs/user/generated_config.adoc b/docs/user/generated_config.adoc
index 9a00a0eb661..d6af6f738c5 100644
--- a/docs/user/generated_config.adoc
+++ b/docs/user/generated_config.adoc
@@ -308,6 +308,11 @@ site.
 --
 Whether to show inlay type hints for variables.
 --
+[[rust-analyzer.inlayHints.hideNamedConstructorHints]]rust-analyzer.inlayHints.hideNamedConstructorHints (default: `true`)::
++
+--
+Whether to hide inlay hints for constructors.
+--
 [[rust-analyzer.joinLines.joinElseIf]]rust-analyzer.joinLines.joinElseIf (default: `true`)::
 +
 --
diff --git a/editors/code/package.json b/editors/code/package.json
index 4c718f0b798..888c9dccf33 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -752,6 +752,11 @@
                     "default": true,
                     "type": "boolean"
                 },
+                "rust-analyzer.inlayHints.hideNamedConstructorHints": {
+                    "markdownDescription": "Whether to hide inlay hints for constructors.",
+                    "default": true,
+                    "type": "boolean"
+                },
                 "rust-analyzer.joinLines.joinElseIf": {
                     "markdownDescription": "Join lines inserts else between consecutive ifs.",
                     "default": true,
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index 3f3ca630981..a3e29fc156f 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -114,6 +114,7 @@ export class Config {
             typeHints: this.get<boolean>("inlayHints.typeHints"),
             parameterHints: this.get<boolean>("inlayHints.parameterHints"),
             chainingHints: this.get<boolean>("inlayHints.chainingHints"),
+            hideNamedConstructorHints: this.get<boolean>("inlayHints.hideNamedConstructorHints"),
             smallerHints: this.get<boolean>("inlayHints.smallerHints"),
             maxLength: this.get<null | number>("inlayHints.maxLength"),
         };