Skip to content

Commit 95042bc

Browse files
authored
Merge pull request #30 from CodinGame/fix-file-handler-disconnected
Do not bind file handlers while disconnected
2 parents e8afc79 + a5f6a12 commit 95042bc

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

src/languageClient.ts

Lines changed: 22 additions & 24 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, LogMessageNotification
3+
CloseAction, ErrorAction, MonacoLanguageClient, Emitter, Event, TextDocument, Services, State, DisposableCollection, CancellationToken, RequestType, NotificationType, LogMessageNotification, Disposable
44
} from 'monaco-languageclient'
55
import delay from 'delay'
66
import { 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
*/
289303
function 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

Comments
 (0)