1use std::path::PathBuf;
5
6#[cfg(feature = "derive")]
7use serde::Deserialize;
8
9use crate::{Column, OneIndexed, Row, Span};
10
11#[cfg_attr(feature = "derive", derive(Deserialize))]
12#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))]
13#[derive(Debug, Clone)]
14pub struct DiagnosticSpan {
15 pub file_name: String,
16 pub byte_start: u32,
17 pub byte_end: u32,
18 pub line_start: usize,
20 pub line_end: usize,
21 pub column_start: usize,
23 pub column_end: usize,
24 pub is_primary: bool,
27 pub text: Vec<DiagnosticSpanLine>,
29 pub label: Option<String>,
31 pub suggested_replacement: Option<String>,
36 pub expansion: Option<Box<DiagnosticSpanMacroExpansion>>,
38}
39
40impl DiagnosticSpan {
41 pub fn rls_span(&self) -> Span<OneIndexed> {
42 Span::new(
43 Row::new(self.line_start as u32),
44 Row::new(self.line_end as u32),
45 Column::new(self.column_start as u32),
46 Column::new(self.column_end as u32),
47 PathBuf::from(&self.file_name),
48 )
49 }
50}
51
52#[cfg_attr(feature = "derive", derive(Deserialize))]
53#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))]
54#[derive(Debug, Clone)]
55pub struct DiagnosticSpanLine {
56 pub text: String,
57
58 pub highlight_start: usize,
60
61 pub highlight_end: usize,
62}
63
64#[cfg_attr(feature = "derive", derive(Deserialize))]
65#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable))]
66#[derive(Debug, Clone)]
67pub struct DiagnosticSpanMacroExpansion {
68 pub span: DiagnosticSpan,
72
73 pub macro_decl_name: String,
75
76 pub def_site_span: Option<DiagnosticSpan>,
78}