///! These are the structures emitted by the compiler as part of JSON errors. ///! The original source can be found at ///! https://github.com/rust-lang/rust/blob/master/src/librustc_errors/json.rs use std::path::PathBuf; #[cfg(feature = "derive")] use serde::Deserialize; use crate::{Column, OneIndexed, Row, Span}; #[cfg_attr(feature = "derive", derive(Deserialize))] #[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))] #[derive(Debug, Clone)] pub struct DiagnosticSpan { pub file_name: String, pub byte_start: u32, pub byte_end: u32, /// 1-based. pub line_start: usize, pub line_end: usize, /// 1-based, character offset. pub column_start: usize, pub column_end: usize, /// Is this a "primary" span -- meaning the point, or one of the points, /// where the error occurred? pub is_primary: bool, /// Source text from the start of line_start to the end of line_end. pub text: Vec, /// Label that should be placed at this location (if any) pub label: Option, /// If we are suggesting a replacement, this will contain text /// that should be sliced in atop this span. You may prefer to /// load the fully rendered version from the parent `Diagnostic`, /// however. pub suggested_replacement: Option, /// Macro invocations that created the code at this span, if any. pub expansion: Option>, } impl DiagnosticSpan { pub fn rls_span(&self) -> Span { Span::new( Row::new(self.line_start as u32), Row::new(self.line_end as u32), Column::new(self.column_start as u32), Column::new(self.column_end as u32), PathBuf::from(&self.file_name), ) } } #[cfg_attr(feature = "derive", derive(Deserialize))] #[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))] #[derive(Debug, Clone)] pub struct DiagnosticSpanLine { pub text: String, /// 1-based, character offset in self.text. pub highlight_start: usize, pub highlight_end: usize, } #[cfg_attr(feature = "derive", derive(Deserialize))] #[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))] #[derive(Debug, Clone)] pub struct DiagnosticSpanMacroExpansion { /// span where macro was applied to generate this code; note that /// this may itself derive from a macro (if /// `span.expansion.is_some()`) pub span: DiagnosticSpan, /// name of macro that was applied (e.g., "foo!" or "#[derive(Eq)]") pub macro_decl_name: String, /// span where macro was defined (if known) pub def_site_span: Option, }