use super::{Document, RepairScope};
use crate::cst::builder::parse_full;
#[cfg(test)]
use crate::error::Error;
use crate::error::Result;
impl Document {
pub(super) fn ensure_cache(&self) {
if self.cache.borrow().is_some() {
return;
}
let parsed = crate::parser::parse_exactly_one(&self.source, &self.config)
.expect("Document source must always parse — local repair invariant violated");
*self.cache.borrow_mut() = Some(parsed);
}
pub fn validate(&self) -> Result<()> {
#[cfg(test)]
if super::fault::validate_should_fail() {
return Err(Error::Parse("injected validate failure".into()));
}
if self.cache.borrow().is_some() {
return Ok(());
}
let parsed = crate::parser::parse_exactly_one(&self.source, &self.config)?;
*self.cache.borrow_mut() = Some(parsed);
Ok(())
}
pub(super) fn commit_source(
&mut self,
candidate: &str,
repair_scope: RepairScope,
) -> Result<()> {
let parsed = parse_full(candidate, &self.config)?;
self.source = parsed.source;
self.green = parsed.green;
let _ = self.cache.replace(Some((parsed.value, parsed.span_tree)));
self.last_repair_scope.set(Some(repair_scope));
Ok(())
}
}