php_lsp/db/parse.rs
1//! The `parsed_doc` salsa query: parses a `SourceFile` into an `Arc<ParsedDoc>`
2//! under salsa memoization. Downstream queries (file_index, symbol_map,
3//! semantic diagnostics) depend on this one, so each file is parsed at most
4//! once per revision.
5//!
6//! `ParsedDoc` owns a self-referential bumpalo arena and isn't `PartialEq`, so
7//! `parsed_doc` is `#[salsa::tracked(no_eq)]`: salsa skips backdating and
8//! downstream queries re-run after every input text change.
9
10use std::sync::Arc;
11
12use crate::document::ast::ParsedDoc;
13
14/// Opaque handle to a parsed document. Cheap to clone (refcount bump); never
15/// compared structurally — see module docs for the `no_eq` contract.
16///
17/// No `Debug` impl because `ParsedDoc` isn't `Debug` (it owns raw pointers
18/// into a bumpalo arena). Salsa doesn't require `Debug` on tracked returns
19/// when `no_eq` is used.
20#[derive(Clone)]
21pub struct ParsedArc(pub Arc<ParsedDoc>);
22
23impl ParsedArc {
24 pub fn get(&self) -> &ParsedDoc {
25 &self.0
26 }
27}