Skip to main content

dada_ir_sym/
lib.rs

1//! "Symbolic IR": High-level, type checked representaton. Derived from the AST.
2#![doc = include_str!("../docs/overview.md")]
3
4pub use dada_ir_ast::Db;
5
6pub mod check;
7pub mod ir;
8pub mod well_known;
9
10pub mod prelude {
11    use crate::ir::binder::Binder;
12    use crate::ir::classes::SymField;
13    use crate::ir::exprs::SymExpr;
14    use crate::ir::functions::{SymFunction, SymFunctionSignature};
15    use crate::ir::types::SymTy;
16    use dada_ir_ast::diagnostic::Errors;
17
18    /// Return the symbol corresponding to the AST node.
19    /// Implementations are memoized so that this can be called many times and will always yield the same symbol.
20    pub trait Symbol<'db>: Copy {
21        type Output;
22
23        fn symbol(self, db: &'db dyn crate::Db) -> Self::Output;
24    }
25
26    pub trait CheckUseItems<'db> {
27        fn check_use_items(self, db: &'db dyn crate::Db);
28    }
29
30    pub trait CheckedBody<'db> {
31        fn checked_body(self, db: &'db dyn crate::Db) -> Option<SymExpr<'db>>;
32    }
33
34    #[salsa::tracked]
35    impl<'db> CheckedBody<'db> for SymFunction<'db> {
36        #[salsa::tracked]
37        fn checked_body(self, db: &'db dyn crate::Db) -> Option<SymExpr<'db>> {
38            crate::check::functions::check_function_body(db, self)
39        }
40    }
41
42    pub trait CheckedFieldTy<'db> {
43        /// See [`crate::check::fields::check_field`][]
44        fn checked_field_ty(self, db: &'db dyn crate::Db) -> Binder<'db, Binder<'db, SymTy<'db>>>;
45    }
46
47    #[salsa::tracked]
48    impl<'db> CheckedFieldTy<'db> for SymField<'db> {
49        #[salsa::tracked]
50        fn checked_field_ty(self, db: &'db dyn crate::Db) -> Binder<'db, Binder<'db, SymTy<'db>>> {
51            match crate::check::fields::check_field(db, self) {
52                Ok(v) => v,
53                Err(reported) => crate::check::fields::field_err_ty(db, self, reported),
54            }
55        }
56    }
57    pub trait CheckedSignature<'db> {
58        fn checked_signature(self, db: &'db dyn crate::Db) -> Errors<SymFunctionSignature<'db>>;
59    }
60
61    #[salsa::tracked]
62    impl<'db> CheckedSignature<'db> for SymFunction<'db> {
63        #[salsa::tracked]
64        fn checked_signature(self, db: &'db dyn crate::Db) -> Errors<SymFunctionSignature<'db>> {
65            match crate::check::signature::check_function_signature(db, self) {
66                Ok(s) => Ok(s),
67                Err(e) => Err(e),
68            }
69        }
70    }
71}