//! Builds upon [`crate::ast::make`] constructors to create ast fragments with //! optional syntax mappings. //! //! Instead of forcing make constructors to perform syntax mapping, we instead //! let [`SyntaxFactory`] handle constructing the mappings. Care must be taken //! to remember to feed the syntax mappings into a [`SyntaxEditor`](crate::syntax_editor::SyntaxEditor), //! if applicable. mod constructors; use std::cell::{RefCell, RefMut}; use crate::syntax_editor::SyntaxMapping; pub struct SyntaxFactory { // Stored in a refcell so that the factory methods can be &self mappings: Option>, } impl SyntaxFactory { /// Creates a new [`SyntaxFactory`], generating mappings between input nodes and generated nodes. pub fn new() -> Self { Self { mappings: Some(RefCell::new(SyntaxMapping::new())) } } /// Creates a [`SyntaxFactory`] without generating mappings. pub fn without_mappings() -> Self { Self { mappings: None } } /// Gets all of the tracked syntax mappings, if any. pub fn finish_with_mappings(self) -> SyntaxMapping { self.mappings.unwrap_or_default().into_inner() } fn mappings(&self) -> Option> { self.mappings.as_ref().map(|it| it.borrow_mut()) } } impl Default for SyntaxFactory { fn default() -> Self { Self::without_mappings() } }