diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2018-07-14 20:50:30 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@commure.com> | 2018-07-19 23:18:07 -0700 |
| commit | f53c145ef18db6543e8e5420e172e04b6054db2e (patch) | |
| tree | 9de9b0c1f029e7dfac14b0ab50181868f46bd9df /src/libsyntax_ext/format.rs | |
| parent | bc14d71622378cf942a834e7c2b5358b9901f775 (diff) | |
| download | rust-f53c145ef18db6543e8e5420e172e04b6054db2e.tar.gz rust-f53c145ef18db6543e8e5420e172e04b6054db2e.zip | |
Improve suggestion for missing fmt str in println
Avoid using `concat!(fmt, "\n")` to improve the diagnostics being emitted when the first `println!()` argument isn't a formatting string literal.
Diffstat (limited to 'src/libsyntax_ext/format.rs')
| -rw-r--r-- | src/libsyntax_ext/format.rs | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index 8587d11b227..6abf987d0ab 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -703,10 +703,24 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, let arg_unique_types: Vec<_> = (0..args.len()).map(|_| Vec::new()).collect(); let mut macsp = ecx.call_site(); macsp = macsp.apply_mark(ecx.current_expansion.mark); - let msg = "format argument must be a string literal."; + let msg = "format argument must be a string literal"; + let fmt_sp = efmt.span; let fmt = match expr_to_spanned_string(ecx, efmt, msg) { - Some(fmt) => fmt, - None => return DummyResult::raw_expr(sp), + Ok(fmt) => fmt, + Err(mut err) => { + let sugg_fmt = match args.len() { + 0 => "{}".to_string(), + _ => format!("{}{{}}", "{}, ".repeat(args.len())), + + }; + err.span_suggestion( + fmt_sp.shrink_to_lo(), + "you might be missing a string literal to format with", + format!("\"{}\", ", sugg_fmt), + ); + err.emit(); + return DummyResult::raw_expr(sp); + }, }; let mut cx = Context { @@ -818,7 +832,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, errs.iter().map(|&(sp, _)| sp).collect::<Vec<Span>>(), "multiple unused formatting arguments" ); - diag.span_label(cx.fmtsp, "multiple unused arguments in this statement"); + diag.span_label(cx.fmtsp, "multiple missing formatting arguments"); diag } }; @@ -861,8 +875,10 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, } if show_doc_note { - diag.note(concat!(stringify!($kind), " formatting not supported; see \ - the documentation for `std::fmt`")); + diag.note(concat!( + stringify!($kind), + " formatting not supported; see the documentation for `std::fmt`", + )); } }}; } |
