cranelift_isle/
compile.rs1use std::path::Path;
4use std::sync::Arc;
5
6use crate::error::Errors;
7use crate::files::Files;
8use crate::{ast, codegen, overlap, recursion, sema};
9
10pub fn compile(
12 files: Arc<Files>,
13 defs: &[ast::Def],
14 options: &codegen::CodegenOptions,
15) -> Result<String, Errors> {
16 let mut type_env = match sema::TypeEnv::from_ast(defs) {
17 Ok(type_env) => type_env,
18 Err(errs) => return Err(Errors::new(errs, files)),
19 };
20 let term_env = match sema::TermEnv::from_ast(&mut type_env, defs, true) {
21 Ok(term_env) => term_env,
22 Err(errs) => return Err(Errors::new(errs, files)),
23 };
24 let terms = match overlap::check(&term_env) {
25 Ok(terms) => terms,
26 Err(errs) => return Err(Errors::new(errs, files)),
27 };
28 recursion::check(&terms, &term_env).map_err(|errs| Errors::new(errs, files.clone()))?;
29
30 Ok(codegen::codegen(
31 files, &type_env, &term_env, &terms, options,
32 ))
33}
34
35pub fn from_files<P: AsRef<Path>>(
37 inputs: impl IntoIterator<Item = P>,
38 options: &codegen::CodegenOptions,
39) -> Result<String, Errors> {
40 let files = match Files::from_paths(inputs, &options.prefixes) {
41 Ok(files) => files,
42 Err((path, err)) => {
43 return Err(Errors::from_io(
44 err,
45 format!("cannot read file {}", path.display()),
46 ));
47 }
48 };
49
50 let files = Arc::new(files);
51
52 let mut defs = Vec::new();
53 for (file, src) in files.file_texts.iter().enumerate() {
54 let lexer = match crate::lexer::Lexer::new(file, src) {
55 Ok(lexer) => lexer,
56 Err(err) => return Err(Errors::new(vec![err], files)),
57 };
58
59 match crate::parser::parse(lexer) {
60 Ok(mut ds) => defs.append(&mut ds),
61 Err(err) => return Err(Errors::new(vec![err], files)),
62 }
63 }
64
65 compile(files, &defs, options)
66}