Skip to content

Commit

Permalink
Re-enable uninlined_format_args on multiline format!
Browse files Browse the repository at this point in the history
But do not display the code suggestion which can be sometimes completely broken (fortunately when applied it's valid)
  • Loading branch information
kraktus committed Nov 25, 2022
1 parent efadb55 commit 5610d22
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 15 deletions.
19 changes: 13 additions & 6 deletions clippy_lints/src/format_args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ use clippy_utils::source::snippet_opt;
use clippy_utils::ty::{implements_trait, is_type_diagnostic_item};
use if_chain::if_chain;
use itertools::Itertools;
use rustc_errors::Applicability;
use rustc_errors::{
Applicability,
SuggestionStyle::{CompletelyHidden, ShowCode},
};
use rustc_hir::{Expr, ExprKind, HirId, QPath};
use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::ty::adjustment::{Adjust, Adjustment};
Expand Down Expand Up @@ -286,18 +289,22 @@ fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_si
return;
}

// Temporarily ignore multiline spans: https://github.com/rust-lang/rust/pull/102729#discussion_r988704308
if fixes.iter().any(|(span, _)| cx.sess().source_map().is_multiline(*span)) {
return;
}
// multiline span display suggestion is sometimes broken: https://github.com/rust-lang/rust/pull/102729#discussion_r988704308
// in those cases, make the code suggestion hidden
let multiline_fix = fixes.iter().any(|(span, _)| cx.sess().source_map().is_multiline(*span));

span_lint_and_then(
cx,
UNINLINED_FORMAT_ARGS,
call_site,
"variables can be used directly in the `format!` string",
|diag| {
diag.multipart_suggestion("change this to", fixes, Applicability::MachineApplicable);
diag.multipart_suggestion_with_style(
"change this to",
fixes,
Applicability::MachineApplicable,
if multiline_fix { CompletelyHidden } else { ShowCode },
);
},
);
}
Expand Down
11 changes: 3 additions & 8 deletions tests/ui/uninlined_format_args.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,7 @@ fn tester(fn_arg: i32) {
println!("val='{local_i32}'"); // space+tab
println!("val='{local_i32}'"); // tab+space
println!(
"val='{
}'",
local_i32
"val='{local_i32}'"
);
println!("{local_i32}");
println!("{fn_arg}");
Expand Down Expand Up @@ -110,8 +108,7 @@ fn tester(fn_arg: i32) {
println!("{local_f64:width$.prec$}");
println!("{local_f64:width$.prec$} {local_f64} {width} {prec}");
println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$}",
local_i32, width, prec,
"{local_i32:width$.prec$} {local_i32:prec$.width$} {width:local_i32$.prec$} {width:prec$.local_i32$} {prec:local_i32$.width$} {prec:width$.local_i32$}",
);
println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$} {3}",
Expand Down Expand Up @@ -142,9 +139,7 @@ fn tester(fn_arg: i32) {
println!(no_param_str!(), local_i32);

println!(
"{}",
// comment with a comma , in it
val,
"{val}",
);
println!("{val}");

Expand Down
31 changes: 30 additions & 1 deletion tests/ui/uninlined_format_args.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ LL - println!("val='{ }'", local_i32); // tab+space
LL + println!("val='{local_i32}'"); // tab+space
|

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:46:5
|
LL | / println!(
LL | | "val='{
LL | | }'",
LL | | local_i32
LL | | );
| |_____^

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:51:5
|
Expand Down Expand Up @@ -767,6 +777,15 @@ LL - println!("{:1$.2$} {0} {1} {2}", local_f64, width, prec);
LL + println!("{local_f64:width$.prec$} {local_f64} {width} {prec}");
|

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:112:5
|
LL | / println!(
LL | | "{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$}",
LL | | local_i32, width, prec,
LL | | );
| |_____^

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:123:5
|
Expand Down Expand Up @@ -815,6 +834,16 @@ LL - println!("{}", format!("{}", local_i32));
LL + println!("{}", format!("{local_i32}"));
|

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:144:5
|
LL | / println!(
LL | | "{}",
LL | | // comment with a comma , in it
LL | | val,
LL | | );
| |_____^

error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:149:5
|
Expand Down Expand Up @@ -875,5 +904,5 @@ LL - println!("expand='{}'", local_i32);
LL + println!("expand='{local_i32}'");
|

error: aborting due to 73 previous errors
error: aborting due to 76 previous errors

0 comments on commit 5610d22

Please sign in to comment.