mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Mention filename in suggestion when it differs from primary span
This commit is contained in:
parent
0a43923a86
commit
310b1a9062
@ -1715,6 +1715,7 @@ impl EmitterWriter {
|
||||
|
||||
fn emit_suggestion_default(
|
||||
&mut self,
|
||||
span: &MultiSpan,
|
||||
suggestion: &CodeSuggestion,
|
||||
args: &FluentArgs<'_>,
|
||||
level: &Level,
|
||||
@ -1766,6 +1767,30 @@ impl EmitterWriter {
|
||||
None,
|
||||
}
|
||||
|
||||
if let Some(span) = span.primary_span() {
|
||||
// Compare the primary span of the diagnostic with the span of the suggestion
|
||||
// being emitted. If they belong to the same file, we don't *need* to show the
|
||||
// file name, saving in verbosity, but if it *isn't* we do need it, otherwise we're
|
||||
// telling users to make a change but not clarifying *where*.
|
||||
let loc = sm.lookup_char_pos(parts[0].span.lo());
|
||||
if loc.file.name != sm.span_to_filename(span) && loc.file.name.is_real() {
|
||||
buffer.puts(row_num - 1, 0, "--> ", Style::LineNumber);
|
||||
buffer.append(
|
||||
row_num - 1,
|
||||
&format!(
|
||||
"{}:{}:{}",
|
||||
sm.filename_for_diagnostics(&loc.file.name),
|
||||
sm.doctest_offset_line(&loc.file.name, loc.line),
|
||||
loc.col.0 + 1,
|
||||
),
|
||||
Style::LineAndColumn,
|
||||
);
|
||||
for _ in 0..max_line_num_len {
|
||||
buffer.prepend(row_num - 1, " ", Style::NoStyle);
|
||||
}
|
||||
row_num += 1;
|
||||
}
|
||||
}
|
||||
let show_code_change = if has_deletion && !is_multiline {
|
||||
DisplaySuggestion::Diff
|
||||
} else if (parts.len() != 1 || parts[0].snippet.trim() != complete.trim())
|
||||
@ -1787,7 +1812,7 @@ impl EmitterWriter {
|
||||
assert!(!file_lines.lines.is_empty() || parts[0].span.is_dummy());
|
||||
|
||||
let line_start = sm.lookup_char_pos(parts[0].span.lo()).line;
|
||||
draw_col_separator_no_space(&mut buffer, 1, max_line_num_len + 1);
|
||||
draw_col_separator_no_space(&mut buffer, row_num - 1, max_line_num_len + 1);
|
||||
let mut lines = complete.lines();
|
||||
if lines.clone().next().is_none() {
|
||||
// Account for a suggestion to completely remove a line(s) with whitespace (#94192).
|
||||
@ -2046,9 +2071,13 @@ impl EmitterWriter {
|
||||
) {
|
||||
panic!("failed to emit error: {}", e);
|
||||
}
|
||||
} else if let Err(e) =
|
||||
self.emit_suggestion_default(sugg, args, &Level::Help, max_line_num_len)
|
||||
{
|
||||
} else if let Err(e) = self.emit_suggestion_default(
|
||||
span,
|
||||
sugg,
|
||||
args,
|
||||
&Level::Help,
|
||||
max_line_num_len,
|
||||
) {
|
||||
panic!("failed to emit error: {}", e);
|
||||
};
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ LL | impl Bar for Baz { }
|
||||
| ^^^ type aliases cannot be used as traits
|
||||
|
|
||||
help: you might have meant to use `#![feature(trait_alias)]` instead of a `type` alias
|
||||
--> $DIR/two_files_data.rs:5:1
|
||||
|
|
||||
LL | trait Bar = dyn Foo;
|
||||
|
|
||||
|
@ -6,6 +6,7 @@ LL | If<{ FRAC <= 32 }>: True,
|
||||
|
|
||||
= note: the crate this constant originates from uses `#![feature(generic_const_exprs)]`
|
||||
help: consider enabling this feature
|
||||
--> $DIR/issue-94287.rs:1:1
|
||||
|
|
||||
LL | #![feature(generic_const_exprs)]
|
||||
|
|
||||
|
@ -6,6 +6,7 @@ LL | produces_async! {}
|
||||
|
|
||||
= note: this error originates in the macro `produces_async` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: escape `async` to use it as an identifier
|
||||
--> $DIR/auxiliary/edition-kw-macro-2018.rs:7:19
|
||||
|
|
||||
LL | () => (pub fn r#async() {})
|
||||
| ++
|
||||
|
@ -6,6 +6,7 @@ LL | produces_async! {}
|
||||
|
|
||||
= note: this error originates in the macro `produces_async` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: escape `async` to use it as an identifier
|
||||
--> $DIR/auxiliary/edition-kw-macro-2018.rs:7:19
|
||||
|
|
||||
LL | () => (pub fn r#async() {})
|
||||
| ++
|
||||
|
@ -9,6 +9,7 @@ LL | assert_eq!(a, 0);
|
||||
|
|
||||
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: you might have forgotten to call this function
|
||||
--> $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
||||
|
|
||||
LL | if !(*left_val() == *right_val) {
|
||||
| ++
|
||||
|
@ -46,6 +46,7 @@ LL | bar.pow(2);
|
||||
| ^^^
|
||||
|
|
||||
help: you must specify a type for this binding, like `i32`
|
||||
--> $DIR/auxiliary/macro-in-other-crate.rs:3:29
|
||||
|
|
||||
LL | ($ident:ident) => { let $ident: i32 = 42; }
|
||||
| ~~~~~~~~~~~
|
||||
|
Loading…
Reference in New Issue
Block a user