Skip to main content

cranelift_isle/
compile.rs

1//! Compilation process, from AST to Sema to Sequences of Insts.
2
3use std::path::Path;
4use std::sync::Arc;
5
6use crate::error::Errors;
7use crate::files::Files;
8use crate::{ast, codegen, overlap, recursion, sema};
9
10/// Compile the given AST definitions into Rust source code.
11pub 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
35/// Compile the given files into Rust source code.
36pub 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}