1use crate::{ast::LuaRoot, language::LuaLanguage, lexer::LuaLexer, parser::LuaParser};
2use oak_core::{Builder, BuilderCache, Lexer, Parser, TextEdit, builder::BuildOutput, parser::session::ParseSession, source::Source};
3
4#[derive(Clone)]
6pub struct LuaBuilder<'config> {
7 config: &'config LuaLanguage,
8}
9
10impl<'config> LuaBuilder<'config> {
11 pub fn new(config: &'config LuaLanguage) -> Self {
12 Self { config }
13 }
14}
15
16impl<'config> Builder<LuaLanguage> for LuaBuilder<'config> {
17 fn build<'a, S: Source + ?Sized>(&self, source: &S, edits: &[TextEdit], _cache: &'a mut impl BuilderCache<LuaLanguage>) -> BuildOutput<LuaLanguage> {
18 let parser = LuaParser::new(self.config);
19 let lexer = LuaLexer::new(self.config);
20
21 let mut session = ParseSession::<LuaLanguage>::default();
22 lexer.lex(source, edits, &mut session);
23 let parse_result = parser.parse(source, edits, &mut session);
24
25 match parse_result.result {
26 Ok(green_tree) => match self.build_root(green_tree.clone(), source) {
27 Ok(ast_root) => oak_core::errors::OakDiagnostics { result: Ok(ast_root), diagnostics: parse_result.diagnostics },
28 Err(build_error) => {
29 let mut diagnostics = parse_result.diagnostics;
30 diagnostics.push(build_error.clone());
31 oak_core::errors::OakDiagnostics { result: Err(build_error), diagnostics }
32 }
33 },
34 Err(parse_error) => oak_core::errors::OakDiagnostics { result: Err(parse_error), diagnostics: parse_result.diagnostics },
35 }
36 }
37}
38
39impl<'config> LuaBuilder<'config> {
40 fn build_root<S: Source + ?Sized>(&self, _green_tree: oak_core::GreenNode<LuaLanguage>, _source: &S) -> Result<LuaRoot, oak_core::OakError> {
41 Ok(LuaRoot { statements: vec![], span: (0..0).into() })
43 }
44}