1mod extension_dap_adapter;
2mod extension_locator_adapter;
3
4use std::{path::Path, sync::Arc};
5
6use dap::DapRegistry;
7use extension::{ExtensionDebugAdapterProviderProxy, ExtensionHostProxy};
8use extension_dap_adapter::ExtensionDapAdapter;
9use gpui::App;
10use util::ResultExt;
11
12use crate::extension_locator_adapter::ExtensionLocatorAdapter;
13
14pub fn init(extension_host_proxy: Arc<ExtensionHostProxy>, cx: &mut App) {
15 let language_server_registry_proxy = DebugAdapterRegistryProxy::new(cx);
16 extension_host_proxy.register_debug_adapter_proxy(language_server_registry_proxy);
17}
18
19#[derive(Clone)]
20struct DebugAdapterRegistryProxy {
21 debug_adapter_registry: DapRegistry,
22}
23
24impl DebugAdapterRegistryProxy {
25 fn new(cx: &mut App) -> Self {
26 Self {
27 debug_adapter_registry: DapRegistry::global(cx).clone(),
28 }
29 }
30}
31
32impl ExtensionDebugAdapterProviderProxy for DebugAdapterRegistryProxy {
33 fn register_debug_adapter(
34 &self,
35 extension: Arc<dyn extension::Extension>,
36 debug_adapter_name: Arc<str>,
37 schema_path: &Path,
38 ) {
39 if let Some(adapter) =
40 ExtensionDapAdapter::new(extension, debug_adapter_name, schema_path).log_err()
41 {
42 self.debug_adapter_registry.add_adapter(Arc::new(adapter));
43 }
44 }
45
46 fn register_debug_locator(
47 &self,
48 extension: Arc<dyn extension::Extension>,
49 locator_name: Arc<str>,
50 ) {
51 self.debug_adapter_registry
52 .add_locator(Arc::new(ExtensionLocatorAdapter::new(
53 extension,
54 locator_name,
55 )));
56 }
57
58 fn unregister_debug_adapter(&self, debug_adapter_name: Arc<str>) {
59 self.debug_adapter_registry
60 .remove_adapter(&debug_adapter_name);
61 }
62
63 fn unregister_debug_locator(&self, locator_name: Arc<str>) {
64 self.debug_adapter_registry.remove_locator(&locator_name);
65 }
66}