aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/module_map.rs
blob: c1799e3d4a81b2fc09c8f2a1013d49c8ea114b9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use std::sync::Arc;
use crate::{
    FileId,
    db::{SyntaxDatabase},
    descriptors::{ModuleDescriptor, ModuleTreeDescriptor},
};

salsa::query_group! {
    pub(crate) trait ModulesDatabase: SyntaxDatabase {
        fn module_tree(key: ()) -> Arc<ModuleTreeDescriptor> {
            type ModuleTreeQuery;
        }
        fn module_descriptor(file_id: FileId) -> Arc<ModuleDescriptor> {
            type ModuleDescriptorQuery;
        }
    }
}


fn module_descriptor(db: &impl ModulesDatabase, file_id: FileId) -> Arc<ModuleDescriptor> {
    let file = db.file_syntax(file_id);
    Arc::new(ModuleDescriptor::new(file.ast()))
}

fn module_tree(db: &impl ModulesDatabase, (): ()) -> Arc<ModuleTreeDescriptor> {
    let file_set = db.file_set(());
    let mut files = Vec::new();
    for &file_id in file_set.files.iter() {
        let module_descr = db.module_descriptor(file_id);
        files.push((file_id, module_descr));
    }
    let res = ModuleTreeDescriptor::new(files.iter().map(|(file_id, descr)| (*file_id, &**descr)), &file_set.resolver);
    Arc::new(res)
}