feat: use shorthand when pretty-print record pat

This commit is contained in:
roife 2024-09-09 23:14:31 +08:00
parent cbfa357813
commit 129acd2e08
2 changed files with 79 additions and 6 deletions

View File

@ -616,12 +616,37 @@ fn print_pat(&mut self, pat: PatId) {
w!(self, " {{");
let edition = self.edition;
let oneline = matches!(self.line_format, LineFormat::Oneline);
self.indented(|p| {
for arg in args.iter() {
w!(p, "{}: ", arg.name.display(self.db.upcast(), edition));
p.print_pat(arg.pat);
wln!(p, ",");
for (idx, arg) in args.iter().enumerate() {
let field_name = arg.name.display(self.db.upcast(), edition).to_string();
let mut same_name = false;
if let Pat::Bind { id, subpat: None } = &self.body[arg.pat] {
if let Binding { name, mode: BindingAnnotation::Unannotated, .. } =
&self.body.bindings[*id]
{
if name.as_str() == field_name {
same_name = true;
}
}
}
w!(p, "{}", field_name);
if !same_name {
w!(p, ": ");
p.print_pat(arg.pat);
}
// Do not print the extra comma if the line format is oneline
if oneline && idx == args.len() - 1 {
w!(p, " ");
} else {
wln!(p, ",");
}
}
if *ellipsis {
wln!(p, "..");
}

View File

@ -8803,7 +8803,7 @@ fn test_3(&(a, b): &(i32, i32))
```
```rust
fn test_4(Point { x: x, y: y, }: Point)
fn test_4(Point { x, y }: Point)
```
"#]],
);
@ -8851,7 +8851,7 @@ fn test_6((_, y): (i32, i64))
```
```rust
fn test_7((x, Foo { a: a, b: b, }): (i32, Foo))
fn test_7((x, Foo { a, b }): (i32, Foo))
```
"#]],
);
@ -8871,4 +8871,52 @@ fn test_8((MyEnum::A(x) | MyEnum::B(x)): MyEnum)
```
"#]],
);
// Test case with a pattern as a function parameter
check(
r#"struct Foo { a: i32, b: i32 } fn test_9$0(Foo { a, b }: Foo) {}"#,
expect![[r#"
*test_9*
```rust
test
```
```rust
fn test_9(Foo { a, b }: Foo)
```
"#]],
);
// Test case with a pattern as a function parameter with a different name
check(
r#"struct Foo { a: i32, b: i32 } fn test_10$0(Foo { a, b: b1 }: Foo) {}"#,
expect![[r#"
*test_10*
```rust
test
```
```rust
fn test_10(Foo { a, b: b1 }: Foo)
```
"#]],
);
// Test case with a pattern as a function parameter with annotations
check(
r#"struct Foo { a: i32, b: i32 } fn test_10$0(Foo { a, b: mut b }: Foo) {}"#,
expect![[r#"
*test_10*
```rust
test
```
```rust
fn test_10(Foo { a, b: mut b }: Foo)
```
"#]],
);
}