language_extension.rs

 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        load: Arc<dyn Fn() -> Result<LoadedLanguage> + Send + Sync + 'static>,
38    ) {
39        self.language_registry
40            .register_language(language, grammar, matcher, load);
41    }
42
43    fn remove_languages(
44        &self,
45        languages_to_remove: &[LanguageName],
46        grammars_to_remove: &[Arc<str>],
47    ) {
48        self.language_registry
49            .remove_languages(&languages_to_remove, &grammars_to_remove);
50    }
51}