dada_lang/main_lib/
compile.rs1use std::{path::Path, sync::mpsc::Sender};
2
3use dada_compiler::{Compiler, RealFs};
4use dada_ir_ast::{DebugEvent, diagnostic::Level};
5use dada_util::{Fallible, bail};
6
7use crate::CompileOptions;
8
9use super::Main;
10
11impl Main {
12 pub(super) fn compile(
13 &mut self,
14 compile_options: &CompileOptions,
15 debug_tx: Option<Sender<DebugEvent>>,
16 ) -> Fallible<()> {
17 let debug_mode = debug_tx.is_some();
18 let mut compiler = Compiler::new(RealFs::default(), debug_tx);
19 let source_url = Path::new(&compile_options.input);
20 let source_file = compiler.load_source_file(source_url)?;
21 let diagnostics = compiler.check_all(source_file);
22
23 for diagnostic in &diagnostics {
24 eprintln!(
25 "{}",
26 diagnostic.render(&compiler, &self.global_options.render_opts())
27 );
28 }
29
30 if !debug_mode && diagnostics.iter().any(|d| d.level >= Level::Error) {
32 bail!("compilation failed due to errors");
33 }
34
35 Ok(())
36 }
37}