@@ -13,7 +13,10 @@ use helix_core::syntax::LanguageConfiguration;
15 collections::{hash_map::Entry, HashMap},
15 collections::{hash_map::Entry, HashMap},
16− sync::Arc,
16+ sync::{
17+ atomic::{AtomicUsize, Ordering},
19use serde::{Deserialize, Serialize};
22use serde::{Deserialize, Serialize};
@@ -254,9 +257,10 @@ impl Notification {
255#[derive(Debug)]
258#[derive(Debug)]
256pub struct Registry {
259pub struct Registry {
257− inner: HashMap<LanguageId, Arc<Client>>,
260+ inner: HashMap<LanguageId, (usize, Arc<Client>)>,
262+ counter: AtomicUsize,
259− pub incoming: SelectAll<UnboundedReceiverStream<Call>>,
263+ pub incoming: SelectAll<UnboundedReceiverStream<(usize, Call)>>,
262impl Default for Registry {
266impl Default for Registry {
@@ -269,10 +273,18 @@ impl Registry {
269 pub fn new() -> Self {
273 pub fn new() -> Self {
271 inner: HashMap::new(),
275 inner: HashMap::new(),
276+ counter: AtomicUsize::new(0),
272 incoming: SelectAll::new(),
277 incoming: SelectAll::new(),
281+ pub fn get_by_id(&mut self, id: usize) -> Option<&Client> {
284+ .find(|(client_id, _)| client_id == &id)
285+ .map(|(_, client)| client.as_ref())
276 pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Arc<Client>> {
288 pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Arc<Client>> {
277 if let Some(config) = &language_config.language_server {
289 if let Some(config) = &language_config.language_server {
278 // avoid borrow issues
290 // avoid borrow issues
@@ -280,16 +292,17 @@ impl Registry {
280 let s_incoming = &mut self.incoming;
292 let s_incoming = &mut self.incoming;
282 match inner.entry(language_config.scope.clone()) {
294 match inner.entry(language_config.scope.clone()) {
283− Entry::Occupied(language_server) => Ok(language_server.get().clone()),
295+ Entry::Occupied(entry) => Ok(entry.get().1.clone()),
284 Entry::Vacant(entry) => {
296 Entry::Vacant(entry) => {
285 // initialize a new client
297 // initialize a new client
298+ let id = self.counter.fetch_add(1, Ordering::Relaxed);
286− let (mut client, incoming) = Client::start(&config.command, &config.args)?;
299+ let (mut client, incoming) = Client::start(&config.command, &config.args, id)?;
287 // TODO: run this async without blocking
300 // TODO: run this async without blocking
288 futures_executor::block_on(client.initialize())?;
301 futures_executor::block_on(client.initialize())?;
289 s_incoming.push(UnboundedReceiverStream::new(incoming));
302 s_incoming.push(UnboundedReceiverStream::new(incoming));
290 let client = Arc::new(client);
303 let client = Arc::new(client);
292− entry.insert(client.clone());
305+ entry.insert((id, client.clone()));
293 Ok(client)
306 Ok(client)