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