diff --git a/README.md b/README.md index bd2e887..012cabb 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ You can derive a `Diagnostic` from any `std::error::Error` type. `thiserror` is a great way to define them, and plays nicely with `miette`! */ -use miette::{Diagnostic, NamedSource, SourceSpan}; +use miette::{Diagnostic, MietteSourceCode, SourceSpan}; use thiserror::Error; #[derive(Error, Debug, Diagnostic)] @@ -114,7 +114,7 @@ struct MyBad { // The Source that we're gonna be printing snippets out of. // This can be a String if you don't have or care about file names. #[source_code] - src: NamedSource, + src: MietteSourceCode, // Snippets and highlights can be included in the diagnostic! #[label("This bit here")] bad_bit: SourceSpan, @@ -134,7 +134,7 @@ fn this_fails() -> Result<()> { let src = "source\n text\n here".to_string(); Err(MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), bad_bit: (9, 4).into(), })?; @@ -649,7 +649,6 @@ If you... [`MietteDiagnostic`] directly to create diagnostic on the fly. ```rust - let source = "2 + 2 * 2 = 8".to_string(); let report = miette!( labels = vec![ @@ -665,23 +664,32 @@ println!("{:?}", report) `miette` can be configured to highlight syntax in source code snippets. - + To use the built-in highlighting functionality, you must enable the `syntect-highlighter` crate feature. When this feature is enabled, `miette` will automatically use the [`syntect`] crate to highlight the `#[source_code]` field of your [`Diagnostic`]. -Syntax detection with [`syntect`] is handled by checking 2 methods on the [`SpanContents`] trait, in order: -* [`language()`](SpanContents::language) - Provides the name of the language +Syntax detection with [`syntect`] is handled by checking 2 methods on the [`SourceCode`] trait, in order: +* [`language()`](SourceCode::language) - Provides the name of the language as a string. For example `"Rust"` will indicate Rust syntax highlighting. - You can set the language of the [`SpanContents`] produced by a - [`NamedSource`] via the [`with_language`](NamedSource::with_language) + You can set the language of a [`SourceCode`] by using a + [`MietteSourceCode`], via the [`with_language`](MietteSourceCode::with_language) method. -* [`name()`](SpanContents::name) - In the absence of an explicitly set +* [`name()`](SourceCode::name) - In the absence of an explicitly set language, the name is assumed to contain a file name or file path. The highlighter will check for a file extension at the end of the name and - try to guess the syntax from that. + try to guess the syntax from that. Can also be set via the + [`with_name`](MietteSourceCod::with_name) method. + +```rust +let src = MietteSourceCode::new("fn hello(oops) -> &str { \"hello!\" }").with_language("Rust"); +let report = miette!( + labels = vec![LabeledSpan::at((9, 4), "this is wrong")], + "invalid syntax!", +).with_source_code(src); +``` If you want to use a custom highlighter, you can provide a custom implementation of the [`Highlighter`](highlighters::Highlighter) diff --git a/images/syntax_highlight.png b/images/syntax_highlight.png new file mode 100644 index 0000000..25bf43e Binary files /dev/null and b/images/syntax_highlight.png differ diff --git a/src/handlers/graphical.rs b/src/handlers/graphical.rs index 3e9c790..aab02be 100644 --- a/src/handlers/graphical.rs +++ b/src/handlers/graphical.rs @@ -619,7 +619,7 @@ impl GraphicalReportHandler { .map(|(label, st)| FancySpan::new(label.label().map(String::from), *label.inner(), st)) .collect::>(); - let mut highlighter_state = self.highlighter.start_highlighter_state(&*contents); + let mut highlighter_state = self.highlighter.start_highlighter_state(source, &*contents); // The max number of gutter-lines that will be active at any given // point. We need this to figure out indentation, so we do one loop @@ -663,7 +663,7 @@ impl GraphicalReportHandler { None => contents, }; - if let Some(source_name) = primary_contents.name() { + if let Some(source_name) = source.name() { writeln!( f, "[{}]", diff --git a/src/handlers/json.rs b/src/handlers/json.rs index 0b4a405..6899638 100644 --- a/src/handlers/json.rs +++ b/src/handlers/json.rs @@ -159,8 +159,8 @@ impl JSONReportHandler { ) -> fmt::Result { if let Some(mut labels) = diagnostic.labels() { if let Some(label) = labels.next() { - if let Ok(span_content) = source.read_span(label.inner(), 0, 0) { - let filename = span_content.name().unwrap_or_default(); + if source.read_span(label.inner(), 0, 0).is_ok() { + let filename = source.name().unwrap_or_default(); return write!(f, r#""filename": "{}","#, escape(filename)); } } diff --git a/src/handlers/narratable.rs b/src/handlers/narratable.rs index f8d36ae..bf9d87c 100644 --- a/src/handlers/narratable.rs +++ b/src/handlers/narratable.rs @@ -227,7 +227,7 @@ impl NarratableReportHandler { ) -> fmt::Result { let (contents, lines) = self.get_lines(source, context.inner())?; write!(f, "Begin snippet")?; - if let Some(filename) = contents.name() { + if let Some(filename) = source.name() { write!(f, " for {}", filename,)?; } writeln!( diff --git a/src/highlighters/blank.rs b/src/highlighters/blank.rs index 50a9c65..2cdac75 100644 --- a/src/highlighters/blank.rs +++ b/src/highlighters/blank.rs @@ -1,6 +1,6 @@ use owo_colors::Style; -use crate::SpanContents; +use crate::{SourceCode, SpanContents}; use super::{Highlighter, HighlighterState}; @@ -12,7 +12,8 @@ pub struct BlankHighlighter; impl Highlighter for BlankHighlighter { fn start_highlighter_state<'h>( &'h self, - _source: &dyn SpanContents<'_>, + _source: &dyn SourceCode, + _span: &dyn SpanContents<'_>, ) -> Box { Box::new(BlankHighlighterState) } diff --git a/src/highlighters/mod.rs b/src/highlighters/mod.rs index 0af1aa2..1003fcd 100644 --- a/src/highlighters/mod.rs +++ b/src/highlighters/mod.rs @@ -13,7 +13,7 @@ use std::{ops::Deref, sync::Arc}; -use crate::SpanContents; +use crate::{SourceCode, SpanContents}; use owo_colors::Styled; #[cfg(feature = "syntect-highlighter")] @@ -39,7 +39,8 @@ pub trait Highlighter { /// responsible for the actual rendering. fn start_highlighter_state<'h>( &'h self, - source: &dyn SpanContents<'_>, + source: &dyn SourceCode, + span: &dyn SpanContents<'_>, ) -> Box; } diff --git a/src/highlighters/syntect.rs b/src/highlighters/syntect.rs index 538124c..dab7dec 100644 --- a/src/highlighters/syntect.rs +++ b/src/highlighters/syntect.rs @@ -15,7 +15,7 @@ use owo_colors::{Rgb, Style, Styled}; use crate::{ highlighters::{Highlighter, HighlighterState}, - SpanContents, + SourceCode, SpanContents, }; use super::BlankHighlighterState; @@ -42,9 +42,10 @@ impl Default for SyntectHighlighter { impl Highlighter for SyntectHighlighter { fn start_highlighter_state<'h>( &'h self, - source: &dyn SpanContents<'_>, + source: &dyn SourceCode, + span: &dyn SpanContents<'_>, ) -> Box { - if let Some(syntax) = self.detect_syntax(source) { + if let Some(syntax) = self.detect_syntax(source, span) { let highlighter = syntect::Highlighter::new(&self.theme); let parse_state = syntect::ParseState::new(syntax); let highlight_state = @@ -82,13 +83,17 @@ impl SyntectHighlighter { } /// Determine syntect [`SyntaxReference`] to use for given [`SpanContents`]. - fn detect_syntax(&self, contents: &dyn SpanContents<'_>) -> Option<&syntect::SyntaxReference> { + fn detect_syntax( + &self, + source: &dyn SourceCode, + span: &dyn SpanContents<'_>, + ) -> Option<&syntect::SyntaxReference> { // use language if given - if let Some(language) = contents.language() { + if let Some(language) = source.language() { return self.syntax_set.find_syntax_by_name(language); } // otherwise try to use any file extension provided in the name - if let Some(name) = contents.name() { + if let Some(name) = source.name() { if let Some(ext) = Path::new(name).extension() { return self .syntax_set @@ -96,12 +101,8 @@ impl SyntectHighlighter { } } // finally, attempt to guess syntax based on first line - return self.syntax_set.find_syntax_by_first_line( - std::str::from_utf8(contents.data()) - .ok()? - .split('\n') - .next()?, - ); + self.syntax_set + .find_syntax_by_first_line(std::str::from_utf8(span.data()).ok()?.split('\n').next()?) } } diff --git a/src/lib.rs b/src/lib.rs index 6396c9f..092f68b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -100,7 +100,7 @@ //! //! `thiserror` is a great way to define them, and plays nicely with `miette`! //! */ -//! use miette::{Diagnostic, NamedSource, SourceSpan}; +//! use miette::{Diagnostic, MietteSourceCode, SourceSpan}; //! use thiserror::Error; //! //! #[derive(Error, Debug, Diagnostic)] @@ -114,7 +114,7 @@ //! // The Source that we're gonna be printing snippets out of. //! // This can be a String if you don't have or care about file names. //! #[source_code] -//! src: NamedSource, +//! src: MietteSourceCode, //! // Snippets and highlights can be included in the diagnostic! //! #[label("This bit here")] //! bad_bit: SourceSpan, @@ -134,7 +134,7 @@ //! let src = "source\n text\n here".to_string(); //! //! Err(MyBad { -//! src: NamedSource::new("bad_file.rs", src), +//! src: MietteSourceCode::new(src).with_name("bad_file.rs"), //! bad_bit: (9, 4).into(), //! })?; //! @@ -650,7 +650,6 @@ //! //! ```rust,ignore //! # use miette::{miette, LabeledSpan, Report}; -//! //! let source = "2 + 2 * 2 = 8".to_string(); //! let report = miette!( //! labels = vec![ @@ -666,23 +665,34 @@ //! //! `miette` can be configured to highlight syntax in source code snippets. //! -//! +//! //! //! To use the built-in highlighting functionality, you must enable the //! `syntect-highlighter` crate feature. When this feature is enabled, `miette` will //! automatically use the [`syntect`] crate to highlight the `#[source_code]` //! field of your [`Diagnostic`]. //! -//! Syntax detection with [`syntect`] is handled by checking 2 methods on the [`SpanContents`] trait, in order: -//! * [`language()`](SpanContents::language) - Provides the name of the language +//! Syntax detection with [`syntect`] is handled by checking 2 methods on the [`SourceCode`] trait, in order: +//! * [`language()`](SourceCode::language) - Provides the name of the language //! as a string. For example `"Rust"` will indicate Rust syntax highlighting. -//! You can set the language of the [`SpanContents`] produced by a -//! [`NamedSource`] via the [`with_language`](NamedSource::with_language) +//! You can set the language of a [`SourceCode`] by using a +//! [`MietteSourceCode`], via the [`with_language`](MietteSourceCode::with_language) //! method. -//! * [`name()`](SpanContents::name) - In the absence of an explicitly set +//! * [`name()`](SourceCode::name) - In the absence of an explicitly set //! language, the name is assumed to contain a file name or file path. //! The highlighter will check for a file extension at the end of the name and -//! try to guess the syntax from that. +//! try to guess the syntax from that. Can also be set via the +//! [`with_name`](MietteSourceCod::with_name) method. +//! +//! ```rust +//! # use miette::{miette, LabeledSpan, MietteSourceCode}; +//! # use miette::Result; +//! let src = MietteSourceCode::new("fn hello(oops) -> &str { \"hello!\" }").with_language("Rust"); +//! let report = miette!( +//! labels = vec![LabeledSpan::at((9, 4), "this is wrong")], +//! "invalid syntax!", +//! ).with_source_code(src); +//! ``` //! //! If you want to use a custom highlighter, you can provide a custom //! implementation of the [`Highlighter`](highlighters::Highlighter) @@ -781,10 +791,10 @@ pub use eyreish::*; pub use handler::*; pub use handlers::*; pub use miette_diagnostic::*; -pub use named_source::*; #[cfg(feature = "fancy")] pub use panic::*; pub use protocol::*; +pub use source_code::*; mod chain; mod diagnostic_chain; @@ -799,8 +809,8 @@ pub mod highlighters; #[doc(hidden)] pub mod macro_helpers; mod miette_diagnostic; -mod named_source; #[cfg(feature = "fancy")] mod panic; mod protocol; +mod source_code; mod source_impls; diff --git a/src/named_source.rs b/src/named_source.rs deleted file mode 100644 index ea11cd2..0000000 --- a/src/named_source.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::{MietteError, MietteSpanContents, SourceCode, SpanContents}; - -/// Utility struct for when you have a regular [`SourceCode`] type that doesn't -/// implement `name`. For example [`String`]. Or if you want to override the -/// `name` returned by the `SourceCode`. -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct NamedSource { - source: S, - name: String, - language: Option, -} - -impl std::fmt::Debug for NamedSource { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("NamedSource") - .field("name", &self.name) - .field("source", &"") - .field("language", &self.language); - Ok(()) - } -} - -impl NamedSource { - /// Create a new `NamedSource` using a regular [`SourceCode`] and giving - /// its returned [`SpanContents`] a name. - pub fn new(name: impl AsRef, source: S) -> Self - where - S: Send + Sync, - { - Self { - source, - name: name.as_ref().to_string(), - language: None, - } - } - - /// Gets the name of this `NamedSource`. - pub fn name(&self) -> &str { - &self.name - } - - /// Returns a reference the inner [`SourceCode`] type for this - /// `NamedSource`. - pub fn inner(&self) -> &S { - &self.source - } - - /// Sets the [`language`](SpanContents::language) for this source code. - pub fn with_language(mut self, language: impl Into) -> Self { - self.language = Some(language.into()); - self - } -} - -impl SourceCode for NamedSource { - fn read_span<'a>( - &'a self, - span: &crate::SourceSpan, - context_lines_before: usize, - context_lines_after: usize, - ) -> Result + 'a>, MietteError> { - let inner_contents = - self.inner() - .read_span(span, context_lines_before, context_lines_after)?; - let mut contents = MietteSpanContents::new_named( - self.name.clone(), - inner_contents.data(), - *inner_contents.span(), - inner_contents.line(), - inner_contents.column(), - inner_contents.line_count(), - ); - if let Some(language) = &self.language { - contents = contents.with_language(language); - } - Ok(Box::new(contents)) - } -} diff --git a/src/protocol.rs b/src/protocol.rs index 7f09d4d..5b278de 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -253,6 +253,16 @@ pub trait SourceCode: Send + Sync { context_lines_before: usize, context_lines_after: usize, ) -> Result + 'a>, MietteError>; + + /// Optional method. Get this `SourceCode`'s name. + fn name(&self) -> Option<&str> { + None + } + + /// Optional method. Get this `SourceCode`'s language. + fn language(&self) -> Option<&str> { + None + } } /// A labeled [`SourceSpan`]. @@ -439,10 +449,6 @@ pub trait SpanContents<'a> { fn data(&self) -> &'a [u8]; /// [`SourceSpan`] representing the span covered by this `SpanContents`. fn span(&self) -> &SourceSpan; - /// An optional (file?) name for the container of this `SpanContents`. - fn name(&self) -> Option<&str> { - None - } /// The 0-indexed line in the associated [`SourceCode`] where the data /// begins. fn line(&self) -> usize; @@ -451,15 +457,6 @@ pub trait SpanContents<'a> { fn column(&self) -> usize; /// Total number of lines covered by this `SpanContents`. fn line_count(&self) -> usize; - - /// Optional method. The language name for this source code, if any. - /// This is used to drive syntax highlighting. - /// - /// Examples: Rust, TOML, C - /// - fn language(&self) -> Option<&str> { - None - } } /** @@ -477,10 +474,6 @@ pub struct MietteSpanContents<'a> { column: usize, // Number of line in this snippet. line_count: usize, - // Optional filename - name: Option, - // Optional language - language: Option, } impl<'a> MietteSpanContents<'a> { @@ -498,36 +491,8 @@ impl<'a> MietteSpanContents<'a> { line, column, line_count, - name: None, - language: None, } } - - /// Make a new [`MietteSpanContents`] object, with a name for its 'file'. - pub const fn new_named( - name: String, - data: &'a [u8], - span: SourceSpan, - line: usize, - column: usize, - line_count: usize, - ) -> MietteSpanContents<'a> { - MietteSpanContents { - data, - span, - line, - column, - line_count, - name: Some(name), - language: None, - } - } - - /// Sets the [`language`](SpanContents::language) for syntax highlighting. - pub fn with_language(mut self, language: impl Into) -> Self { - self.language = Some(language.into()); - self - } } impl<'a> SpanContents<'a> for MietteSpanContents<'a> { @@ -546,12 +511,6 @@ impl<'a> SpanContents<'a> for MietteSpanContents<'a> { fn line_count(&self) -> usize { self.line_count } - fn name(&self) -> Option<&str> { - self.name.as_deref() - } - fn language(&self) -> Option<&str> { - self.language.as_deref() - } } /// Span within a [`SourceCode`] diff --git a/src/source_code.rs b/src/source_code.rs new file mode 100644 index 0000000..eab578e --- /dev/null +++ b/src/source_code.rs @@ -0,0 +1,82 @@ +use crate::{MietteError, SourceCode, SourceSpan, SpanContents}; + +/// Utility struct for adding attributes such as `name` and `language` to a [`SourceCode`], +/// or if you want to override those attributes from another [`SourceCode`]: +/// +/// ``` +/// # use miette::MietteSourceCode; +/// let src = MietteSourceCode::new("fn f() {}").with_name("snippet").with_language("Rust"); +/// ``` +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct MietteSourceCode { + source: S, + name: Option, + language: Option, +} + +impl MietteSourceCode { + /// Make a new [`MietteSourceCode`] object. + pub fn new(source: S) -> Self { + Self { + source, + name: None, + language: None, + } + } + + /// Set the name for this source code. + pub fn with_name(mut self, name: impl AsRef) -> Self { + self.name = Some(name.as_ref().to_string()); + self + } + + /// Set the language name for this source code. + /// + /// This is used to drive syntax highlighting when the `syntect-highlighter` + /// feature is enabled. + /// + /// Examples: `"Rust"`, `"Python"`, `"C"` + /// + /// The list of language names comes from the [`syntect`] crate. + /// See https://github.com/trishume/syntect/issues/168 + pub fn with_language(mut self, language: impl AsRef) -> Self { + self.language = Some(language.as_ref().to_string()); + self + } +} + +impl std::fmt::Debug for MietteSourceCode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NamedSource") + .field("name", &self.name) + .field("language", &self.language) + .field("source", &""); + Ok(()) + } +} + +impl SourceCode for MietteSourceCode { + fn read_span<'a>( + &'a self, + span: &SourceSpan, + context_lines_before: usize, + context_lines_after: usize, + ) -> Result + 'a>, MietteError> { + self.source + .read_span(span, context_lines_before, context_lines_after) + } + + fn name(&self) -> Option<&str> { + self.name.as_deref() + } + + fn language(&self) -> Option<&str> { + self.language.as_deref() + } +} + +impl From for MietteSourceCode { + fn from(source: S) -> Self { + MietteSourceCode::new(source) + } +} diff --git a/tests/graphical.rs b/tests/graphical.rs index b80e16d..8b3cac5 100644 --- a/tests/graphical.rs +++ b/tests/graphical.rs @@ -1,9 +1,10 @@ #![cfg(feature = "fancy-no-backtrace")] use miette::{ - Diagnostic, GraphicalReportHandler, GraphicalTheme, MietteError, NamedSource, + Diagnostic, GraphicalReportHandler, GraphicalTheme, MietteError, MietteSourceCode, NarratableReportHandler, Report, SourceSpan, }; +use std::fmt::Debug; use thiserror::Error; fn fmt_report(diag: Report) -> String { @@ -417,14 +418,14 @@ fn empty_source() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 0).into(), }; let out = fmt_report(err.into()); @@ -450,22 +451,22 @@ fn multiple_spans_multiline() { #[diagnostic(severity(Error))] struct MyBad { #[source_code] - src: NamedSource<&'static str>, + src: MietteSourceCode<&'static str>, #[label("big")] big: SourceSpan, #[label("small")] small: SourceSpan, } let err = MyBad { - src: NamedSource::new( - "issue", + src: MietteSourceCode::new( "\ if true { a } else { b }", - ), + ) + .with_name("issue"), big: (0, 32).into(), small: (14, 1).into(), }; @@ -496,12 +497,12 @@ fn single_line_highlight_span_full_line() { #[diagnostic(severity(Error))] struct MyBad { #[source_code] - src: NamedSource<&'static str>, + src: MietteSourceCode<&'static str>, #[label("This bit here")] bad_bit: SourceSpan, } let err = MyBad { - src: NamedSource::new("issue", "source\ntext"), + src: MietteSourceCode::new("source\ntext").with_name("issue"), bad_bit: (7, 4).into(), }; let out = fmt_report(err.into()); @@ -527,14 +528,14 @@ fn single_line_with_wide_char() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n πŸ‘ΌπŸΌtext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (13, 8).into(), }; let out = fmt_report(err.into()); @@ -564,7 +565,7 @@ fn single_line_with_two_tabs() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } @@ -573,7 +574,7 @@ fn single_line_with_two_tabs() -> Result<(), MietteError> { let src = "source\n\t\ttext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -603,7 +604,7 @@ fn single_line_with_tab_in_middle() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } @@ -612,7 +613,7 @@ fn single_line_with_tab_in_middle() -> Result<(), MietteError> { let src = "source\ntext =\ttext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (14, 4).into(), }; let out = fmt_report(err.into()); @@ -642,14 +643,14 @@ fn single_line_highlight() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -686,7 +687,7 @@ fn external_source() -> Result<(), MietteError> { let err = Report::from(MyBad { highlight: (9, 4).into(), }) - .with_source_code(NamedSource::new("bad_file.rs", src)); + .with_source_code(MietteSourceCode::new(src).with_name("bad_file.rs")); let out = fmt_report(err); println!("Error: {}", out); let expected = r#"oops::my::bad @@ -714,14 +715,14 @@ fn single_line_highlight_offset_zero() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 0).into(), }; let out = fmt_report(err.into()); @@ -750,14 +751,14 @@ fn single_line_highlight_offset_end_of_line() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (6, 0).into(), }; let out = fmt_report(err.into()); @@ -786,14 +787,14 @@ fn single_line_highlight_include_end_of_line() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 5).into(), }; let out = fmt_report(err.into()); @@ -823,14 +824,14 @@ fn single_line_highlight_include_end_of_line_crlf() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\r\n text\r\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (10, 6).into(), }; let out = fmt_report(err.into()); @@ -860,14 +861,14 @@ fn single_line_highlight_with_empty_span() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 0).into(), }; let out = fmt_report(err.into()); @@ -897,14 +898,14 @@ fn single_line_highlight_no_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -933,14 +934,14 @@ fn single_line_highlight_at_line_start() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\ntext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (7, 4).into(), }; let out = fmt_report(err.into()); @@ -970,14 +971,14 @@ fn multiline_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here\nand\nthis\ntoo")] highlight: SourceSpan, } let src = "source\ntext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (7, 4).into(), }; let out = fmt_report(err.into()); @@ -1010,7 +1011,7 @@ fn multiple_multi_line_labels() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "x\ny"] highlight1: SourceSpan, #[label = "z\nw"] @@ -1021,7 +1022,7 @@ fn multiple_multi_line_labels() -> Result<(), MietteError> { let src = "source\n text text text text text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (9, 4).into(), highlight2: (14, 4).into(), highlight3: (24, 4).into(), @@ -1058,7 +1059,7 @@ fn multiple_same_line_highlights() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "x"] highlight1: SourceSpan, #[label = "y"] @@ -1069,7 +1070,7 @@ fn multiple_same_line_highlights() -> Result<(), MietteError> { let src = "source\n text text text text text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (9, 4).into(), highlight2: (14, 4).into(), highlight3: (24, 4).into(), @@ -1103,7 +1104,7 @@ fn multiple_same_line_highlights_with_tabs_in_middle() -> Result<(), MietteError #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "x"] highlight1: SourceSpan, #[label = "y"] @@ -1116,7 +1117,7 @@ fn multiple_same_line_highlights_with_tabs_in_middle() -> Result<(), MietteError let src = "source\n text text text\ttext text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (9, 4).into(), highlight2: (14, 4).into(), highlight3: (24, 4).into(), @@ -1150,14 +1151,14 @@ fn multiline_highlight_adjacent() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "these two lines"] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 11).into(), }; let out = fmt_report(err.into()); @@ -1186,14 +1187,14 @@ fn multiline_highlight_multiline_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "these two lines\nare the problem"] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 11).into(), }; let out = fmt_report(err.into()); @@ -1223,7 +1224,7 @@ fn multiline_highlight_flyby() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label = "block 2"] @@ -1239,7 +1240,7 @@ line5 .to_string(); let len = src.len(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -1274,7 +1275,7 @@ fn multiline_highlight_no_label() -> Result<(), MietteError> { #[source] source: Inner, #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label] @@ -1299,7 +1300,7 @@ line5 let len = src.len(); let err = MyBad { source: Inner(InnerInner), - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -1338,7 +1339,7 @@ fn multiple_multiline_highlights_adjacent() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -1347,7 +1348,7 @@ fn multiple_multiline_highlights_adjacent() -> Result<(), MietteError> { let src = "source\n text\n here\nmore here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 10).into(), highlight2: (20, 6).into(), }; @@ -1384,7 +1385,7 @@ fn multiple_multiline_highlights_overlapping_lines() -> Result<(), MietteError> #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -1393,7 +1394,7 @@ fn multiple_multiline_highlights_overlapping_lines() -> Result<(), MietteError> let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (9, 10).into(), }; @@ -1412,7 +1413,7 @@ fn multiple_multiline_highlights_overlapping_offsets() -> Result<(), MietteError #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -1421,7 +1422,7 @@ fn multiple_multiline_highlights_overlapping_offsets() -> Result<(), MietteError let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (10, 10).into(), }; @@ -1516,7 +1517,7 @@ fn related() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -1525,10 +1526,10 @@ fn related() -> Result<(), MietteError> { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 6).into(), related: vec![], }], @@ -1571,7 +1572,7 @@ fn related_source_code_propagation() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -1588,7 +1589,7 @@ fn related_source_code_propagation() -> Result<(), MietteError> { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![InnerError { highlight: (0, 6).into(), @@ -1631,7 +1632,7 @@ fn related_severity() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -1648,7 +1649,7 @@ fn related_severity() -> Result<(), MietteError> { )] Error { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -1661,7 +1662,7 @@ fn related_severity() -> Result<(), MietteError> { )] Warning { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -1674,7 +1675,7 @@ fn related_severity() -> Result<(), MietteError> { )] Advice { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -1682,19 +1683,19 @@ fn related_severity() -> Result<(), MietteError> { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![ MyRelated::Error { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (0, 6).into(), }, MyRelated::Warning { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (0, 6).into(), }, MyRelated::Advice { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 6).into(), }, ], @@ -1759,12 +1760,13 @@ fn zero_length_eol_span() { #[diagnostic(severity(Error))] struct MyBad { #[source_code] - src: NamedSource<&'static str>, + src: MietteSourceCode<&'static str>, #[label("This bit here")] bad_bit: SourceSpan, } let err = MyBad { - src: NamedSource::new("issue", "this is the first line\nthis is the second line"), + src: MietteSourceCode::new("this is the first line\nthis is the second line") + .with_name("issue"), bad_bit: (23, 0).into(), }; let out = fmt_report(err.into()); @@ -1789,14 +1791,15 @@ fn primary_label() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource<&'static str>, + src: MietteSourceCode<&'static str>, #[label] first_label: SourceSpan, #[label(primary, "nope")] second_label: SourceSpan, } let err = MyBad { - src: NamedSource::new("issue", "this is the first line\nthis is the second line"), + src: MietteSourceCode::new("this is the first line\nthis is the second line") + .with_name("issue"), first_label: (2, 4).into(), second_label: (24, 4).into(), }; @@ -1825,14 +1828,14 @@ fn single_line_with_wide_char_unaligned_span_start() -> Result<(), MietteError> #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n πŸ‘ΌπŸΌtext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (10, 5).into(), }; let out = fmt_report(err.into()); @@ -1862,14 +1865,14 @@ fn single_line_with_wide_char_unaligned_span_end() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text πŸ‘ΌπŸΌ\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 6).into(), }; let out = fmt_report(err.into()); @@ -1899,14 +1902,14 @@ fn single_line_with_wide_char_unaligned_span_empty() -> Result<(), MietteError> #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n πŸ‘ΌπŸΌtext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (10, 0).into(), }; let out = fmt_report(err.into()); @@ -1938,17 +1941,17 @@ fn syntax_highlighter() { #[diagnostic()] pub struct Test { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this is a label")] src_span: SourceSpan, } - let src = NamedSource::new( - "hello_world", //NOTE: intentionally missing file extension - "fn main() {\n println!(\"Hello, World!\");\n}\n".to_string(), - ) - .with_language("Rust"); + let name = "hello_world"; // NOTE: intentionally missing file extension + let src = + MietteSourceCode::new("fn main() {\n println!(\"Hello, World!\");\n}\n".to_string()) + .with_language("Rust"); + let src_with_name = src.clone().with_name(name); let err = Test { - src, + src: src_with_name, src_span: (16, 26).into(), }; let mut out = String::new(); @@ -1966,8 +1969,33 @@ fn syntax_highlighter() { ╰──── "# .trim_start_matches('\n'); - assert!(out.contains("\u{1b}[38;2;180;142;173m")); - assert_eq!(expected, strip_ansi_escapes::strip_str(out)) + let colors = "\u{1b}[38;2;180;142;173m"; + assert!(out.contains(colors)); + assert_eq!(expected, strip_ansi_escapes::strip_str(out)); + + // test unnamed source code + let err = Test { + src, + src_span: (16, 26).into(), + }; + let mut out = String::new(); + GraphicalReportHandler::new_themed(GraphicalTheme::unicode()) + .render_report(&mut out, &err) + .unwrap(); + + let expected = r#" + Γ— This is an error + ╭─[2:5] + 1 β”‚ fn main() { + 2 β”‚ println!("Hello, World!"); + Β· ─────────────┬──────────── + Β· ╰── this is a label + 3 β”‚ } + ╰──── +"# + .trim_start_matches('\n'); + assert!(out.contains(colors)); + assert_eq!(expected, strip_ansi_escapes::strip_str(out)); } // This test reads a line from the current source file and renders it with Rust @@ -1985,7 +2013,7 @@ fn syntax_highlighter_on_real_file() { #[diagnostic()] pub struct Test { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this is a label")] src_span: SourceSpan, } @@ -2000,7 +2028,7 @@ fn syntax_highlighter_on_real_file() { let file_src = std::fs::read_to_string(filename).unwrap(); let offset = miette::SourceOffset::from_location(&file_src, line, CO); let err = Test { - src: NamedSource::new(filename, file_src.clone()), + src: MietteSourceCode::new(file_src.clone()).with_name(filename), src_span: SourceSpan::new(offset, LEN), }; @@ -2037,7 +2065,7 @@ fn triple_adjacent_highlight() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -2048,7 +2076,7 @@ fn triple_adjacent_highlight() -> Result<(), MietteError> { let src = "source\n\n\n text\n\n\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 6).into(), highlight2: (11, 4).into(), highlight3: (22, 4).into(), @@ -2086,7 +2114,7 @@ fn non_adjacent_highlight() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -2095,7 +2123,7 @@ fn non_adjacent_highlight() -> Result<(), MietteError> { let src = "source\n\n\n\n text here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 6).into(), highlight2: (12, 4).into(), }; @@ -2129,14 +2157,14 @@ fn invalid_span_bad_offset() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "1st"] highlight1: SourceSpan, } let src = "blabla blibli".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (50, 6).into(), }; let out = fmt_report(err.into()); @@ -2158,14 +2186,14 @@ fn invalid_span_bad_length() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "1st"] highlight1: SourceSpan, } let src = "blabla blibli".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 50).into(), }; let out = fmt_report(err.into()); @@ -2187,14 +2215,14 @@ fn invalid_span_no_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label] highlight1: SourceSpan, } let src = "blabla blibli".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (50, 6).into(), }; let out = fmt_report(err.into()); @@ -2216,7 +2244,7 @@ fn invalid_span_2nd_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("1st")] highlight1: SourceSpan, #[label("2nd")] @@ -2225,7 +2253,7 @@ fn invalid_span_2nd_label() -> Result<(), MietteError> { let src = "blabla blibli".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 6).into(), highlight2: (50, 6).into(), }; @@ -2248,7 +2276,7 @@ fn invalid_span_inner() -> Result<(), MietteError> { #[diagnostic(code(oops::my::inner), help("help info"))] struct MyInner { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("inner label")] inner_label: SourceSpan, } @@ -2258,7 +2286,7 @@ fn invalid_span_inner() -> Result<(), MietteError> { #[diagnostic(code(oops::my::outer), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("outer label")] outer_label: SourceSpan, #[source] @@ -2268,10 +2296,10 @@ fn invalid_span_inner() -> Result<(), MietteError> { let src_outer = "outer source".to_string(); let src_inner = "inner source".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src_outer), + src: MietteSourceCode::new(src_outer).with_name("bad_file.rs"), outer_label: (0, 6).into(), inner: MyInner { - src: NamedSource::new("bad_file2.rs", src_inner), + src: MietteSourceCode::new(src_inner).with_name("bad_file2.rs"), inner_label: (60, 6).into(), }, }; @@ -2299,7 +2327,7 @@ fn invalid_span_related() -> Result<(), MietteError> { #[diagnostic(code(oops::my::inner), help("help info"))] struct MyRelated { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("inner label")] inner_label: SourceSpan, } @@ -2309,7 +2337,7 @@ fn invalid_span_related() -> Result<(), MietteError> { #[diagnostic(code(oops::my::outer), help("help info"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("outer label")] outer_label: SourceSpan, #[related] @@ -2319,10 +2347,10 @@ fn invalid_span_related() -> Result<(), MietteError> { let src_outer = "outer source".to_string(); let src_inner = "related source".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src_outer), + src: MietteSourceCode::new(src_outer).with_name("bad_file.rs"), outer_label: (0, 6).into(), inner: vec![MyRelated { - src: NamedSource::new("bad_file2.rs", src_inner), + src: MietteSourceCode::new(src_inner).with_name("bad_file2.rs"), inner_label: (60, 6).into(), }], }; diff --git a/tests/narrated.rs b/tests/narrated.rs index 52acd13..e329eb0 100644 --- a/tests/narrated.rs +++ b/tests/narrated.rs @@ -1,6 +1,8 @@ #![cfg(feature = "fancy-no-backtrace")] -use miette::{Diagnostic, MietteError, NamedSource, NarratableReportHandler, Report, SourceSpan}; +use miette::{ + Diagnostic, MietteError, MietteSourceCode, NarratableReportHandler, Report, SourceSpan, +}; use miette::{GraphicalReportHandler, GraphicalTheme}; @@ -29,14 +31,14 @@ fn single_line_with_wide_char() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n πŸ‘ΌπŸΌtext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 6).into(), }; let out = fmt_report(err.into()); @@ -65,14 +67,14 @@ fn single_line_highlight() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -101,14 +103,14 @@ fn single_line_highlight_offset_zero() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 0).into(), }; let out = fmt_report(err.into()); @@ -136,14 +138,14 @@ fn single_line_highlight_with_empty_span() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 0).into(), }; let out = fmt_report(err.into()); @@ -172,14 +174,14 @@ fn single_line_highlight_no_label() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -208,14 +210,14 @@ fn single_line_highlight_at_line_start() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\ntext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (7, 4).into(), }; let out = fmt_report(err.into()); @@ -244,7 +246,7 @@ fn multiple_same_line_highlights() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "x"] highlight1: SourceSpan, #[label = "y"] @@ -255,7 +257,7 @@ fn multiple_same_line_highlights() -> Result<(), MietteError> { let src = "source\n text text text text text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (9, 4).into(), highlight2: (14, 4).into(), highlight3: (24, 4).into(), @@ -288,14 +290,14 @@ fn multiline_highlight_adjacent() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "these two lines"] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 11).into(), }; let out = fmt_report(err.into()); @@ -325,7 +327,7 @@ fn multiline_highlight_flyby() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label = "block 2"] @@ -341,7 +343,7 @@ line5 .to_string(); let len = src.len(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -378,7 +380,7 @@ fn multiline_highlight_no_label() -> Result<(), MietteError> { #[source] source: Inner, #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label] @@ -403,7 +405,7 @@ line5 let len = src.len(); let err = MyBad { source: Inner(InnerInner), - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -444,7 +446,7 @@ fn multiple_multiline_highlights_adjacent() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -453,7 +455,7 @@ fn multiple_multiline_highlights_adjacent() -> Result<(), MietteError> { let src = "source\n text\n here\nmore here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 10).into(), highlight2: (20, 6).into(), }; @@ -492,7 +494,7 @@ fn multiple_multiline_highlights_overlapping_lines() -> Result<(), MietteError> #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -501,7 +503,7 @@ fn multiple_multiline_highlights_overlapping_lines() -> Result<(), MietteError> let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (9, 10).into(), }; @@ -520,7 +522,7 @@ fn multiple_multiline_highlights_overlapping_offsets() -> Result<(), MietteError #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -529,7 +531,7 @@ fn multiple_multiline_highlights_overlapping_offsets() -> Result<(), MietteError let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (10, 10).into(), }; @@ -559,7 +561,7 @@ fn related() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -568,10 +570,10 @@ fn related() -> Result<(), MietteError> { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 6).into(), related: vec![], }], @@ -614,7 +616,7 @@ fn related_source_code_propagation() -> Result<(), MietteError> { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -631,7 +633,7 @@ fn related_source_code_propagation() -> Result<(), MietteError> { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![InnerError { highlight: (0, 6).into(), diff --git a/tests/test_derive_attr.rs b/tests/test_derive_attr.rs index f1b0f3d..f664b92 100644 --- a/tests/test_derive_attr.rs +++ b/tests/test_derive_attr.rs @@ -1,5 +1,5 @@ // Testing of the `diagnostic` attr used by derive(Diagnostic) -use miette::{Diagnostic, LabeledSpan, NamedSource, SourceSpan}; +use miette::{Diagnostic, LabeledSpan, MietteSourceCode, SourceSpan}; use thiserror::Error; #[test] @@ -10,7 +10,7 @@ fn enum_uses_base_attr() { enum MyBad { Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -18,7 +18,7 @@ fn enum_uses_base_attr() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; assert_eq!(err.code().unwrap().to_string(), "error::on::base"); @@ -32,7 +32,7 @@ fn enum_uses_variant_attr() { #[diagnostic(code(error::on::variant))] Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -40,7 +40,7 @@ fn enum_uses_variant_attr() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; assert_eq!(err.code().unwrap().to_string(), "error::on::variant"); @@ -55,7 +55,7 @@ fn multiple_attrs_allowed_on_item() { enum MyBad { Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -63,7 +63,7 @@ fn multiple_attrs_allowed_on_item() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; assert_eq!(err.code().unwrap().to_string(), "error::on::base"); @@ -79,7 +79,7 @@ fn multiple_attrs_allowed_on_variant() { #[diagnostic(help("try doing it correctly"))] Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -87,7 +87,7 @@ fn multiple_attrs_allowed_on_variant() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; assert_eq!(err.code().unwrap().to_string(), "error::on::variant"); @@ -104,7 +104,7 @@ fn attrs_can_be_split_between_item_and_variants() { #[diagnostic(url("https://example.com/foo/bar"))] Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -112,7 +112,7 @@ fn attrs_can_be_split_between_item_and_variants() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; assert_eq!(err.code().unwrap().to_string(), "error::on::base"); @@ -130,7 +130,7 @@ fn attr_not_required() { enum MyBad { Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, }, @@ -138,7 +138,7 @@ fn attr_not_required() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let err_span = err.labels().unwrap().next().unwrap(); diff --git a/tests/test_derive_collection.rs b/tests/test_derive_collection.rs index 952b505..cd854bf 100644 --- a/tests/test_derive_collection.rs +++ b/tests/test_derive_collection.rs @@ -4,7 +4,7 @@ use std::{ }; // Testing of the `diagnostic` attr used by derive(Diagnostic) -use miette::{Diagnostic, LabeledSpan, NamedSource, SourceSpan}; +use miette::{Diagnostic, LabeledSpan, MietteSourceCode, SourceSpan}; use thiserror::Error; #[test] @@ -14,7 +14,7 @@ fn attr_collection_in_enum() { enum MyBad { Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -24,7 +24,7 @@ fn attr_collection_in_enum() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![(1, 2).into(), (3, 4).into()], }; @@ -46,7 +46,7 @@ fn attr_collection_in_struct() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -55,7 +55,7 @@ fn attr_collection_in_struct() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![(1, 2).into(), (3, 4).into()], }; @@ -77,7 +77,7 @@ fn attr_collection_as_deque() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -86,7 +86,7 @@ fn attr_collection_as_deque() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: VecDeque::from([(1, 2).into(), (3, 4).into()]), }; @@ -108,7 +108,7 @@ fn attr_collection_as_linked_list() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -117,7 +117,7 @@ fn attr_collection_as_linked_list() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: LinkedList::from([(1, 2).into(), (3, 4).into()]), }; @@ -139,7 +139,7 @@ fn attr_collection_of_tuple() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -148,7 +148,7 @@ fn attr_collection_of_tuple() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![(1, 2), (3, 4)], }; @@ -170,7 +170,7 @@ fn attr_collection_of_range() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -179,7 +179,7 @@ fn attr_collection_of_range() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![1..3, 3..7], }; @@ -201,7 +201,7 @@ fn attr_collection_of_labeled_span_in_struct() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "then there")] @@ -210,7 +210,7 @@ fn attr_collection_of_labeled_span_in_struct() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![ LabeledSpan::new_with_span(Some("continuing here".to_string()), (1, 2)), @@ -236,7 +236,7 @@ fn attr_collection_of_labeled_span_in_enum() { enum MyBad { Only { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "then there")] @@ -246,7 +246,7 @@ fn attr_collection_of_labeled_span_in_enum() { let src = "source\n text\n here".to_string(); let err = MyBad::Only { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![ LabeledSpan::new_with_span(Some("continuing here".to_string()), (1, 2)), @@ -271,7 +271,7 @@ fn attr_collection_multi() { #[error("oops!")] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[label(collection, "and here")] @@ -282,7 +282,7 @@ fn attr_collection_multi() { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), highlight2: vec![(1, 2).into(), (3, 4).into()], highlight3: vec![(5, 6).into(), (7, 8).into()], diff --git a/tests/test_json.rs b/tests/test_json.rs index 664318a..21d63dd 100644 --- a/tests/test_json.rs +++ b/tests/test_json.rs @@ -1,5 +1,5 @@ mod json_report_handler { - use miette::{Diagnostic, MietteError, NamedSource, Report, SourceSpan}; + use miette::{Diagnostic, MietteError, MietteSourceCode, Report, SourceSpan}; use miette::JSONReportHandler; @@ -20,14 +20,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n πŸ‘ΌπŸΌtext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 6).into(), }; let out = fmt_report(err.into()); @@ -65,14 +65,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -110,14 +110,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (0, 0).into(), }; let out = fmt_report(err.into()); @@ -155,14 +155,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 0).into(), }; let out = fmt_report(err.into()); @@ -200,14 +200,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), }; let out = fmt_report(err.into()); @@ -244,14 +244,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, } let src = "source\ntext\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (7, 4).into(), }; let out = fmt_report(err.into()); @@ -289,7 +289,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "x"] highlight1: SourceSpan, #[label = "y"] @@ -300,7 +300,7 @@ mod json_report_handler { let src = "source\n text text text text text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (9, 4).into(), highlight2: (14, 4).into(), highlight3: (24, 4).into(), @@ -354,14 +354,14 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "these two lines"] highlight: SourceSpan, } let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 11).into(), }; let out = fmt_report(err.into()); @@ -399,7 +399,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label = "block 2"] @@ -415,7 +415,7 @@ mod json_report_handler { .to_string(); let len = src.len(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -463,7 +463,7 @@ mod json_report_handler { #[source] source: Inner, #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "block 1"] highlight1: SourceSpan, #[label] @@ -488,7 +488,7 @@ mod json_report_handler { let len = src.len(); let err = MyBad { source: Inner(InnerInner), - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, len).into(), highlight2: (10, 9).into(), }; @@ -536,7 +536,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -545,7 +545,7 @@ mod json_report_handler { let src = "source\n text\n here\nmore here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 10).into(), highlight2: (20, 6).into(), }; @@ -591,7 +591,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -600,7 +600,7 @@ mod json_report_handler { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (9, 10).into(), }; @@ -646,7 +646,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label = "this bit here"] highlight1: SourceSpan, #[label = "also this bit"] @@ -655,7 +655,7 @@ mod json_report_handler { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight1: (0, 8).into(), highlight2: (10, 10).into(), }; @@ -728,7 +728,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -737,16 +737,16 @@ mod json_report_handler { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![ MyBad { - src: NamedSource::new("bad_file2.rs", src.clone()), + src: MietteSourceCode::new(src.clone()).with_name("bad_file2.rs"), highlight: (0, 6).into(), related: vec![], }, MyBad { - src: NamedSource::new("bad_file3.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file3.rs"), highlight: (0, 6).into(), related: vec![], }, @@ -821,7 +821,7 @@ mod json_report_handler { #[diagnostic(code(oops::my::bad), help("try doing it better next time?"))] struct MyBad { #[source_code] - src: NamedSource, + src: MietteSourceCode, #[label("this bit here")] highlight: SourceSpan, #[related] @@ -838,7 +838,7 @@ mod json_report_handler { let src = "source\n text\n here".to_string(); let err = MyBad { - src: NamedSource::new("bad_file.rs", src), + src: MietteSourceCode::new(src).with_name("bad_file.rs"), highlight: (9, 4).into(), related: vec![ InnerError {