Skip to main content

oak_lua/builder/
mod.rs

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/// Lua AST 构建器
5#[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        // TODO: 从 GreenNode 构建 AST
42        Ok(LuaRoot { statements: vec![], span: (0..0).into() })
43    }
44}