1#![doc = include_str!("readme.md")]
2#[cfg(feature = "oak-highlight")]
3pub mod highlighter;
5
6#[cfg(feature = "lsp")]
7use {
8 futures::Future,
9 oak_hover::{Hover, HoverProvider},
10 oak_lsp::service::LanguageService,
11 oak_vfs::Vfs,
12};
13#[cfg(feature = "oak-pretty-print")]
14pub mod formatter;
16use crate::language::RegexLanguage;
17use core::range::Range;
18use oak_core::tree::RedNode;
19#[cfg(feature = "lsp")]
21pub struct RegexHoverProvider;
22#[cfg(feature = "lsp")]
23impl HoverProvider<RegexLanguage> for RegexHoverProvider {
24 fn hover(&self, _node: &RedNode<'_, RegexLanguage>, _range: Range<usize>) -> Option<Hover> {
26 None
27 }
28}
29#[cfg(feature = "lsp")]
31pub struct RegexLanguageService<V: Vfs> {
32 vfs: V,
33 workspace: oak_lsp::workspace::WorkspaceManager,
34 hover_provider: RegexHoverProvider,
35}
36impl<V: Vfs> RegexLanguageService<V> {
37 pub fn new(vfs: V) -> Self {
39 Self { vfs, workspace: oak_lsp::workspace::WorkspaceManager::default(), hover_provider: RegexHoverProvider }
40 }
41}
42impl<V: Vfs + Send + Sync + 'static + oak_vfs::WritableVfs> LanguageService for RegexLanguageService<V> {
43 type Lang = RegexLanguage;
44 type Vfs = V;
45 fn vfs(&self) -> &Self::Vfs {
46 &self.vfs
47 }
48 fn workspace(&self) -> &oak_lsp::workspace::WorkspaceManager {
49 &self.workspace
50 }
51 fn get_root(&self, uri: &str) -> impl Future<Output = Option<RedNode<'_, RegexLanguage>>> + Send + '_ {
52 let source = self.vfs().get_source(uri);
53 async move {
54 let source = source?;
55 let _parser = crate::parser::RegexParser::new();
56 let _lexer = crate::lexer::RegexLexer::new();
57 let _cache = oak_core::parser::session::ParseSession::<RegexLanguage>::default();
58 None
59 }
60 }
61 fn hover(&self, uri: &str, range: Range<usize>) -> impl Future<Output = Option<oak_lsp::Hover>> + Send + '_ {
62 let uri = uri.to_string();
63 async move { self.with_root(&uri, |root| self.hover_provider.hover(&root, range).map(|h| oak_lsp::Hover { contents: h.contents, range: h.range })).await.flatten() }
64 }
65 fn completion(&self, _uri: &str, _offset: usize) -> impl Future<Output = Vec<oak_lsp::types::CompletionItem>> + Send + '_ {
66 async move { vec![] }
67 }
68}