Unnamed repository; edit this file 'description' to name the repository.
Merge #10823
10823: fix: better `Fn` traits formatting r=jonas-schievink a=veber-alex
This makes it so formatting `Fn` traits properly handles:
1. An `Fn` trait with only a single argument -> removes the trailing comma.
2. An `Fn` trait which returns nothing (an empty tuple) -> don't show `-> ()` as the return type.
before:

after:

Co-authored-by: Alex Veber <[email protected]>
| -rw-r--r-- | crates/hir_ty/src/display.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/crates/hir_ty/src/display.rs b/crates/hir_ty/src/display.rs index d1ca50c690..e2424dd6d9 100644 --- a/crates/hir_ty/src/display.rs +++ b/crates/hir_ty/src/display.rs @@ -1164,10 +1164,23 @@ impl HirDisplay for Path { // Do we actually format expressions? if generic_args.desugared_from_fn { // First argument will be a tuple, which already includes the parentheses. - generic_args.args[0].hir_fmt(f)?; + // If the tuple only contains 1 item, write it manually to avoid the trailing `,`. + if let hir_def::path::GenericArg::Type(TypeRef::Tuple(v)) = + &generic_args.args[0] + { + if v.len() == 1 { + write!(f, "(")?; + v[0].hir_fmt(f)?; + write!(f, ")")?; + } else { + generic_args.args[0].hir_fmt(f)?; + } + } if let Some(ret) = &generic_args.bindings[0].type_ref { - write!(f, " -> ")?; - ret.hir_fmt(f)?; + if !matches!(ret, TypeRef::Tuple(v) if v.is_empty()) { + write!(f, " -> ")?; + ret.hir_fmt(f)?; + } } return Ok(()); } |