use std::sync::Arc;
use super::source::Source;
use super::{FileId, SourceList, SourceMap};
use crate::{Diagnostic, Node, token_tree::typed};
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ParseTree {
pub(crate) root: Node,
pub(crate) sources: Arc<SourceList>,
pub(crate) map: Arc<SourceMap>,
}
impl ParseTree {
pub fn root(&self) -> &Node {
&self.root
}
pub fn typed_root(&self) -> typed::Root {
typed::Root::try_from_node(&self.root).expect("parse tree has invalid root node type")
}
pub fn source_map(&self) -> &SourceMap {
&self.map
}
pub fn get_source(&self, id: FileId) -> Option<&Source> {
self.sources.get(&id)
}
pub fn format_diagnostic(&self, err: &Diagnostic, colorize: bool) -> String {
self.sources.format_diagnostic(err, colorize)
}
}