Skip to main content

squawk_ide/
db.rs

1use ::line_index::LineIndex;
2use salsa::Database as Db;
3#[cfg(test)]
4use salsa::Setter;
5use salsa::Storage;
6use squawk_syntax::{Parse, SourceFile};
7use std::sync::Arc;
8
9use crate::binder;
10use crate::binder::Binder;
11use crate::builtins::builtins_file;
12
13#[salsa::input]
14pub struct File {
15    #[returns(ref)]
16    pub content: Arc<str>,
17}
18
19#[salsa::tracked]
20pub fn parse(db: &dyn Db, file: File) -> Parse<SourceFile> {
21    SourceFile::parse(file.content(db))
22}
23
24#[salsa::tracked]
25pub fn line_index(db: &dyn Db, file: File) -> LineIndex {
26    LineIndex::new(file.content(db))
27}
28
29#[inline]
30pub(crate) fn list_files(db: &dyn Db, file: File) -> impl Iterator<Item = File> {
31    [Some(file), include_builtins(db).then(|| builtins_file(db))]
32        .into_iter()
33        .flatten()
34}
35
36#[salsa::tracked]
37pub(crate) fn bind(db: &dyn Db, file: File) -> Binder {
38    let result = parse(db, file);
39    let source_file = result.tree();
40    binder::bind(&source_file)
41}
42
43#[salsa::input(singleton)]
44pub(crate) struct Config {
45    // currently only used for improve test runtime by skipping builtins
46    pub(crate) include_builtins: bool,
47}
48
49#[salsa::tracked]
50pub(crate) fn include_builtins(db: &dyn Db) -> bool {
51    Config::get(db).include_builtins(db)
52}
53
54#[salsa::db]
55#[derive(Clone)]
56pub struct Database {
57    storage: Storage<Self>,
58}
59
60impl Default for Database {
61    fn default() -> Self {
62        let db = Self {
63            storage: Storage::default(),
64        };
65        Config::new(&db, true);
66        db
67    }
68}
69
70#[cfg(test)]
71pub(crate) fn set_include_builtins(db: &mut dyn Db, include_builtins: bool) {
72    Config::get(db)
73        .set_include_builtins(db)
74        .to(include_builtins);
75}
76
77impl salsa::Database for Database {}