mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Merge #2657
2657: Omit closure parameters in closure type display strings r=flodiebold a=SomeoneToIgnore Part of https://github.com/rust-analyzer/rust-analyzer/issues/1946 I wonder, should we display the the closure trait (Fn/FnMut/FnOnce) in inlay hints instead of `|...|` at all? Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
This commit is contained in:
commit
823e9193fe
3 changed files with 62 additions and 18 deletions
|
@ -10,7 +10,7 @@ pub struct HirFormatter<'a, 'b, DB> {
|
||||||
buf: String,
|
buf: String,
|
||||||
curr_size: usize,
|
curr_size: usize,
|
||||||
max_size: Option<usize>,
|
max_size: Option<usize>,
|
||||||
should_display_default_types: bool,
|
omit_verbose_types: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait HirDisplay {
|
pub trait HirDisplay {
|
||||||
|
@ -20,7 +20,7 @@ pub trait HirDisplay {
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
HirDisplayWrapper(db, self, None, true)
|
HirDisplayWrapper(db, self, None, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn display_truncated<'a, DB>(
|
fn display_truncated<'a, DB>(
|
||||||
|
@ -31,7 +31,7 @@ pub trait HirDisplay {
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
HirDisplayWrapper(db, self, max_size, false)
|
HirDisplayWrapper(db, self, max_size, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,8 +74,8 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn should_display_default_types(&self) -> bool {
|
pub fn omit_verbose_types(&self) -> bool {
|
||||||
self.should_display_default_types
|
self.omit_verbose_types
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ where
|
||||||
buf: String::with_capacity(20),
|
buf: String::with_capacity(20),
|
||||||
curr_size: 0,
|
curr_size: 0,
|
||||||
max_size: self.2,
|
max_size: self.2,
|
||||||
should_display_default_types: self.3,
|
omit_verbose_types: self.3,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -821,6 +821,8 @@ impl TypeWalk for Ty {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TYPE_HINT_TRUNCATION: &str = "…";
|
||||||
|
|
||||||
impl HirDisplay for &Ty {
|
impl HirDisplay for &Ty {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
||||||
HirDisplay::hir_fmt(*self, f)
|
HirDisplay::hir_fmt(*self, f)
|
||||||
|
@ -830,7 +832,7 @@ impl HirDisplay for &Ty {
|
||||||
impl HirDisplay for ApplicationTy {
|
impl HirDisplay for ApplicationTy {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
||||||
if f.should_truncate() {
|
if f.should_truncate() {
|
||||||
return write!(f, "…");
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.ctor {
|
match self.ctor {
|
||||||
|
@ -908,9 +910,7 @@ impl HirDisplay for ApplicationTy {
|
||||||
write!(f, "<")?;
|
write!(f, "<")?;
|
||||||
|
|
||||||
let mut non_default_parameters = Vec::with_capacity(self.parameters.len());
|
let mut non_default_parameters = Vec::with_capacity(self.parameters.len());
|
||||||
let parameters_to_write = if f.should_display_default_types() {
|
let parameters_to_write = if f.omit_verbose_types() {
|
||||||
self.parameters.0.as_ref()
|
|
||||||
} else {
|
|
||||||
match self
|
match self
|
||||||
.ctor
|
.ctor
|
||||||
.as_generic_def()
|
.as_generic_def()
|
||||||
|
@ -935,6 +935,8 @@ impl HirDisplay for ApplicationTy {
|
||||||
&non_default_parameters
|
&non_default_parameters
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.parameters.0.as_ref()
|
||||||
};
|
};
|
||||||
|
|
||||||
f.write_joined(parameters_to_write, ", ")?;
|
f.write_joined(parameters_to_write, ", ")?;
|
||||||
|
@ -959,9 +961,16 @@ impl HirDisplay for ApplicationTy {
|
||||||
let sig = self.parameters[0]
|
let sig = self.parameters[0]
|
||||||
.callable_sig(f.db)
|
.callable_sig(f.db)
|
||||||
.expect("first closure parameter should contain signature");
|
.expect("first closure parameter should contain signature");
|
||||||
write!(f, "|")?;
|
let return_type_hint = sig.ret().display(f.db);
|
||||||
f.write_joined(sig.params(), ", ")?;
|
if sig.params().is_empty() {
|
||||||
write!(f, "| -> {}", sig.ret().display(f.db))?;
|
write!(f, "|| -> {}", return_type_hint)?;
|
||||||
|
} else if f.omit_verbose_types() {
|
||||||
|
write!(f, "|{}| -> {}", TYPE_HINT_TRUNCATION, return_type_hint)?;
|
||||||
|
} else {
|
||||||
|
write!(f, "|")?;
|
||||||
|
f.write_joined(sig.params(), ", ")?;
|
||||||
|
write!(f, "| -> {}", return_type_hint)?;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -971,7 +980,7 @@ impl HirDisplay for ApplicationTy {
|
||||||
impl HirDisplay for ProjectionTy {
|
impl HirDisplay for ProjectionTy {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
||||||
if f.should_truncate() {
|
if f.should_truncate() {
|
||||||
return write!(f, "…");
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
let trait_name = f.db.trait_data(self.trait_(f.db)).name.clone();
|
let trait_name = f.db.trait_data(self.trait_(f.db)).name.clone();
|
||||||
|
@ -989,7 +998,7 @@ impl HirDisplay for ProjectionTy {
|
||||||
impl HirDisplay for Ty {
|
impl HirDisplay for Ty {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
||||||
if f.should_truncate() {
|
if f.should_truncate() {
|
||||||
return write!(f, "…");
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
|
@ -1074,7 +1083,7 @@ impl HirDisplay for Ty {
|
||||||
impl TraitRef {
|
impl TraitRef {
|
||||||
fn hir_fmt_ext(&self, f: &mut HirFormatter<impl HirDatabase>, use_as: bool) -> fmt::Result {
|
fn hir_fmt_ext(&self, f: &mut HirFormatter<impl HirDatabase>, use_as: bool) -> fmt::Result {
|
||||||
if f.should_truncate() {
|
if f.should_truncate() {
|
||||||
return write!(f, "…");
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.substs[0].hir_fmt(f)?;
|
self.substs[0].hir_fmt(f)?;
|
||||||
|
@ -1108,7 +1117,7 @@ impl HirDisplay for &GenericPredicate {
|
||||||
impl HirDisplay for GenericPredicate {
|
impl HirDisplay for GenericPredicate {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
fn hir_fmt(&self, f: &mut HirFormatter<impl HirDatabase>) -> fmt::Result {
|
||||||
if f.should_truncate() {
|
if f.should_truncate() {
|
||||||
return write!(f, "…");
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
|
|
|
@ -293,7 +293,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn closure_parameter() {
|
fn closure_parameters() {
|
||||||
let (analysis, file_id) = single_file(
|
let (analysis, file_id) = single_file(
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -301,6 +301,11 @@ fn main() {
|
||||||
(0..2).for_each(|increment| {
|
(0..2).for_each(|increment| {
|
||||||
start += increment;
|
start += increment;
|
||||||
})
|
})
|
||||||
|
|
||||||
|
let multiply = |a, b, c, d| a * b * c * d;
|
||||||
|
let _: i32 = multiply(1, 2, 3, 4);
|
||||||
|
|
||||||
|
let return_42 = || 42;
|
||||||
}"#,
|
}"#,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -316,6 +321,36 @@ fn main() {
|
||||||
kind: TypeHint,
|
kind: TypeHint,
|
||||||
label: "i32",
|
label: "i32",
|
||||||
},
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [114; 122),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "|…| -> i32",
|
||||||
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [126; 127),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "i32",
|
||||||
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [129; 130),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "i32",
|
||||||
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [132; 133),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "i32",
|
||||||
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [135; 136),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "i32",
|
||||||
|
},
|
||||||
|
InlayHint {
|
||||||
|
range: [201; 210),
|
||||||
|
kind: TypeHint,
|
||||||
|
label: "|| -> i32",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue