1mod extension_lsp_adapter;
2
3use std::path::PathBuf;
4use std::sync::Arc;
5
6use anyhow::Result;
7use extension::{ExtensionGrammarProxy, ExtensionHostProxy, ExtensionLanguageProxy};
8use language::{LanguageMatcher, LanguageName, LanguageRegistry, LoadedLanguage};
9
10pub fn init(
11 extension_host_proxy: Arc<ExtensionHostProxy>,
12 language_registry: Arc<LanguageRegistry>,
13) {
14 let language_server_registry_proxy = LanguageServerRegistryProxy { language_registry };
15 extension_host_proxy.register_grammar_proxy(language_server_registry_proxy.clone());
16 extension_host_proxy.register_language_proxy(language_server_registry_proxy.clone());
17 extension_host_proxy.register_language_server_proxy(language_server_registry_proxy);
18}
19
20#[derive(Clone)]
21struct LanguageServerRegistryProxy {
22 language_registry: Arc<LanguageRegistry>,
23}
24
25impl ExtensionGrammarProxy for LanguageServerRegistryProxy {
26 fn register_grammars(&self, grammars: Vec<(Arc<str>, PathBuf)>) {
27 self.language_registry.register_wasm_grammars(grammars)
28 }
29}
30
31impl ExtensionLanguageProxy for LanguageServerRegistryProxy {
32 fn register_language(
33 &self,
34 language: LanguageName,
35 grammar: Option<Arc<str>>,
36 matcher: LanguageMatcher,
37 hidden: bool,
38 load: Arc<dyn Fn() -> Result<LoadedLanguage> + Send + Sync + 'static>,
39 ) {
40 self.language_registry
41 .register_language(language, grammar, matcher, hidden, load);
42 }
43
44 fn remove_languages(
45 &self,
46 languages_to_remove: &[LanguageName],
47 grammars_to_remove: &[Arc<str>],
48 ) {
49 self.language_registry
50 .remove_languages(&languages_to_remove, &grammars_to_remove);
51 }
52}