1#![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 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 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}