inlay hints: add the option to always show constructor inlay hints

This commit is contained in:
Jake Heinz 2021-11-13 23:12:29 +00:00
parent c634615b11
commit d3d768de0d
6 changed files with 86 additions and 5 deletions

View file

@ -16,6 +16,7 @@ pub struct InlayHintsConfig {
pub type_hints: bool, pub type_hints: bool,
pub parameter_hints: bool, pub parameter_hints: bool,
pub chaining_hints: bool, pub chaining_hints: bool,
pub hide_named_constructor_hints: bool,
pub max_length: Option<usize>, pub max_length: Option<usize>,
} }
@ -213,7 +214,9 @@ fn get_bind_pat_hints(
Some(label) => label, Some(label) => label,
None => { None => {
let ty_name = ty.display_truncated(sema.db, config.max_length).to_string(); 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; return None;
} }
ty_name.into() ty_name.into()
@ -537,6 +540,7 @@ mod tests {
type_hints: true, type_hints: true,
parameter_hints: true, parameter_hints: true,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}; };
@ -552,6 +556,7 @@ mod tests {
parameter_hints: true, parameter_hints: true,
type_hints: false, type_hints: false,
chaining_hints: false, chaining_hints: false,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
ra_fixture, ra_fixture,
@ -565,6 +570,7 @@ mod tests {
parameter_hints: false, parameter_hints: false,
type_hints: true, type_hints: true,
chaining_hints: false, chaining_hints: false,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
ra_fixture, ra_fixture,
@ -578,6 +584,7 @@ mod tests {
parameter_hints: false, parameter_hints: false,
type_hints: false, type_hints: false,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
ra_fixture, ra_fixture,
@ -608,6 +615,7 @@ mod tests {
type_hints: false, type_hints: false,
parameter_hints: false, parameter_hints: false,
chaining_hints: false, chaining_hints: false,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
r#" r#"
@ -1353,6 +1361,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] #[test]
fn closures() { fn closures() {
check( check(
@ -1408,6 +1470,7 @@ fn main() {
parameter_hints: false, parameter_hints: false,
type_hints: false, type_hints: false,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
r#" r#"
@ -1464,6 +1527,7 @@ fn main() {
parameter_hints: false, parameter_hints: false,
type_hints: false, type_hints: false,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
r#" r#"
@ -1508,6 +1572,7 @@ fn main() {
parameter_hints: false, parameter_hints: false,
type_hints: false, type_hints: false,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
r#" r#"
@ -1553,6 +1618,7 @@ fn main() {
parameter_hints: false, parameter_hints: false,
type_hints: false, type_hints: false,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: true,
max_length: None, max_length: None,
}, },
r#" r#"

View file

@ -106,6 +106,7 @@ impl StaticIndex<'_> {
type_hints: true, type_hints: true,
parameter_hints: true, parameter_hints: true,
chaining_hints: true, chaining_hints: true,
hide_named_constructor_hints: false,
max_length: Some(25), max_length: Some(25),
}, },
file_id, file_id,

View file

@ -195,14 +195,16 @@ config_data! {
hoverActions_run: bool = "true", hoverActions_run: bool = "true",
/// Whether to show inlay type hints for method chains. /// 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. /// 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 /// Whether to show function parameter name inlay hints at the call
/// site. /// site.
inlayHints_parameterHints: bool = "true", inlayHints_parameterHints: bool = "true",
/// Whether to show inlay type hints for variables. /// 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. /// Join lines inserts else between consecutive ifs.
joinLines_joinElseIf: bool = "true", joinLines_joinElseIf: bool = "true",
@ -768,6 +770,7 @@ impl Config {
type_hints: self.data.inlayHints_typeHints, type_hints: self.data.inlayHints_typeHints,
parameter_hints: self.data.inlayHints_parameterHints, parameter_hints: self.data.inlayHints_parameterHints,
chaining_hints: self.data.inlayHints_chainingHints, chaining_hints: self.data.inlayHints_chainingHints,
hide_named_constructor_hints: self.data.inlayHints_hideNamedConstructorHints,
max_length: self.data.inlayHints_maxLength, max_length: self.data.inlayHints_maxLength,
} }
} }

View file

@ -308,6 +308,11 @@ site.
-- --
Whether to show inlay type hints for variables. 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`):: [[rust-analyzer.joinLines.joinElseIf]]rust-analyzer.joinLines.joinElseIf (default: `true`)::
+ +
-- --

View file

@ -752,6 +752,11 @@
"default": true, "default": true,
"type": "boolean" "type": "boolean"
}, },
"rust-analyzer.inlayHints.hideNamedConstructorHints": {
"markdownDescription": "Whether to hide inlay hints for constructors.",
"default": true,
"type": "boolean"
},
"rust-analyzer.joinLines.joinElseIf": { "rust-analyzer.joinLines.joinElseIf": {
"markdownDescription": "Join lines inserts else between consecutive ifs.", "markdownDescription": "Join lines inserts else between consecutive ifs.",
"default": true, "default": true,

View file

@ -114,6 +114,7 @@ export class Config {
typeHints: this.get<boolean>("inlayHints.typeHints"), typeHints: this.get<boolean>("inlayHints.typeHints"),
parameterHints: this.get<boolean>("inlayHints.parameterHints"), parameterHints: this.get<boolean>("inlayHints.parameterHints"),
chainingHints: this.get<boolean>("inlayHints.chainingHints"), chainingHints: this.get<boolean>("inlayHints.chainingHints"),
hideNamedConstructorHints: this.get<boolean>("inlayHints.hideNamedConstructorHints"),
smallerHints: this.get<boolean>("inlayHints.smallerHints"), smallerHints: this.get<boolean>("inlayHints.smallerHints"),
maxLength: this.get<null | number>("inlayHints.maxLength"), maxLength: this.get<null | number>("inlayHints.maxLength"),
}; };