refactor: Make -Ztrack-diagnostics emit like a note
This commit is contained in:
@@ -417,6 +417,15 @@ impl DiagInner {
|
||||
self.args = std::mem::take(&mut self.reserved_args);
|
||||
}
|
||||
|
||||
pub fn emitted_at_sub_diag(&self) -> Subdiag {
|
||||
let track = format!("-Ztrack-diagnostics: created at {}", self.emitted_at);
|
||||
Subdiag {
|
||||
level: crate::Level::Note,
|
||||
messages: vec![(DiagMessage::Str(Cow::Owned(track)), Style::NoStyle)],
|
||||
span: MultiSpan::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Fields used for Hash, and PartialEq trait.
|
||||
fn keys(
|
||||
&self,
|
||||
|
||||
@@ -28,7 +28,6 @@ use rustc_span::{FileLines, FileName, SourceFile, Span, char_width, str_width};
|
||||
use termcolor::{Buffer, BufferWriter, Color, ColorChoice, ColorSpec, StandardStream, WriteColor};
|
||||
use tracing::{debug, instrument, trace, warn};
|
||||
|
||||
use crate::diagnostic::DiagLocation;
|
||||
use crate::registry::Registry;
|
||||
use crate::snippet::{
|
||||
Annotation, AnnotationColumn, AnnotationType, Line, MultilineAnnotation, Style, StyledString,
|
||||
@@ -505,6 +504,10 @@ impl Emitter for HumanEmitter {
|
||||
fn emit_diagnostic(&mut self, mut diag: DiagInner, _registry: &Registry) {
|
||||
let fluent_args = to_fluent_args(diag.args.iter());
|
||||
|
||||
if self.track_diagnostics && diag.span.has_primary_spans() && !diag.span.is_dummy() {
|
||||
diag.children.insert(0, diag.emitted_at_sub_diag());
|
||||
}
|
||||
|
||||
let mut suggestions = diag.suggestions.unwrap_tag();
|
||||
self.primary_span_formatted(&mut diag.span, &mut suggestions, &fluent_args);
|
||||
|
||||
@@ -523,7 +526,6 @@ impl Emitter for HumanEmitter {
|
||||
&diag.span,
|
||||
&diag.children,
|
||||
&suggestions,
|
||||
self.track_diagnostics.then_some(&diag.emitted_at),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1468,7 +1470,6 @@ impl HumanEmitter {
|
||||
level: &Level,
|
||||
max_line_num_len: usize,
|
||||
is_secondary: bool,
|
||||
emitted_at: Option<&DiagLocation>,
|
||||
is_cont: bool,
|
||||
) -> io::Result<()> {
|
||||
let mut buffer = StyledBuffer::new();
|
||||
@@ -1978,12 +1979,6 @@ impl HumanEmitter {
|
||||
trace!("buffer: {:#?}", buffer.render());
|
||||
}
|
||||
|
||||
if let Some(tracked) = emitted_at {
|
||||
let track = format!("-Ztrack-diagnostics: created at {tracked}");
|
||||
let len = buffer.num_lines();
|
||||
buffer.append(len, &track, Style::NoStyle);
|
||||
}
|
||||
|
||||
// final step: take our styled buffer, render it, then output it
|
||||
emit_to_destination(&buffer.render(), level, &mut self.dst, self.short_message)?;
|
||||
|
||||
@@ -2478,7 +2473,6 @@ impl HumanEmitter {
|
||||
span: &MultiSpan,
|
||||
children: &[Subdiag],
|
||||
suggestions: &[CodeSuggestion],
|
||||
emitted_at: Option<&DiagLocation>,
|
||||
) {
|
||||
let max_line_num_len = if self.ui_testing {
|
||||
ANONYMIZED_LINE_NUM.len()
|
||||
@@ -2495,7 +2489,6 @@ impl HumanEmitter {
|
||||
level,
|
||||
max_line_num_len,
|
||||
false,
|
||||
emitted_at,
|
||||
!children.is_empty()
|
||||
|| suggestions.iter().any(|s| s.style != SuggestionStyle::CompletelyHidden),
|
||||
) {
|
||||
@@ -2541,7 +2534,6 @@ impl HumanEmitter {
|
||||
&child.level,
|
||||
max_line_num_len,
|
||||
true,
|
||||
None,
|
||||
!should_close,
|
||||
) {
|
||||
panic!("failed to emit error: {err}");
|
||||
@@ -2561,7 +2553,6 @@ impl HumanEmitter {
|
||||
&Level::Help,
|
||||
max_line_num_len,
|
||||
true,
|
||||
None,
|
||||
// FIXME: this needs to account for the suggestion type,
|
||||
// some don't take any space.
|
||||
i + 1 != suggestions.len(),
|
||||
|
||||
@@ -372,13 +372,16 @@ impl Diagnostic {
|
||||
};
|
||||
let level = diag.level.to_str();
|
||||
let spans = DiagnosticSpan::from_multispan(&diag.span, &args, je);
|
||||
let children = diag
|
||||
let mut children: Vec<Diagnostic> = diag
|
||||
.children
|
||||
.iter()
|
||||
.map(|c| Diagnostic::from_sub_diagnostic(c, &args, je))
|
||||
.chain(sugg)
|
||||
.collect();
|
||||
|
||||
if je.track_diagnostics && diag.span.has_primary_spans() && !diag.span.is_dummy() {
|
||||
children
|
||||
.insert(0, Diagnostic::from_sub_diagnostic(&diag.emitted_at_sub_diag(), &args, je));
|
||||
}
|
||||
let buf = BufWriter::default();
|
||||
let mut dst: Destination = Box::new(buf.clone());
|
||||
let short = je.json_rendered.short();
|
||||
|
||||
@@ -3,8 +3,8 @@ error: casting to the same type is unnecessary (`u32` -> `u32`)
|
||||
|
|
||||
LL | let b = a as u32;
|
||||
| ^^^^^^^^ help: try: `a`
|
||||
-Ztrack-diagnostics: created at src/tools/clippy/clippy_lints/src/casts/unnecessary_cast.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at src/tools/clippy/clippy_lints/src/casts/unnecessary_cast.rs:LL:CC
|
||||
= note: `-D clippy::unnecessary-cast` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_cast)]`
|
||||
|
||||
@@ -15,8 +15,8 @@ LL | let d = 42;
|
||||
| ----------- unnecessary `let` binding
|
||||
LL | d
|
||||
| ^
|
||||
-Ztrack-diagnostics: created at src/tools/clippy/clippy_lints/src/returns.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at src/tools/clippy/clippy_lints/src/returns.rs:LL:CC
|
||||
= note: `-D clippy::let-and-return` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::let_and_return)]`
|
||||
help: return the expression directly
|
||||
|
||||
@@ -8,5 +8,6 @@ struct A;
|
||||
struct B;
|
||||
const S: A = B;
|
||||
//~^ ERROR: mismatched types
|
||||
//~| NOTE: created at
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -3,7 +3,8 @@ error[E0308]: mismatched types
|
||||
|
|
||||
LL | const S: A = B;
|
||||
| ^ expected `A`, found `B`
|
||||
-Ztrack-diagnostics: created at compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs:LL:CC
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
@@ -8,4 +7,7 @@
|
||||
struct A;
|
||||
struct B;
|
||||
|
||||
pub const S: A = B; //~ ERROR mismatched types
|
||||
pub const S: A = B;
|
||||
//~^ ERROR mismatched types
|
||||
//~| NOTE created at
|
||||
//~| NOTE expected `A`, found `B`
|
||||
|
||||
@@ -3,7 +3,8 @@ error[E0308]: mismatched types
|
||||
|
|
||||
LL | pub const S: A = B;
|
||||
| ^ expected `A`, found `B`
|
||||
-Ztrack-diagnostics: created at compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs:LL:CC
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
//@ rustc-env:RUST_BACKTRACE=0
|
||||
//@ failure-status: 101
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
fn main() {
|
||||
break rust
|
||||
//~^ ERROR cannot find value `rust` in this scope
|
||||
//~| NOTE created at
|
||||
//~| ERROR `break` outside of a loop or labeled block
|
||||
//~| NOTE created at
|
||||
//~| ERROR It looks like you're trying to break rust; would you like some ICE?
|
||||
//~| NOTE created at
|
||||
}
|
||||
|
||||
@@ -3,22 +3,24 @@ error[E0425]: cannot find value `rust` in this scope
|
||||
|
|
||||
LL | break rust
|
||||
| ^^^^ not found in this scope
|
||||
-Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
||||
error[E0268]: `break` outside of a loop or labeled block
|
||||
--> $DIR/track.rs:LL:CC
|
||||
|
|
||||
LL | break rust
|
||||
| ^^^^^^^^^^ cannot `break` outside of a loop or labeled block
|
||||
-Ztrack-diagnostics: created at compiler/rustc_hir_typeck/src/loops.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_hir_typeck/src/loops.rs:LL:CC
|
||||
|
||||
error: internal compiler error: It looks like you're trying to break rust; would you like some ICE?
|
||||
--> $DIR/track.rs:LL:CC
|
||||
|
|
||||
LL | break rust
|
||||
| ^^^^^^^^^^
|
||||
-Ztrack-diagnostics: created at compiler/rustc_hir_typeck/src/lib.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_hir_typeck/src/lib.rs:LL:CC
|
||||
= note: the compiler expectedly panicked. this is a feature.
|
||||
= note: we would appreciate a joke overview: https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675
|
||||
= note: rustc $VERSION running on $TARGET
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
//@ normalize-stderr: ".rs:\d+:\d+" -> ".rs:LL:CC"
|
||||
|
||||
fn main() {
|
||||
let _moved @ _from = String::from("foo"); //~ ERROR use of moved value
|
||||
let _moved @ _from = String::from("foo");
|
||||
//~^ ERROR use of moved value
|
||||
//~| NOTE created at
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ LL | let _moved @ _from = String::from("foo");
|
||||
| | |
|
||||
| | value moved here
|
||||
| value used here after move
|
||||
-Ztrack-diagnostics: created at compiler/rustc_borrowck/src/borrowck_errors.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_borrowck/src/borrowck_errors.rs:LL:CC
|
||||
help: borrow this binding in the pattern to avoid moving the value
|
||||
|
|
||||
LL | let ref _moved @ ref _from = String::from("foo");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
@@ -8,5 +8,7 @@
|
||||
fn main() {
|
||||
let _unimported = Blah { field: u8 };
|
||||
//~^ ERROR cannot find struct, variant or union type `Blah` in this scope
|
||||
//~| NOTE created at
|
||||
//~| ERROR expected value, found builtin type `u8`
|
||||
//~| NOTE created at
|
||||
}
|
||||
|
||||
@@ -3,14 +3,16 @@ error[E0422]: cannot find struct, variant or union type `Blah` in this scope
|
||||
|
|
||||
LL | let _unimported = Blah { field: u8 };
|
||||
| ^^^^ not found in this scope
|
||||
-Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
||||
error[E0423]: expected value, found builtin type `u8`
|
||||
--> $DIR/track3.rs:LL:CC
|
||||
|
|
||||
LL | let _unimported = Blah { field: u8 };
|
||||
| ^^ not a value
|
||||
-Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_resolve/src/late/diagnostics.rs:LL:CC
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
//@ normalize-stderr: ".rs:\d+:\d+" -> ".rs:LL:CC"
|
||||
|
||||
pub onion { //~ ERROR missing `enum` for enum definition
|
||||
pub onion {
|
||||
//~^ ERROR missing `enum` for enum definition
|
||||
//~| NOTE created at
|
||||
Owo(u8),
|
||||
Uwu(i8),
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ error: missing `enum` for enum definition
|
||||
|
|
||||
LL | pub onion {
|
||||
| ^^^^^^^^^
|
||||
-Ztrack-diagnostics: created at compiler/rustc_parse/src/parser/item.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_parse/src/parser/item.rs:LL:CC
|
||||
help: add `enum` here to parse `onion` as an enum
|
||||
|
|
||||
LL | pub enum onion {
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
//@ normalize-stderr: ".rs:\d+:\d+" -> ".rs:LL:CC"
|
||||
|
||||
} //~ ERROR unexpected closing delimiter: `}`
|
||||
}
|
||||
//~^ ERROR unexpected closing delimiter: `}`
|
||||
//~| NOTE created at
|
||||
|
||||
@@ -3,7 +3,8 @@ error: unexpected closing delimiter: `}`
|
||||
|
|
||||
LL | }
|
||||
| ^ unexpected closing delimiter
|
||||
-Ztrack-diagnostics: created at compiler/rustc_parse/src/lexer/tokentrees.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_parse/src/lexer/tokentrees.rs:LL:CC
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//@ compile-flags: -Z track-diagnostics
|
||||
//@ error-pattern: created at
|
||||
//@ dont-require-annotations: NOTE
|
||||
|
||||
// Normalize the emitted location so this doesn't need
|
||||
// updating everytime someone adds or removes a line.
|
||||
@@ -11,7 +11,9 @@ pub trait Foo {
|
||||
}
|
||||
|
||||
impl <T> Foo for T {
|
||||
default fn bar() {} //~ ERROR specialization is unstable
|
||||
default fn bar() {}
|
||||
//~^ ERROR specialization is unstable
|
||||
//~| NOTE created at
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -3,8 +3,8 @@ error[E0658]: specialization is unstable
|
||||
|
|
||||
LL | default fn bar() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
-Ztrack-diagnostics: created at compiler/rustc_ast_passes/src/feature_gate.rs:LL:CC
|
||||
|
|
||||
= note: -Ztrack-diagnostics: created at compiler/rustc_ast_passes/src/feature_gate.rs:LL:CC
|
||||
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
|
||||
= help: add `#![feature(specialization)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
Reference in New Issue
Block a user