Skip to main content

editor_core_sublime/
processor.rs

1use crate::sublime_syntax::{
2    SublimeHighlightResult, SublimeScopeMapper, SublimeSyntax, SublimeSyntaxError,
3    SublimeSyntaxSet, highlight_document,
4};
5use editor_core::EditorStateManager;
6use editor_core::intervals::StyleLayerId;
7use editor_core::processing::{DocumentProcessor, ProcessingEdit};
8use std::sync::Arc;
9
10/// A stateful `.sublime-syntax` document processor.
11///
12/// This owns a [`SublimeScopeMapper`] so callers can map `StyleId -> scope` for theming.
13#[derive(Debug)]
14pub struct SublimeProcessor {
15    syntax: Arc<SublimeSyntax>,
16    syntax_set: SublimeSyntaxSet,
17    /// Maps Sublime scopes to `StyleId` values (and back) for theming.
18    pub scope_mapper: SublimeScopeMapper,
19    preserve_collapsed_folds: bool,
20}
21
22impl SublimeProcessor {
23    /// Create a new processor for a given syntax definition.
24    pub fn new(syntax: Arc<SublimeSyntax>, syntax_set: SublimeSyntaxSet) -> Self {
25        Self {
26            syntax,
27            syntax_set,
28            scope_mapper: SublimeScopeMapper::new(),
29            preserve_collapsed_folds: true,
30        }
31    }
32
33    /// Get the active syntax definition.
34    pub fn syntax(&self) -> &Arc<SublimeSyntax> {
35        &self.syntax
36    }
37
38    /// Get the current syntax set (used to resolve `include` references).
39    pub fn syntax_set(&self) -> &SublimeSyntaxSet {
40        &self.syntax_set
41    }
42
43    /// Mutably access the current syntax set (used to add/update syntaxes).
44    pub fn syntax_set_mut(&mut self) -> &mut SublimeSyntaxSet {
45        &mut self.syntax_set
46    }
47
48    /// Returns whether fold replacement preserves the collapsed state for existing regions.
49    pub fn preserve_collapsed_folds(&self) -> bool {
50        self.preserve_collapsed_folds
51    }
52
53    /// Control whether fold replacement preserves the collapsed state for existing regions.
54    pub fn set_preserve_collapsed_folds(&mut self, preserve: bool) {
55        self.preserve_collapsed_folds = preserve;
56    }
57
58    fn highlight(
59        &mut self,
60        state: &EditorStateManager,
61    ) -> Result<SublimeHighlightResult, SublimeSyntaxError> {
62        let line_index = &state.editor().line_index;
63        highlight_document(
64            self.syntax.clone(),
65            line_index,
66            Some(&mut self.syntax_set),
67            &mut self.scope_mapper,
68        )
69    }
70}
71
72impl DocumentProcessor for SublimeProcessor {
73    type Error = SublimeSyntaxError;
74
75    fn process(&mut self, state: &EditorStateManager) -> Result<Vec<ProcessingEdit>, Self::Error> {
76        let result = self.highlight(state)?;
77        Ok(vec![
78            ProcessingEdit::ReplaceStyleLayer {
79                layer: StyleLayerId::SUBLIME_SYNTAX,
80                intervals: result.intervals,
81            },
82            ProcessingEdit::ReplaceFoldingRegions {
83                regions: result.fold_regions,
84                preserve_collapsed: self.preserve_collapsed_folds,
85            },
86        ])
87    }
88}