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