1use ::line_index::LineIndex;
2use salsa::Database as Db;
3use salsa::Storage;
4use squawk_syntax::{Parse, SourceFile};
5use std::sync::Arc;
6
7use crate::binder;
8use crate::binder::Binder;
9
10#[salsa::input]
11pub struct File {
12 #[returns(ref)]
13 pub content: Arc<str>,
14}
15
16#[salsa::tracked]
17pub fn parse(db: &dyn Db, file: File) -> Parse<SourceFile> {
18 SourceFile::parse(file.content(db))
19}
20
21#[salsa::tracked]
22pub fn line_index(db: &dyn Db, file: File) -> LineIndex {
23 LineIndex::new(file.content(db))
24}
25
26#[salsa::tracked]
27pub fn bind(db: &dyn Db, file: File) -> Binder {
28 let result = parse(db, file);
29 let source_file = result.tree();
30 binder::bind(&source_file)
31}
32
33#[salsa::db]
34#[derive(Clone, Default)]
35pub struct Database {
36 storage: Storage<Self>,
37}
38
39impl salsa::Database for Database {}