Skip to content

Commit bba1353

Browse files
authored
Merge pull request #28 from CodinGame/fix-dispose-service-too-early
Fix dispose service too early
2 parents 491e85e + c550253 commit bba1353

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

src/languageClient.ts

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as monaco from 'monaco-editor'
22
import {
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'
55
import delay from 'delay'
66
import { 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-
333328
export {
334-
createLanguageClientManager,
335-
getAllLanguageClientManagers,
336-
getAllLanguageClientManagersByTextDocument
329+
createLanguageClientManager
337330
}

0 commit comments

Comments
 (0)