Skip to content

Commit

Permalink
feat: use shorthand when pretty-print record pat
Browse files Browse the repository at this point in the history
  • Loading branch information
roife committed Sep 9, 2024
1 parent cbfa357 commit 129acd2
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 6 deletions.
33 changes: 29 additions & 4 deletions src/tools/rust-analyzer/crates/hir-def/src/body/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -616,12 +616,37 @@ impl Printer<'_> {

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, "..");
}
Expand Down
52 changes: 50 additions & 2 deletions src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8803,7 +8803,7 @@ fn test_hover_function_with_pat_param() {
```
```rust
fn test_4(Point { x: x, y: y, }: Point)
fn test_4(Point { x, y }: Point)
```
"#]],
);
Expand Down Expand Up @@ -8851,7 +8851,7 @@ fn test_hover_function_with_pat_param() {
```
```rust
fn test_7((x, Foo { a: a, b: b, }): (i32, Foo))
fn test_7((x, Foo { a, b }): (i32, Foo))
```
"#]],
);
Expand All @@ -8871,4 +8871,52 @@ fn test_hover_function_with_pat_param() {
```
"#]],
);

// 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)
```
"#]],
);
}

0 comments on commit 129acd2

Please sign in to comment.