Skip to main content

nargo_parser/
oak_style_parser.rs

1use crate::{ParseState, StyleParser};
2use nargo_ir::Trivia;
3use nargo_types::Result;
4use oak_core::{parser::ParseSession, tree::RedTree, Parser, SourceText};
5use oak_css::{CssLanguage, CssParser};
6
7/// 基于 oak-css 的样式解析器
8pub struct OakCssParser;
9
10impl StyleParser for OakCssParser {
11    fn parse(&self, state: &mut ParseState, _lang: &str) -> Result<(String, Trivia)> {
12        let source = SourceText::new(state.cursor.source.to_string());
13        let language = CssLanguage::default();
14        let parser = CssParser::new(&language);
15        let mut session = ParseSession::default();
16        let parse_output = parser.parse(&source, &[], &mut session);
17
18        // 将 green 树转换为 red 树,获取包含位置信息的 AST
19        let green_node = parse_output.result.map_err(|e| nargo_types::Error::parse_error(format!("CSS parsing error: {:?}", e), nargo_types::Span::default()))?;
20        let red_tree = RedTree::new(green_node);
21
22        // 转换 oak-css 的解析结果为项目的 IR 格式
23        let (code, trivia) = self.convert_to_ir(&red_tree, &source);
24        Ok((code, trivia))
25    }
26}
27
28impl OakCssParser {
29    /// 将 oak-css 的解析结果转换为项目的 IR 格式
30    fn convert_to_ir(&self, tree: &RedTree<'_, CssLanguage>, source: &SourceText) -> (String, Trivia) {
31        // 这里需要根据实际的 oak-css AST 结构进行转换
32        // 暂时返回源文本作为结果
33        let code = if let RedTree::Node(node) = tree { node.text(source).to_string() } else { "".to_string() };
34        (code, Trivia::default())
35    }
36}