Skip to main content

squawk_ide/
builtins.rs

1#[cfg(not(target_arch = "wasm32"))]
2use etcetera::BaseStrategy;
3use line_index::LineIndex;
4use salsa::Database as Db;
5use squawk_syntax::{Parse, SourceFile};
6#[cfg(not(target_arch = "wasm32"))]
7use url::Url;
8
9use crate::binder::{self, Binder};
10
11pub(crate) const BUILTINS_SQL: &str = include_str!("generated/builtins.sql");
12
13#[salsa::tracked]
14pub fn parse_builtins(_db: &dyn Db) -> Parse<SourceFile> {
15    SourceFile::parse(BUILTINS_SQL)
16}
17
18#[salsa::tracked]
19pub fn builtins_line_index(_db: &dyn Db) -> LineIndex {
20    LineIndex::new(BUILTINS_SQL)
21}
22
23#[salsa::tracked]
24pub fn builtins_binder(db: &dyn Db) -> Binder {
25    let builtins_tree = parse_builtins(db).tree();
26    binder::bind(&builtins_tree)
27}
28
29#[cfg(not(target_arch = "wasm32"))]
30#[salsa::tracked]
31pub fn builtins_url(_db: &dyn Db) -> Option<Url> {
32    let strategy = etcetera::base_strategy::choose_base_strategy().ok()?;
33    let config_dir = strategy.config_dir();
34    let cache_dir = config_dir.join("squawk/stubs");
35    let path = cache_dir.join("builtins.sql");
36    std::fs::create_dir_all(&cache_dir).ok()?;
37    std::fs::write(&path, BUILTINS_SQL).ok()?;
38    Url::from_file_path(path).ok()
39}
40
41#[cfg(test)]
42mod test {
43    use squawk_syntax::ast;
44
45    use crate::builtins::BUILTINS_SQL;
46
47    #[test]
48    fn no_errors() {
49        let parse = ast::SourceFile::parse(BUILTINS_SQL);
50        assert_eq!(parse.errors(), vec![]);
51    }
52}