Skip to main content

oak_yaml/
lsp.rs

1use crate::YamlLanguage;
2use oak_core::tree::RedNode;
3use oak_lsp::service::LanguageService;
4use oak_vfs::Vfs;
5use std::future::Future;
6
7/// Language service implementation for YAML.
8pub struct YamlLanguageService<V: Vfs> {
9    vfs: V,
10    workspace: oak_lsp::workspace::WorkspaceManager,
11}
12
13impl<V: Vfs> YamlLanguageService<V> {
14    /// Creates a new `YamlLanguageService`.
15    pub fn new(vfs: V) -> Self {
16        Self { vfs, workspace: oak_lsp::workspace::WorkspaceManager::default() }
17    }
18}
19
20impl<V: Vfs + Send + Sync + 'static + oak_vfs::WritableVfs> LanguageService for YamlLanguageService<V> {
21    type Lang = YamlLanguage;
22    type Vfs = V;
23
24    fn vfs(&self) -> &Self::Vfs {
25        &self.vfs
26    }
27
28    fn workspace(&self) -> &oak_lsp::workspace::WorkspaceManager {
29        &self.workspace
30    }
31
32    fn get_root(&self, uri: &str) -> impl Future<Output = Option<RedNode<'_, YamlLanguage>>> + Send + '_ {
33        let source = self.vfs().get_source(uri);
34        async move {
35            let source = source?;
36            let language = YamlLanguage::default();
37            let parser = crate::parser::YamlParser::new(&language);
38            let lexer = crate::lexer::YamlLexer::new(&language);
39
40            let mut cache = oak_core::parser::session::ParseSession::<YamlLanguage>::new(1024);
41            let _output = oak_core::parser::parse(&parser, &lexer, &source, &[], &mut cache);
42
43            None
44        }
45    }
46}