22
33import os
44from abc import ABC , abstractmethod
5- from collections .abc import AsyncGenerator , Iterable
6- from contextlib import asynccontextmanager
5+ from collections .abc import AsyncGenerator
6+ from contextlib import asynccontextmanager , suppress
77from pathlib import Path
88from typing import Any , Literal , Self , override
99
@@ -62,12 +62,13 @@ class Client(
6262 _workspace : Workspace = field (init = False )
6363 _buffer : LSPFileBuffer = field (factory = LSPFileBuffer , init = False )
6464
65- def _iter_candidate_servers (self ) -> Iterable [Server ]:
65+ async def _iter_candidate_servers (self ) -> AsyncGenerator [Server ]:
6666 """
6767 Server candidates in order of priority:
6868 1. User-provided server
69- 2. Containerized server
70- 3. Local server (maybe with auto-installation)
69+ 2. Local server (if available)
70+ 3. Containerized server
71+ 4. Local server with auto-install (if enabled)
7172 """
7273
7374 defaults = self .create_default_servers ()
@@ -80,6 +81,10 @@ def _iter_candidate_servers(self) -> Iterable[Server]:
8081 case Server () as server :
8182 yield server
8283
84+ with suppress (ServerRuntimeError ):
85+ await defaults .local .check_availability ()
86+ yield defaults .local
87+
8388 yield defaults .container
8489 yield defaults .local
8590
@@ -230,13 +235,13 @@ async def _run_server(
230235 ) -> AsyncGenerator [tuple [Server , Receiver [ServerRequest ]]]:
231236 async with channel [ServerRequest ].create () as (sender , receiver ):
232237 errors : list [ServerRuntimeError ] = []
233- for server in self ._iter_candidate_servers ():
238+ async for candidate in self ._iter_candidate_servers ():
234239 try :
235- async with server .run (self ._workspace , sender = sender ) as s : # ty: ignore[invalid-argument-type]
236- yield s , receiver
240+ async with candidate .run (self ._workspace , sender = sender ) as server : # ty: ignore[invalid-argument-type]
241+ yield server , receiver
237242 return
238243 except ServerRuntimeError as e :
239- logger .debug ("Failed to start server {}: {}" , server , e )
244+ logger .debug ("Failed to start server {}: {}" , candidate , e )
240245 errors .append (e )
241246
242247 raise ExceptionGroup (
0 commit comments