@@ -88,6 +88,25 @@ async def _iter_candidate_servers(self) -> AsyncGenerator[Server]:
8888 yield defaults .container
8989 yield defaults .local
9090
91+ @asynccontextmanager
92+ async def run_server (
93+ self ,
94+ ) -> AsyncGenerator [tuple [Server , Receiver [ServerRequest ]]]:
95+ async with channel [ServerRequest ].create () as (sender , receiver ):
96+ errors : list [ServerRuntimeError ] = []
97+ async for candidate in self ._iter_candidate_servers ():
98+ try :
99+ async with candidate .run (self ._workspace , sender = sender ) as server : # ty: ignore[invalid-argument-type]
100+ yield server , receiver
101+ return
102+ except ServerRuntimeError as e :
103+ logger .debug ("Failed to start server {}: {}" , candidate , e )
104+ errors .append (e )
105+
106+ raise ExceptionGroup (
107+ f"All servers failed to start for { type (self ).__name__ } " , errors
108+ )
109+
91110 @override
92111 def get_workspace (self ) -> Workspace :
93112 return self ._workspace
@@ -221,25 +240,6 @@ async def _exit(self) -> None:
221240
222241 await self .notify (lsp_type .ExitNotification ())
223242
224- @asynccontextmanager
225- async def _run_server (
226- self ,
227- ) -> AsyncGenerator [tuple [Server , Receiver [ServerRequest ]]]:
228- async with channel [ServerRequest ].create () as (sender , receiver ):
229- errors : list [ServerRuntimeError ] = []
230- async for candidate in self ._iter_candidate_servers ():
231- try :
232- async with candidate .run (self ._workspace , sender = sender ) as server : # ty: ignore[invalid-argument-type]
233- yield server , receiver
234- return
235- except ServerRuntimeError as e :
236- logger .debug ("Failed to start server {}: {}" , candidate , e )
237- errors .append (e )
238-
239- raise ExceptionGroup (
240- f"All servers failed to start for { type (self ).__name__ } " , errors
241- )
242-
243243 @override
244244 @asynccontextmanager
245245 @logger .catch (reraise = True )
@@ -251,7 +251,7 @@ async def __asynccontextmanager__(self) -> AsyncGenerator[Self]:
251251
252252 async with (
253253 asyncer .create_task_group () as tg ,
254- self ._run_server () as (server , receiver ), # ty: ignore[invalid-argument-type]
254+ self .run_server () as (server , receiver ), # ty: ignore[invalid-argument-type]
255255 ):
256256 self ._server = server
257257
0 commit comments