Skip to main content

oak_c/builder/
mod.rs

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/// C 语言的 AST 构建器
6#[derive(Clone, Copy)]
7pub struct CBuilder<'config> {
8    /// 语言配置
9    config: &'config CLanguage,
10}
11
12impl<'config> CBuilder<'config> {
13    /// 创建新的 C 构建器
14    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        // 解析源代码获得语法树
22        let parser = CParser::new(self.config);
23
24        // TODO: 真正的增量构建需要利用 BC
25        let mut cache = oak_core::parser::session::ParseSession::<CLanguage>::default();
26        let parse_result = parser.parse(source, edits, &mut cache);
27
28        // 检查解析是否成功
29        match parse_result.result {
30            Ok(green_tree) => {
31                // 构建 AST
32                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    /// 构建根节点
49    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        // TODO: 实现真正的 Green -> AST 转换
53        // 这里暂时返回一个空的 CRoot 以通过编译
54        Ok(CRoot { translation_unit: TranslationUnit { external_declarations: vec![], span: root_node.span() }, span: root_node.span() })
55    }
56}