1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use std::path::Path;
use std::sync::Arc;
use ::cairo_lang_diagnostics::ToOption;
use anyhow::{bail, Context, Result};
use cairo_lang_filesystem::ids::CrateId;
use cairo_lang_sierra::program::Program;
use cairo_lang_sierra_generator::db::SierraGenGroup;
use cairo_lang_sierra_generator::replace_ids::replace_sierra_ids_in_program;
use crate::db::RootDatabase;
use crate::diagnostics::{check_diagnostics, eprint_diagnostic};
use crate::project::{get_main_crate_ids_from_project, setup_project, ProjectConfig};
pub mod db;
pub mod diagnostics;
pub mod project;
pub struct CompilerConfig {
pub on_diagnostic: Option<Box<dyn FnMut(String)>>,
pub replace_ids: bool,
}
impl Default for CompilerConfig {
fn default() -> Self {
CompilerConfig { on_diagnostic: Some(Box::new(eprint_diagnostic)), replace_ids: false }
}
}
pub type SierraProgram = Arc<Program>;
pub fn compile_cairo_project_at_path(
path: &Path,
compiler_config: CompilerConfig,
) -> Result<SierraProgram> {
let mut db = RootDatabase::default();
let main_crate_ids = setup_project(&mut db, path)?;
compile_prepared_db(db, main_crate_ids, compiler_config)
}
pub fn compile(
project_config: ProjectConfig,
compiler_config: CompilerConfig,
) -> Result<SierraProgram> {
let mut builder = RootDatabase::builder();
builder.with_project_config(project_config.clone());
let mut db = builder.build();
let main_crate_ids = get_main_crate_ids_from_project(&mut db, &project_config);
compile_prepared_db(db, main_crate_ids, compiler_config)
}
fn compile_prepared_db(
mut db: RootDatabase,
main_crate_ids: Vec<CrateId>,
compiler_config: CompilerConfig,
) -> Result<SierraProgram> {
if check_diagnostics(&mut db, compiler_config.on_diagnostic) {
bail!("Compilation failed.");
}
let mut sierra_program = db
.get_sierra_program(main_crate_ids)
.to_option()
.context("Compilation failed without any diagnostics")?;
if compiler_config.replace_ids {
sierra_program = Arc::new(replace_sierra_ids_in_program(&db, &sierra_program));
}
Ok(sierra_program)
}