microcad_lang/diag/
diag_handler.rs1use crate::{diag::*, resolve::*};
5
6#[derive(Default)]
8pub struct DiagHandler {
9 pub diag_list: DiagList,
11 error_count: u32,
13 warning_count: u32,
15 error_limit: Option<u32>,
18 error_limit_reached: bool,
20 warnings_as_errors: bool,
22 line_offset: usize,
24}
25
26impl DiagHandler {
28 pub fn new(line_offset: usize) -> Self {
30 Self {
31 line_offset,
32 ..Default::default()
33 }
34 }
35
36 pub fn pretty_print(
38 &self,
39 f: &mut dyn std::fmt::Write,
40 source_by_hash: &impl GetSourceByHash,
41 ) -> std::fmt::Result {
42 self.diag_list
43 .pretty_print(f, source_by_hash, self.line_offset)
44 }
45
46 pub fn warning_count(&self) -> u32 {
48 self.warning_count
49 }
50
51 pub fn error_count(&self) -> u32 {
53 self.error_count
54 }
55
56 pub fn error_lines(&self) -> std::collections::HashSet<usize> {
58 self.diag_list
59 .iter()
60 .filter_map(|d| {
61 if d.level() == Level::Error {
62 d.line().map(|line| line + self.line_offset)
63 } else {
64 None
65 }
66 })
67 .collect()
68 }
69
70 pub fn warning_lines(&self) -> std::collections::HashSet<usize> {
72 self.diag_list
73 .iter()
74 .filter_map(|d| {
75 if d.level() == Level::Warning {
76 d.line().map(|line| line + self.line_offset)
77 } else {
78 None
79 }
80 })
81 .collect()
82 }
83
84 pub fn clear(&mut self) {
86 self.diag_list.clear();
87 self.error_count = 0;
88 self.warning_count = 0;
89 }
90}
91
92impl PushDiag for DiagHandler {
93 fn push_diag(&mut self, diag: Diagnostic) -> DiagResult<()> {
94 if let Some(error_limit) = self.error_limit {
95 if self.error_count >= error_limit && !self.error_limit_reached {
96 self.error(
97 &SrcRef(None),
98 Box::new(DiagError::ErrorLimitReached(error_limit)),
99 )?;
100 self.error_limit_reached = true;
101 }
102 return Err(DiagError::ErrorLimitReached(error_limit));
103 }
104
105 match &diag {
106 Diagnostic::Error(_) => {
107 self.error_count += 1;
108 }
109 Diagnostic::Warning(_) => {
110 if self.warnings_as_errors {
111 self.error_count += 1;
112 } else {
113 self.warning_count += 1;
114 }
115 }
116 _ => (),
117 }
118
119 self.diag_list.push_diag(diag)
120 }
121}