diff --git a/src/lib.rs b/src/lib.rs index d64914f..db5cc5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,7 @@ use std::path::PathBuf; use ariadne::{Color, Fmt, Label, Report, ReportKind, Source}; -use chumsky::prelude::Simple; - -use crate::lexer::Token; +use parser::Error; mod ast; mod lexer; @@ -29,7 +27,7 @@ pub trait Db: salsa::DbWithJar {} impl Db for DB where DB: ?Sized + salsa::DbWithJar {} #[salsa::accumulator] -pub struct Diagnostics(Simple); +pub struct Diagnostics(Error); #[derive(Default)] #[salsa::db(crate::Jar)] @@ -60,13 +58,15 @@ fn aa() {} let db = Database::default(); let source_program = SourceProgram::new(&db, src.to_string(), "uwu.ub".into()); - let (file, errors) = parser::parse(&db, source_program); + let file = parser::parse(&db, source_program); if let Some(file) = file { println!("{}", pretty::pretty_print_ast(&file)); } - report_errors(src, errors); + let errs = parser::parse::accumulated::(&db, source_program); + + report_errors(src, errs); } fn report_errors(src: &str, errors: Vec) { diff --git a/src/parser.rs b/src/parser.rs index 6c2b53d..185f88b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -10,7 +10,7 @@ use crate::{ WhileStmt, }, lexer::Token, - SourceProgram, + Db, Diagnostics, SourceProgram, }; #[derive(Debug, Clone, PartialEq)] @@ -430,13 +430,18 @@ fn file_parser<'src>( } #[salsa::tracked] -pub fn parse(db: &dyn crate::Db, source: SourceProgram) -> (Option, Vec) { +pub fn parse(db: &dyn Db, source: SourceProgram) -> Option { let lexer = Token::lexer(source.text(db)); let len = lexer.source().len(); let state = ParserState::default(); - let result = file_parser(source.file_name(db).clone(), &state) + let (result, errs) = file_parser(source.file_name(db).clone(), &state) .parse_recovery_verbose(Stream::from_iter(len..len + 1, lexer.spanned())); + + for err in errs { + Diagnostics::push(db, err); + } + result }