Skip to content

Commit

Permalink
Special treatment empty tuple when suggest adding a string literal in…
Browse files Browse the repository at this point in the history
… format macro.

For example:
```rust
let s = "123";
println!({}, "sss", s);
```
Suggest:
`println!("{:?} {} {}", {}, "sss", s);`

fixes #130170
  • Loading branch information
surechen committed Oct 9, 2024
1 parent 1b5aa96 commit 689cf08
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 4 deletions.
22 changes: 18 additions & 4 deletions compiler/rustc_builtin_macros/src/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,12 +195,26 @@ fn make_format_args(
Applicability::MaybeIncorrect,
);
} else {
let sugg_fmt = match args.explicit_args().len() {
0 => "{}".to_string(),
count => {
format!("{}{{}}", "{} ".repeat(count))
let not_impl_display_trait = |kind: &ExprKind| -> bool {
match kind {
ExprKind::Block(b, None) if b.stmts.is_empty() => true,
ExprKind::Tup(v) if v.is_empty() => true,
_ => false,
}
};

let mut sugg_fmt = "".to_string();
for kind in [&efmt.kind]
.into_iter()
.chain(args.explicit_args().into_iter().map(|a| &a.expr.kind))
{
sugg_fmt.push_str(if not_impl_display_trait(kind) {
"{:?} "
} else {
"{} "
});
}
sugg_fmt = sugg_fmt.trim_end().to_string();
err.span_suggestion(
unexpanded_fmt_span.shrink_to_lo(),
"you might be missing a string literal to format with",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//@ run-rustfix
#![allow(unused_labels)]

fn main() {
let s = "123";
println!("{:?} {} {}", {}, "sss", s);
//~^ ERROR format argument must be a string literal
println!("{:?}", {});
//~^ ERROR format argument must be a string literal
println!("{} {} {} {:?}", s, "sss", s, {});
//~^ ERROR format argument must be a string literal
println!("{:?} {} {:?}", (), s, {});
//~^ ERROR format argument must be a string literal
}
14 changes: 14 additions & 0 deletions tests/ui/macros/format-empty-block-unit-tuple-suggestion-130170.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//@ run-rustfix
#![allow(unused_labels)]

fn main() {
let s = "123";
println!({}, "sss", s);
//~^ ERROR format argument must be a string literal
println!({});
//~^ ERROR format argument must be a string literal
println!(s, "sss", s, {});
//~^ ERROR format argument must be a string literal
println!((), s, {});
//~^ ERROR format argument must be a string literal
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
error: format argument must be a string literal
--> $DIR/format-empty-block-unit-tuple-suggestion-130170.rs:6:14
|
LL | println!({}, "sss", s);
| ^^
|
help: you might be missing a string literal to format with
|
LL | println!("{:?} {} {}", {}, "sss", s);
| +++++++++++++

error: format argument must be a string literal
--> $DIR/format-empty-block-unit-tuple-suggestion-130170.rs:8:14
|
LL | println!({});
| ^^
|
help: you might be missing a string literal to format with
|
LL | println!("{:?}", {});
| +++++++

error: format argument must be a string literal
--> $DIR/format-empty-block-unit-tuple-suggestion-130170.rs:10:14
|
LL | println!(s, "sss", s, {});
| ^
|
help: you might be missing a string literal to format with
|
LL | println!("{} {} {} {:?}", s, "sss", s, {});
| ++++++++++++++++

error: format argument must be a string literal
--> $DIR/format-empty-block-unit-tuple-suggestion-130170.rs:12:14
|
LL | println!((), s, {});
| ^^
|
help: you might be missing a string literal to format with
|
LL | println!("{:?} {} {:?}", (), s, {});
| +++++++++++++++

error: aborting due to 4 previous errors

0 comments on commit 689cf08

Please sign in to comment.