Skip to main content

oak_tex/lsp/
mod.rs

1#![doc = include_str!("readme.md")]
2#[cfg(feature = "oak-highlight")]
3pub mod highlighter;
4
5#[cfg(feature = "lsp")]
6use {
7    futures::Future,
8    oak_lsp::{service::LanguageService, workspace::WorkspaceManager},
9    oak_vfs::{MemoryVfs, Vfs},
10};
11#[cfg(feature = "oak-pretty-print")]
12pub mod formatter;
13use crate::language::TexLanguage;
14use oak_core::tree::RedNode;
15/// TeX language service.
16#[cfg(feature = "lsp")]
17pub struct TexLanguageService {
18    vfs: MemoryVfs,
19    workspace: WorkspaceManager,
20}
21#[cfg(feature = "lsp")]
22impl TexLanguageService {
23    /// Creates a new TeX language service.
24    pub fn new(vfs: MemoryVfs) -> Self {
25        Self { vfs, workspace: WorkspaceManager::default() }
26    }
27}
28#[cfg(feature = "lsp")]
29impl LanguageService for TexLanguageService {
30    type Lang = TexLanguage;
31    type Vfs = MemoryVfs;
32    fn vfs(&self) -> &Self::Vfs {
33        &self.vfs
34    }
35    fn workspace(&self) -> &WorkspaceManager {
36        &self.workspace
37    }
38    fn get_root(&self, uri: &str) -> impl Future<Output = Option<RedNode<'_, TexLanguage>>> + Send + '_ {
39        let source = self.vfs().get_source(uri);
40        async move {
41            let _source = source?;
42            // TODO: Implement real parsing logic
43            None
44        }
45    }
46}