Skip to main content

dada_lang/main_lib/
compile.rs

1use 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        // In debug mode, diagnostics get reported to the `debug_tx` and aren't considered errors.
31        if !debug_mode && diagnostics.iter().any(|d| d.level >= Level::Error) {
32            bail!("compilation failed due to errors");
33        }
34
35        Ok(())
36    }
37}