diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2025-02-10 11:56:58 +1300 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2025-02-10 11:56:58 +1300 |
commit | fd6b4471955dac64b7d40b7c31992c15d52b2460 (patch) | |
tree | 5b2561150e0eac0922a8ff40dd34da6a3ca76f7c | |
parent | 2d67476d48fcb33cd1c59cbc2e0f82872bc0c217 (diff) | |
download | assembler-fd6b4471955dac64b7d40b7c31992c15d52b2460.zip |
Move report-printing structs to separate module
-rw-r--r-- | src/errors/mod.rs | 66 | ||||
-rw-r--r-- | src/lib.rs | 4 | ||||
-rw-r--r-- | src/reports/mod.rs | 69 | ||||
-rw-r--r-- | src/reports/resolver_error.rs (renamed from src/errors/resolver_error.rs) | 0 | ||||
-rw-r--r-- | src/reports/source_hierarchy.rs (renamed from src/source_hierarchy.rs) | 0 |
5 files changed, 71 insertions, 68 deletions
diff --git a/src/errors/mod.rs b/src/errors/mod.rs index b0bf7e4..4bf3f0f 100644 --- a/src/errors/mod.rs +++ b/src/errors/mod.rs @@ -1,71 +1,5 @@ mod file_error; mod merge_error; -mod resolver_error; pub use file_error::*; pub use merge_error::*; -pub use resolver_error::*; - -use crate::*; - -use ansi::*; -use log::LogLevel; - - -pub fn report_source_issue(level: LogLevel, context: &Context, message: &str) { - // Prepare variables. - let in_merged = &context.source.in_merged; - let line_num = in_merged.start.line + 1; - let digits = line_num.to_string().len(); - let w = digits + 3; - let arrow = "-->"; - let mut string = message.to_string(); - - macro_rules! push { - ($($tokens:tt)*) => { string.push_str(&format!($($tokens)*)) }; - } - - // Format message and locations. - push!("{NORMAL}\n"); - push!("{BLUE}{arrow:>w$}{NORMAL} {in_merged}\n", w=w); - if let Some(in_source) = &context.source.in_source { - push!("{BLUE}{arrow:>w$}{NORMAL} {in_source}\n", w=w); - } - - // Format source context. - let left = in_merged.start.column; - let right = in_merged.end.column + 1; - let source_line = context.source_code.split('\n').nth(in_merged.start.line) - .unwrap_or("<error reading line from source>"); - let space = " "; - let colour = match level { - LogLevel::Info => BLUE, - LogLevel::Warn => YELLOW, - LogLevel::Error => RED, - LogLevel::Fatal => RED, - }; - - // Print source code line. - push!("{BLUE} {line_num} | {NORMAL}"); - for (i, c) in source_line.chars().enumerate() { - if i == left { push!("{colour}") } - if i == right { push!("{NORMAL}") } - push!("{c}"); - } - push!("{NORMAL}\n"); - - // Print source code underline. - push!("{BLUE} {space:>w$} | {NORMAL}", w=digits); - for _ in 0..left { push!(" "); } - push!("{colour}"); - for _ in left..right { push!("^"); } - push!("{NORMAL}"); - - // Print the completed message. - match level { - LogLevel::Info => log::info!( "{}", string), - LogLevel::Warn => log::warn!( "{}", string), - LogLevel::Error => log::error!("{}", string), - LogLevel::Fatal => log::fatal!("{}", string), - } -} @@ -5,7 +5,7 @@ mod context; mod errors; mod locators; mod resolver; -mod source_hierarchy; +mod reports; mod source_unit; mod tokeniser; @@ -13,6 +13,6 @@ pub use context::*; pub use errors::*; pub use locators::*; pub use resolver::*; -pub use source_hierarchy::*; +pub use reports::*; pub use source_unit::*; pub use tokeniser::*; diff --git a/src/reports/mod.rs b/src/reports/mod.rs new file mode 100644 index 0000000..9ab3da3 --- /dev/null +++ b/src/reports/mod.rs @@ -0,0 +1,69 @@ +mod resolver_error; +mod source_hierarchy; + +pub use resolver_error::*; +pub use source_hierarchy::*; + +use crate::*; + +use ansi::*; +use log::LogLevel; + + +pub fn report_source_issue(level: LogLevel, context: &Context, message: &str) { + // Prepare variables. + let in_merged = &context.source.in_merged; + let line_num = in_merged.start.line + 1; + let digits = line_num.to_string().len(); + let w = digits + 3; + let arrow = "-->"; + let mut string = message.to_string(); + + macro_rules! push { + ($($tokens:tt)*) => { string.push_str(&format!($($tokens)*)) }; + } + + // Format message and locations. + push!("{NORMAL}\n"); + push!("{BLUE}{arrow:>w$}{NORMAL} {in_merged}\n", w=w); + if let Some(in_source) = &context.source.in_source { + push!("{BLUE}{arrow:>w$}{NORMAL} {in_source}\n", w=w); + } + + // Format source context. + let left = in_merged.start.column; + let right = in_merged.end.column + 1; + let source_line = context.source_code.split('\n').nth(in_merged.start.line) + .unwrap_or("<error reading line from source>"); + let space = " "; + let colour = match level { + LogLevel::Info => BLUE, + LogLevel::Warn => YELLOW, + LogLevel::Error => RED, + LogLevel::Fatal => RED, + }; + + // Print source code line. + push!("{BLUE} {line_num} | {NORMAL}"); + for (i, c) in source_line.chars().enumerate() { + if i == left { push!("{colour}") } + if i == right { push!("{NORMAL}") } + push!("{c}"); + } + push!("{NORMAL}\n"); + + // Print source code underline. + push!("{BLUE} {space:>w$} | {NORMAL}", w=digits); + for _ in 0..left { push!(" "); } + push!("{colour}"); + for _ in left..right { push!("^"); } + push!("{NORMAL}"); + + // Print the completed message. + match level { + LogLevel::Info => log::info!( "{}", string), + LogLevel::Warn => log::warn!( "{}", string), + LogLevel::Error => log::error!("{}", string), + LogLevel::Fatal => log::fatal!("{}", string), + } +} diff --git a/src/errors/resolver_error.rs b/src/reports/resolver_error.rs index 97fc761..97fc761 100644 --- a/src/errors/resolver_error.rs +++ b/src/reports/resolver_error.rs diff --git a/src/source_hierarchy.rs b/src/reports/source_hierarchy.rs index 9478c56..9478c56 100644 --- a/src/source_hierarchy.rs +++ b/src/reports/source_hierarchy.rs |