php_lsp/db/
mir_queries.rs1use std::sync::Arc;
11
12use mir_analyzer::db::{MirDatabase, SourceFile};
13use tower_lsp::lsp_types::Url;
14
15use crate::db::index::IndexArc;
16use crate::db::parse::ParsedArc;
17use crate::db::symbol_map::SymbolMapArc;
18use crate::db::workspace_index::{WorkspaceIndexArc, WorkspaceIndexData, build_maps};
19use crate::document::ast::ParsedDoc;
20use crate::index::file_index::FileIndex;
21use crate::types::symbol_map::SymbolMap;
22
23#[salsa::input]
29pub struct LspWsFile {
30 pub source: SourceFile,
31 pub cached_index: Option<Arc<FileIndex>>,
32}
33
34#[salsa::input]
38pub struct LspWorkspace {
39 pub files: Arc<[LspWsFile]>,
40}
41
42#[salsa::tracked(no_eq, lru = 2048)]
46pub fn parsed_doc(db: &dyn MirDatabase, file: SourceFile) -> ParsedArc {
47 ParsedArc(Arc::new(ParsedDoc::parse(file.text(db))))
48}
49
50#[salsa::tracked(no_eq, lru = 2048)]
53pub fn symbol_map(db: &dyn MirDatabase, file: SourceFile) -> SymbolMapArc {
54 let doc = parsed_doc(db, file);
55 SymbolMapArc(Arc::new(SymbolMap::build(doc.get())))
56}
57
58#[salsa::tracked(lru = 2048)]
60pub fn parse_error_count(db: &dyn MirDatabase, file: SourceFile) -> usize {
61 parsed_doc(db, file).get().errors.len()
62}
63
64#[salsa::tracked]
68pub fn file_index(db: &dyn MirDatabase, wf: LspWsFile) -> IndexArc {
69 if let Some(cached) = wf.cached_index(db) {
70 return IndexArc(cached);
71 }
72 let doc = parsed_doc(db, wf.source(db));
73 IndexArc(Arc::new(FileIndex::extract(doc.get())))
74}
75
76#[salsa::tracked(no_eq)]
80pub fn workspace_index(db: &dyn MirDatabase, ws: LspWorkspace) -> WorkspaceIndexArc {
81 let ws_files = ws.files(db);
82 let mut files: Vec<(Url, Arc<FileIndex>)> = Vec::with_capacity(ws_files.len());
83 for wf in ws_files.iter() {
84 let Ok(url) = Url::parse(&wf.source(db).path(db)) else {
85 continue;
86 };
87 let idx = file_index(db, *wf).0.clone();
88 files.push((url, idx));
89 }
90 let (classes_by_name, subtypes_of, decls_by_name) = build_maps(&files);
91 WorkspaceIndexArc(Arc::new(WorkspaceIndexData {
92 files,
93 classes_by_name,
94 subtypes_of,
95 decls_by_name,
96 }))
97}