1use crate::{CParser, ast::*, language::CLanguage, lexer::CTokenType, parser::CElementType};
2use core::range::Range;
3use oak_core::{Builder, BuilderCache, GreenNode, OakDiagnostics, OakError, Parser, RedNode, RedTree, SourceText, TextEdit, builder::BuildOutput, source::Source};
4
5#[derive(Clone, Copy)]
7pub struct CBuilder<'config> {
8 config: &'config CLanguage,
10}
11
12impl<'config> CBuilder<'config> {
13 pub fn new(config: &'config CLanguage) -> Self {
15 Self { config }
16 }
17}
18
19impl<'config> Builder<CLanguage> for CBuilder<'config> {
20 fn build<'a, S: Source + ?Sized>(&self, source: &S, edits: &[TextEdit], _cache: &'a mut impl BuilderCache<CLanguage>) -> BuildOutput<CLanguage> {
21 let parser = CParser::new(self.config);
23
24 let mut cache = oak_core::parser::session::ParseSession::<CLanguage>::default();
26 let parse_result = parser.parse(source, edits, &mut cache);
27
28 match parse_result.result {
30 Ok(green_tree) => {
31 let source_text = SourceText::new(source.get_text_in((0..source.length()).into()).into_owned());
33 match self.build_root(green_tree, &source_text) {
34 Ok(ast_root) => OakDiagnostics { result: Ok(ast_root), diagnostics: parse_result.diagnostics },
35 Err(build_error) => {
36 let mut diagnostics = parse_result.diagnostics;
37 diagnostics.push(build_error.clone());
38 OakDiagnostics { result: Err(build_error), diagnostics }
39 }
40 }
41 }
42 Err(parse_error) => OakDiagnostics { result: Err(parse_error), diagnostics: parse_result.diagnostics },
43 }
44 }
45}
46
47impl<'config> CBuilder<'config> {
48 pub(crate) fn build_root<'a>(&self, green_tree: &'a GreenNode<'a, CLanguage>, _source: &SourceText) -> Result<CRoot, OakError> {
50 let root_node = RedNode::new(green_tree, 0);
51
52 Ok(CRoot { translation_unit: TranslationUnit { external_declarations: vec![], span: root_node.span() }, span: root_node.span() })
55 }
56}