Re-enable uninlined_format_args on multiline format!

But do not display the code suggestion which can be sometimes completely broken (fortunately when applied it's valid)
This commit is contained in:
kraktus 2022-11-25 16:36:22 +01:00
parent efadb55733
commit 5610d22c8d
3 changed files with 46 additions and 15 deletions

View file

@ -9,7 +9,10 @@ use clippy_utils::source::snippet_opt;
use clippy_utils::ty::{implements_trait, is_type_diagnostic_item}; use clippy_utils::ty::{implements_trait, is_type_diagnostic_item};
use if_chain::if_chain; use if_chain::if_chain;
use itertools::Itertools; use itertools::Itertools;
use rustc_errors::Applicability; use rustc_errors::{
Applicability,
SuggestionStyle::{CompletelyHidden, ShowCode},
};
use rustc_hir::{Expr, ExprKind, HirId, QPath}; use rustc_hir::{Expr, ExprKind, HirId, QPath};
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::ty::adjustment::{Adjust, Adjustment}; use rustc_middle::ty::adjustment::{Adjust, Adjustment};
@ -286,10 +289,9 @@ fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_si
return; return;
} }
// Temporarily ignore multiline spans: https://github.com/rust-lang/rust/pull/102729#discussion_r988704308 // multiline span display suggestion is sometimes broken: https://github.com/rust-lang/rust/pull/102729#discussion_r988704308
if fixes.iter().any(|(span, _)| cx.sess().source_map().is_multiline(*span)) { // in those cases, make the code suggestion hidden
return; let multiline_fix = fixes.iter().any(|(span, _)| cx.sess().source_map().is_multiline(*span));
}
span_lint_and_then( span_lint_and_then(
cx, cx,
@ -297,7 +299,12 @@ fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_si
call_site, call_site,
"variables can be used directly in the `format!` string", "variables can be used directly in the `format!` string",
|diag| { |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 },
);
}, },
); );
} }

View file

@ -44,9 +44,7 @@ fn tester(fn_arg: i32) {
println!("val='{local_i32}'"); // space+tab println!("val='{local_i32}'"); // space+tab
println!("val='{local_i32}'"); // tab+space println!("val='{local_i32}'"); // tab+space
println!( println!(
"val='{ "val='{local_i32}'"
}'",
local_i32
); );
println!("{local_i32}"); println!("{local_i32}");
println!("{fn_arg}"); println!("{fn_arg}");
@ -110,8 +108,7 @@ fn tester(fn_arg: i32) {
println!("{local_f64:width$.prec$}"); println!("{local_f64:width$.prec$}");
println!("{local_f64:width$.prec$} {local_f64} {width} {prec}"); println!("{local_f64:width$.prec$} {local_f64} {width} {prec}");
println!( 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:prec$.width$} {width:local_i32$.prec$} {width:prec$.local_i32$} {prec:local_i32$.width$} {prec:width$.local_i32$}",
local_i32, width, prec,
); );
println!( println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$} {3}", "{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$} {3}",
@ -142,9 +139,7 @@ fn tester(fn_arg: i32) {
println!(no_param_str!(), local_i32); println!(no_param_str!(), local_i32);
println!( println!(
"{}", "{val}",
// comment with a comma , in it
val,
); );
println!("{val}"); println!("{val}");

View file

@ -59,6 +59,16 @@ LL - println!("val='{ }'", local_i32); // tab+space
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 error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:51:5 --> $DIR/uninlined_format_args.rs:51:5
| |
@ -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}"); 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 error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:123:5 --> $DIR/uninlined_format_args.rs:123:5
| |
@ -815,6 +834,16 @@ LL - println!("{}", format!("{}", local_i32));
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 error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:149:5 --> $DIR/uninlined_format_args.rs:149:5
| |
@ -875,5 +904,5 @@ LL - println!("expand='{}'", local_i32);
LL + println!("expand='{local_i32}'"); LL + println!("expand='{local_i32}'");
| |
error: aborting due to 73 previous errors error: aborting due to 76 previous errors