Skip to content

Commit cb95ce8

Browse files
committed
fix: Use a feature to handle file management
1 parent 40b6a1e commit cb95ce8

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

src/extensions.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import { monaco, registerTextModelContentProvider } from '@codingame/monaco-editor-wrapper'
12
import {
23
Disposable,
34
ServerCapabilities, DocumentSelector, MonacoLanguageClient, StaticFeature, Services,
4-
TextDocumentSyncOptions, TextDocument, DidSaveTextDocumentNotification, Emitter
5+
TextDocumentSyncOptions, TextDocument, DidSaveTextDocumentNotification, Emitter, DisposableCollection
56
} from 'monaco-languageclient'
67
import { updateFile, willShutdownNotificationType, WillShutdownParams } from './customRequests'
7-
import { LanguageClient } from './languageClient'
8+
import { Infrastructure } from './infrastructure'
9+
import { LanguageClient, LanguageClientManager } from './languageClient'
10+
import { getServices } from './services'
811

912
interface ResolvedTextDocumentSyncCapabilities {
1013
resolvedTextDocumentSync?: TextDocumentSyncOptions
@@ -92,3 +95,38 @@ export class WillDisposeFeature implements StaticFeature {
9295

9396
dispose (): void {}
9497
}
98+
99+
export class FileSystemFeature implements StaticFeature {
100+
private disposable: Disposable | undefined
101+
102+
constructor (private infrastructure: Infrastructure, private languageClientManager: LanguageClientManager) {}
103+
104+
private registerFileHandlers (): Disposable {
105+
const disposableCollection = new DisposableCollection()
106+
const infrastructure = this.infrastructure
107+
const languageClientManager = this.languageClientManager
108+
disposableCollection.push(registerTextModelContentProvider('file', {
109+
async provideTextContent (resource: monaco.Uri): Promise<monaco.editor.ITextModel | null> {
110+
return await infrastructure.getFileContent(resource, languageClientManager)
111+
}
112+
}))
113+
disposableCollection.push(getServices().workspace.registerSaveDocumentHandler({
114+
async saveTextContent (textDocument, reason) {
115+
await infrastructure.saveFileContent?.(textDocument, reason, languageClientManager)
116+
}
117+
}))
118+
return disposableCollection
119+
}
120+
121+
fillClientCapabilities (): void {}
122+
123+
initialize (): void {
124+
this.dispose()
125+
this.disposable = this.registerFileHandlers()
126+
}
127+
128+
dispose (): void {
129+
this.disposable?.dispose()
130+
this.disposable = undefined
131+
}
132+
}

src/languageClient.ts

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import * as monaco from 'monaco-editor'
22
import {
3-
CloseAction, ErrorAction, MonacoLanguageClient, Emitter, Event, TextDocument, Services, State, DisposableCollection, CancellationToken, RequestType, NotificationType, LogMessageNotification, Disposable
3+
CloseAction, ErrorAction, MonacoLanguageClient, Emitter, Event, TextDocument, Services, State, DisposableCollection, CancellationToken, RequestType, NotificationType, LogMessageNotification
44
} from 'monaco-languageclient'
55
import delay from 'delay'
6-
import { Uri } from 'monaco-editor'
7-
import { registerTextModelContentProvider } from '@codingame/monaco-editor-wrapper'
8-
import { getServices, installServices } from './services'
6+
import { installServices } from './services'
97
import createLanguageClient from './createLanguageClient'
108
import { WillShutdownParams } from './customRequests'
11-
import { InitializeTextDocumentFeature, WillDisposeFeature } from './extensions'
9+
import { FileSystemFeature, InitializeTextDocumentFeature, WillDisposeFeature } from './extensions'
1210
import { loadExtensionConfigurations } from './extensionConfiguration'
1311
import { getLanguageClientOptions, LanguageClientId, LanguageClientOptions } from './languageClientOptions'
1412
import { Infrastructure } from './infrastructure'
@@ -205,7 +203,6 @@ export class LanguageClientManager implements LanguageClient {
205203
this.languageClient = languageClient
206204

207205
let readyPromise: Promise<void> | null = null
208-
let fileHandlerRegistration: Disposable | null = null
209206
languageClient.onDidChangeState(async (state) => {
210207
switch (state.newState) {
211208
case State.Starting: {
@@ -242,7 +239,6 @@ export class LanguageClientManager implements LanguageClient {
242239
break
243240
}
244241
case State.Running: {
245-
fileHandlerRegistration = this.registerFileHandlers()
246242
this.updateStatus('connected')
247243

248244
await readyPromise
@@ -251,9 +247,6 @@ export class LanguageClientManager implements LanguageClient {
251247
break
252248
}
253249
case State.Stopped: {
254-
fileHandlerRegistration?.dispose()
255-
fileHandlerRegistration = null
256-
257250
this.updateStatus('closed')
258251
break
259252
}
@@ -262,6 +255,8 @@ export class LanguageClientManager implements LanguageClient {
262255

263256
this.languageClient.registerFeature(new WillDisposeFeature(this.languageClient, this.onWillShutdownEmitter))
264257

258+
this.languageClient.registerFeature(new FileSystemFeature(this.infrastructure, this))
259+
265260
if (!this.infrastructure.automaticTextDocumentUpdate) {
266261
this.languageClient.registerFeature(new InitializeTextDocumentFeature(this))
267262
}
@@ -276,22 +271,6 @@ export class LanguageClientManager implements LanguageClient {
276271
sendRequest<P, R, E> (type: RequestType<P, R, E>, params: P): Promise<R> {
277272
return this.languageClient!.sendRequest<P, R, E>(type, params)
278273
}
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-
}
295274
}
296275

297276
/**

0 commit comments

Comments
 (0)