nargo-parser 0.0.0

Nargo parser component
Documentation
use crate::{ParseState, StyleParser};
use nargo_ir::Trivia;
use nargo_types::Result;
use oak_core::{parser::ParseSession, tree::RedTree, Parser, SourceText};
use oak_css::{CssLanguage, CssParser};

/// 基于 oak-css 的样式解析器
pub struct OakCssParser;

impl StyleParser for OakCssParser {
    fn parse(&self, state: &mut ParseState, _lang: &str) -> Result<(String, Trivia)> {
        let source = SourceText::new(state.cursor.source.to_string());
        let language = CssLanguage::default();
        let parser = CssParser::new(&language);
        let mut session = ParseSession::default();
        let parse_output = parser.parse(&source, &[], &mut session);

        // 将 green 树转换为 red 树,获取包含位置信息的 AST
        let green_node = parse_output.result.map_err(|e| nargo_types::Error::parse_error(format!("CSS parsing error: {:?}", e), nargo_types::Span::default()))?;
        let red_tree = RedTree::new(green_node);

        // 转换 oak-css 的解析结果为项目的 IR 格式
        let (code, trivia) = self.convert_to_ir(&red_tree, &source);
        Ok((code, trivia))
    }
}

impl OakCssParser {
    /// 将 oak-css 的解析结果转换为项目的 IR 格式
    fn convert_to_ir(&self, tree: &RedTree<'_, CssLanguage>, source: &SourceText) -> (String, Trivia) {
        // 这里需要根据实际的 oak-css AST 结构进行转换
        // 暂时返回源文本作为结果
        let code = if let RedTree::Node(node) = tree { node.text(source).to_string() } else { "".to_string() };
        (code, Trivia::default())
    }
}