aboutsummaryrefslogtreecommitdiff
path: root/crates/libanalysis/src/db/queries.rs
blob: 2d4aac6e93e2222d74d14119a33e3df8ad564d0d (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
35
36
37
38
39
40
41
42
43
use std::sync::Arc;
use libsyntax2::{File};
use {
    FileId, FileResolverImp,
    db::{Query, GroundQuery, QueryCtx, hash},
};


impl<'a> QueryCtx<'a> {
    pub(crate) fn file_set(&self) -> Arc<(Vec<FileId>, FileResolverImp)> {
        self.get_g(FILE_SET, ())
    }
    pub(crate) fn file_text(&self, file_id: FileId) -> Arc<str> {
        Arc::clone(&*self.get_g(FILE_TEXT, file_id))
    }
    pub(crate) fn file_syntax(&self, file_id: FileId) -> File {
        (&*self.get(FILE_SYNTAX, file_id)).clone()
    }
}

pub(super) const FILE_TEXT: GroundQuery<FileId, Arc<str>> = GroundQuery {
    id: 10,
    f: |state, id| state.file_map[&id].clone(),
    h: hash,
};

pub(super) const FILE_SET: GroundQuery<(), (Vec<FileId>, FileResolverImp)> = GroundQuery {
    id: 11,
    f: |state, &()| {
        let files = state.file_map.keys().cloned().collect();
        let resolver = state.resolver.clone();
        (files, resolver)
    },
    h: |(files, _)| hash(files),
};

pub(super) const FILE_SYNTAX: Query<FileId, File> = Query {
    id: 20,
    f: |ctx, file_id: &FileId| {
        let text = ctx.file_text(*file_id);
        File::parse(&*text)
    }
};