11import  *  as  monaco  from  'monaco-editor' 
22import  { 
3-   CloseAction ,  ErrorAction ,  MonacoLanguageClient ,  Emitter ,  Event ,  TextDocument ,  Services ,  State ,  DisposableCollection ,  CancellationToken ,  RequestType ,  NotificationType ,  Disposable ,   LogMessageNotification 
3+   CloseAction ,  ErrorAction ,  MonacoLanguageClient ,  Emitter ,  Event ,  TextDocument ,  Services ,  State ,  DisposableCollection ,  CancellationToken ,  RequestType ,  NotificationType ,  LogMessageNotification 
44}  from  'monaco-languageclient' 
55import  delay  from  'delay' 
66import  {  Uri  }  from  'monaco-editor' 
@@ -30,6 +30,7 @@ export class LanguageClientManager implements LanguageClient {
3030  protected  readonly  onDidChangeStatusEmitter  =  new  Emitter < StatusChangeEvent > ( ) 
3131  protected  readonly  onErrorEmitter  =  new  Emitter < Error > ( ) 
3232  protected  readonly  onWillCloseEmitter  =  new  Emitter < void > ( ) 
33+   protected  readonly  onDidCloseEmitter  =  new  Emitter < void > ( ) 
3334  protected  readonly  onWillShutdownEmitter  =  new  Emitter < WillShutdownParams > ( ) 
3435  protected  currentStatus : Status  =  'connecting' 
3536  private  useMutualizedProxy : boolean 
@@ -60,10 +61,14 @@ export class LanguageClientManager implements LanguageClient {
6061  async  dispose  ( ) : Promise < void >  { 
6162    this . disposed  =  true 
6263    this . onWillCloseEmitter . fire ( ) 
63-     if  ( this . languageClient  !=  null )  { 
64-       const  languageClient  =  this . languageClient 
65-       this . languageClient  =  undefined 
66-       await  languageClient . stop ( ) 
64+     try  { 
65+       if  ( this . languageClient  !=  null )  { 
66+         const  languageClient  =  this . languageClient 
67+         this . languageClient  =  undefined 
68+         await  languageClient . stop ( ) 
69+       } 
70+     }  finally  { 
71+       this . onDidCloseEmitter . fire ( ) 
6772    } 
6873  } 
6974
@@ -75,6 +80,10 @@ export class LanguageClientManager implements LanguageClient {
7580    return  this . onWillCloseEmitter . event 
7681  } 
7782
83+   get  onDidClose  ( ) : Event < void >  { 
84+     return  this . onDidCloseEmitter . event 
85+   } 
86+ 
7887  get  onWillShutdown  ( ) : Event < WillShutdownParams >  { 
7988    return  this . onWillShutdownEmitter . event 
8089  } 
@@ -263,8 +272,6 @@ export class LanguageClientManager implements LanguageClient {
263272  } 
264273} 
265274
266- const  languageClientManagerByLanguageId : Partial < Record < string ,  LanguageClientManager > >  =  { } 
267- 
268275/** 
269276 * Create a language client manager 
270277 * @param  id The predefined id of the language client 
@@ -276,9 +283,6 @@ function createLanguageClientManager (
276283  id : LanguageClientId , 
277284  infrastructure : Infrastructure 
278285) : LanguageClientManager  { 
279-   if  ( languageClientManagerByLanguageId [ id ]  !=  null )  { 
280-     throw  new  Error ( `Language client for language ${ id }   already started` ) 
281-   } 
282286  let  languageServerOptions  =  getLanguageClientOptions ( id ) 
283287  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 
284288  if  ( languageServerOptions  ==  null )  { 
@@ -296,13 +300,9 @@ function createLanguageClientManager (
296300
297301  const  disposableCollection  =  new  DisposableCollection ( ) 
298302
299-   disposableCollection . push ( installServices ( infrastructure ) ) 
303+   const   serviceDisposable   =   installServices ( infrastructure ) 
300304
301305  const  languageClientManager  =  new  LanguageClientManager ( id ,  languageServerOptions ,  infrastructure ) 
302-   languageClientManagerByLanguageId [ id ]  =  languageClientManager 
303-   disposableCollection . push ( Disposable . create ( ( )  =>  { 
304-     delete  languageClientManagerByLanguageId [ id ] 
305-   } ) ) 
306306
307307  disposableCollection . push ( registerTextModelContentProvider ( 'file' ,  { 
308308    async  provideTextContent  ( resource : Uri ) : Promise < monaco . editor . ITextModel  |  null >  { 
@@ -318,20 +318,13 @@ function createLanguageClientManager (
318318  languageClientManager . onWillClose ( ( )  =>  { 
319319    disposableCollection . dispose ( ) 
320320  } ) 
321+   languageClientManager . onDidClose ( ( )  =>  { 
322+     serviceDisposable . dispose ( ) 
323+   } ) 
321324
322325  return  languageClientManager 
323326} 
324327
325- function  getAllLanguageClientManagers  ( ) : LanguageClientManager [ ]  { 
326-   return  Object . values ( languageClientManagerByLanguageId )  as  LanguageClientManager [ ] 
327- } 
328- 
329- function  getAllLanguageClientManagersByTextDocument  ( textDocument : TextDocument ) : LanguageClientManager [ ]  { 
330-   return  getAllLanguageClientManagers ( ) . filter ( manager  =>  manager . isModelManaged ( textDocument ) ) 
331- } 
332- 
333328export  { 
334-   createLanguageClientManager , 
335-   getAllLanguageClientManagers , 
336-   getAllLanguageClientManagersByTextDocument 
329+   createLanguageClientManager 
337330} 
0 commit comments