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 /src/errors | |
parent | 2d67476d48fcb33cd1c59cbc2e0f82872bc0c217 (diff) | |
download | assembler-fd6b4471955dac64b7d40b7c31992c15d52b2460.zip |
Move report-printing structs to separate module
Diffstat (limited to 'src/errors')
-rw-r--r-- | src/errors/mod.rs | 66 | ||||
-rw-r--r-- | src/errors/resolver_error.rs | 30 |
2 files changed, 0 insertions, 96 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), - } -} diff --git a/src/errors/resolver_error.rs b/src/errors/resolver_error.rs deleted file mode 100644 index 97fc761..0000000 --- a/src/errors/resolver_error.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::*; - -use log::LogLevel; - - -pub struct ResolverError<'a> { - pub resolver: &'a Resolver, -} - -impl<'a> ResolverError<'a> { - pub fn report(&self) { - for reference in &self.resolver.unresolved { - let message = format!( - "Undefined symbol, no label or macro has been defined with the name {:?}", - &reference.symbol.name, - ); - let context = reference.context(&self.resolver); - report_source_issue(LogLevel::Error, &context, &message); - } - for redefinition in &self.resolver.redefinitions { - let definition = self.resolver.definitions.get(redefinition.1).unwrap(); - let message = format!( - "Redefined symbol, first defined at {}", - &definition.symbol.source.in_merged, - ); - let context = redefinition.0.context(&self.resolver); - report_source_issue(LogLevel::Error, &context, &message); - } - } -} |