11import * as monaco from 'monaco-editor'
22import {
3- CloseAction , ErrorAction , MonacoLanguageClient , Emitter , Event , TextDocument , Services , State , DisposableCollection , CancellationToken , RequestType , NotificationType , LogMessageNotification
3+ CloseAction , ErrorAction , MonacoLanguageClient , Emitter , Event , TextDocument , Services , State , DisposableCollection , CancellationToken , RequestType , NotificationType , LogMessageNotification , Disposable
44} from 'monaco-languageclient'
55import delay from 'delay'
66import { Uri } from 'monaco-editor'
@@ -29,7 +29,6 @@ export class LanguageClientManager implements LanguageClient {
2929 private disposed : boolean = false
3030 protected readonly onDidChangeStatusEmitter = new Emitter < StatusChangeEvent > ( )
3131 protected readonly onErrorEmitter = new Emitter < Error > ( )
32- protected readonly onWillCloseEmitter = new Emitter < void > ( )
3332 protected readonly onDidCloseEmitter = new Emitter < void > ( )
3433 protected readonly onWillShutdownEmitter = new Emitter < WillShutdownParams > ( )
3534 protected currentStatus : Status = 'connecting'
@@ -60,7 +59,6 @@ export class LanguageClientManager implements LanguageClient {
6059
6160 async dispose ( ) : Promise < void > {
6261 this . disposed = true
63- this . onWillCloseEmitter . fire ( )
6462 try {
6563 if ( this . languageClient != null ) {
6664 const languageClient = this . languageClient
@@ -76,10 +74,6 @@ export class LanguageClientManager implements LanguageClient {
7674 return this . onDidChangeStatusEmitter . event
7775 }
7876
79- get onWillClose ( ) : Event < void > {
80- return this . onWillCloseEmitter . event
81- }
82-
8377 get onDidClose ( ) : Event < void > {
8478 return this . onDidCloseEmitter . event
8579 }
@@ -211,6 +205,7 @@ export class LanguageClientManager implements LanguageClient {
211205 this . languageClient = languageClient
212206
213207 let readyPromise : Promise < void > | null = null
208+ let fileHandlerRegistration : Disposable | null = null
214209 languageClient . onDidChangeState ( async ( state ) => {
215210 switch ( state . newState ) {
216211 case State . Starting : {
@@ -247,6 +242,7 @@ export class LanguageClientManager implements LanguageClient {
247242 break
248243 }
249244 case State . Running : {
245+ fileHandlerRegistration = this . registerFileHandlers ( )
250246 this . updateStatus ( 'connected' )
251247
252248 await readyPromise
@@ -255,6 +251,9 @@ export class LanguageClientManager implements LanguageClient {
255251 break
256252 }
257253 case State . Stopped : {
254+ fileHandlerRegistration ?. dispose ( )
255+ fileHandlerRegistration = null
256+
258257 this . updateStatus ( 'closed' )
259258 break
260259 }
@@ -277,13 +276,28 @@ export class LanguageClientManager implements LanguageClient {
277276 sendRequest < P , R , E > ( type : RequestType < P , R , E > , params : P ) : Promise < R > {
278277 return this . languageClient ! . sendRequest < P , R , E > ( type , params )
279278 }
279+
280+ private registerFileHandlers ( ) : Disposable {
281+ const disposableCollection = new DisposableCollection ( )
282+ const languageClientManager = this
283+ disposableCollection . push ( registerTextModelContentProvider ( 'file' , {
284+ async provideTextContent ( resource : Uri ) : Promise < monaco . editor . ITextModel | null > {
285+ return await languageClientManager . infrastructure . getFileContent ( resource , languageClientManager )
286+ }
287+ } ) )
288+ disposableCollection . push ( getServices ( ) . workspace . registerSaveDocumentHandler ( {
289+ async saveTextContent ( textDocument , reason ) {
290+ await languageClientManager . infrastructure . saveFileContent ?.( textDocument , reason , languageClientManager )
291+ }
292+ } ) )
293+ return disposableCollection
294+ }
280295}
281296
282297/**
283298 * Create a language client manager
284299 * @param id The predefined id of the language client
285300 * @param infrastructure The infrastructure to use
286- * @param parameters the infrastructure parameters
287301 * @returns A language client manager
288302 */
289303function createLanguageClientManager (
@@ -305,26 +319,10 @@ function createLanguageClientManager (
305319 }
306320 }
307321
308- const disposableCollection = new DisposableCollection ( )
309-
310322 const serviceDisposable = installServices ( infrastructure )
311323
312324 const languageClientManager = new LanguageClientManager ( id , languageServerOptions , infrastructure )
313325
314- disposableCollection . push ( registerTextModelContentProvider ( 'file' , {
315- async provideTextContent ( resource : Uri ) : Promise < monaco . editor . ITextModel | null > {
316- return await infrastructure . getFileContent ( resource , languageClientManager )
317- }
318- } ) )
319- disposableCollection . push ( getServices ( ) . workspace . registerSaveDocumentHandler ( {
320- async saveTextContent ( textDocument , reason ) {
321- await infrastructure . saveFileContent ?.( textDocument , reason , languageClientManager )
322- }
323- } ) )
324-
325- languageClientManager . onWillClose ( ( ) => {
326- disposableCollection . dispose ( )
327- } )
328326 languageClientManager . onDidClose ( ( ) => {
329327 serviceDisposable . dispose ( )
330328 } )
0 commit comments