oak_django/parser/
mod.rs

1use crate::{DjangoLanguage, DjangoSyntaxKind};
2use oak_core::{
3    GreenBuilder, GreenNode, IncrementalCache, OakError, Parser, errors::OakDiagnostics, parser::ParserState, source::Source,
4    tree::Arc,
5};
6
7type State<'a, S> = ParserState<'a, S, DjangoLanguage>;
8
9/// Django 模板解析器
10pub struct DjangoParser<'config> {
11    /// 语言配置
12    config: &'config DjangoLanguage,
13}
14
15impl<'config> DjangoParser<'config> {
16    pub fn new(config: &'config DjangoLanguage) -> Self {
17        Self { config }
18    }
19}
20
21impl<'config> Parser<DjangoLanguage> for DjangoParser<'config> {
22    fn parse_incremental(
23        &self,
24        source: impl Source,
25        changed: usize,
26        cache: IncrementalCache<DjangoLanguage>,
27    ) -> OakDiagnostics<Arc<GreenNode<DjangoSyntaxKind>>> {
28        let mut state = ParserState::new_with_cache(source, changed, cache);
29        let result = self.run(&mut state);
30        state.finish(result)
31    }
32}
33
34impl<'config> DjangoParser<'config> {
35    fn run<S: Source>(&self, state: &mut State<S>) -> Result<(), OakError> {
36        // 简单的实现:创建一个根节点
37        let root = GreenBuilder::<DjangoLanguage>::new(1).finish(DjangoSyntaxKind::Root);
38
39        state.cache.last_parse = Some(root);
40        Ok(())
41    }
42}
43
44impl<'config> Clone for DjangoParser<'config> {
45    fn clone(&self) -> Self {
46        Self::new(self.config)
47    }
48}