summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-09-27 15:48:03 -0400
committerMica White <botahamec@outlook.com>2026-09-27 15:48:03 -0400
commit35f6fc17d0c98f424e01904b8856cf42c80bcfd3 (patch)
treeba99ada4ac6e149c00e5d820b9c5f65e82fed980 /src/main.rs
parent8399983fd45bc0f11eac9def280c0833ffb93c04 (diff)
Add buggy diagnostics
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs54
1 files changed, 47 insertions, 7 deletions
diff --git a/src/main.rs b/src/main.rs
index 1ac5a54..dcfd81b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,7 +2,13 @@ use std::collections::HashMap;
use bpaf::{Bpaf, Parser};
use bumpalo::Bump;
-use kuht::{analyze::symbol_table, compile::compile, parse::parse_document, tokenize::tokenize};
+use kuht::{
+ analyze::symbol_table,
+ compile::compile,
+ diagnostics::{self, DiagnosticsContext},
+ parse::parse_document,
+ tokenize::tokenize,
+};
#[derive(Debug, Clone, Bpaf)]
struct Options {
@@ -21,39 +27,73 @@ struct Options {
fn main() {
let options = options().run();
+ let mut has_failed = false;
+
let sources = options
.files
.into_iter()
.map(|filename| {
- let source = match std::fs::read_to_string(&filename) {
+ let source = match std::fs::read(&filename) {
Ok(source) => source,
Err(error) => {
- eprintln!("{error}");
+ eprintln!("Error: {error}");
std::process::exit(1);
}
};
(filename, source)
})
+ .filter_map(|(filename, source)| {
+ let source: &'static [u8] = Vec::leak(source);
+ let Some(source) = diagnostics::run_character_diagnostics(source) else {
+ has_failed = true;
+ return None;
+ };
+ Some((filename, source))
+ })
.collect::<HashMap<_, _>>();
let arena = Bump::new();
let tokens = sources
.into_iter()
- .map(|(filename, source)| (filename, tokenize(&source, &arena)))
+ .map(|(filename, source)| {
+ (
+ filename,
+ (DiagnosticsContext::new(source), tokenize(source, &arena)),
+ )
+ })
+ .filter(|(_, (ctx, tokens))| {
+ let failed = diagnostics::run_token_diagnostics(ctx, tokens).is_none();
+ has_failed |= failed;
+ failed
+ })
.collect::<HashMap<_, _>>();
let asts = tokens
.into_iter()
- .map(|(filename, tokens)| (filename, parse_document(tokens, &arena)))
+ .map(|(filename, (ctx, tokens))| (filename, (ctx, parse_document(tokens, &arena))))
+ .filter(|(_, (ctx, document))| {
+ let failed = diagnostics::run_ast_diagnostics(ctx, document).is_none();
+ has_failed |= failed;
+ failed
+ })
.collect::<HashMap<_, _>>();
+ if has_failed {
+ std::process::exit(1);
+ }
+
let symbol_tables = asts
.into_iter()
- .map(|(filename, document)| (filename, symbol_table(&arena, document)))
+ .map(|(filename, (ctx, document))| (filename, (ctx, symbol_table(&arena, document))))
.collect::<HashMap<_, _>>();
if !options.dry {
- let output = compile(&symbol_tables.into_values().collect::<Box<_>>());
+ let output = compile(
+ &symbol_tables
+ .into_values()
+ .map(|(_, document)| document)
+ .collect::<Box<_>>(),
+ );
if let Err(e) = std::fs::write(options.out, output.as_bytes()) {
eprintln!("{e}");
std::process::exit(1);