Skip to content

Commit 30b2a1f

Browse files
committed
fix: Update code for new api
1 parent 25eca1c commit 30b2a1f

11 files changed

+134
-113
lines changed

src/createLanguageClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { MessageReader, MessageWriter, Message, Event, DataCallback, Disposable, PartialMessageInfo } from 'vscode-jsonrpc'
22
import { Uri } from 'monaco-editor'
33
import {
4-
MonacoLanguageClient, Middleware, ErrorHandler, IConnectionProvider, InitializeParams, RegistrationRequest, RegistrationParams, UnregistrationRequest, UnregistrationParams, LanguageClientOptions, MessageTransports, InitializeRequest
4+
MonacoLanguageClient, Middleware, ErrorHandler, IConnectionProvider, LanguageClientOptions, MessageTransports
55
} from 'monaco-languageclient'
6+
import { InitializeParams, InitializeRequest, RegistrationParams, RegistrationRequest, UnregistrationParams, UnregistrationRequest } from 'vscode-languageserver-protocol'
67
import { registerExtensionFeatures } from './extensions'
78
import { LanguageClientId } from './languageClientOptions'
89
import { Infrastructure } from './infrastructure'

src/extensions.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { monaco, registerTextModelContentProvider } from '@codingame/monaco-editor-wrapper'
22
import {
3-
Disposable,
4-
ServerCapabilities, DocumentSelector, MonacoLanguageClient, Services,
5-
TextDocumentSyncOptions, TextDocument, DidSaveTextDocumentNotification, Emitter, DisposableCollection
3+
Disposable, MonacoLanguageClient, DisposableCollection
64
} from 'monaco-languageclient'
75
import { StaticFeature, FeatureState, ProtocolRequestType } from 'vscode-languageclient/lib/common/api'
6+
import { DidSaveTextDocumentNotification, DocumentSelector, Emitter, ServerCapabilities, TextDocumentSyncOptions } from 'vscode-languageserver-protocol'
7+
import * as vscode from 'vscode'
88
import { updateFile, willShutdownNotificationType, WillShutdownParams } from './customRequests'
99
import { Infrastructure } from './infrastructure'
1010
import { LanguageClient, LanguageClientManager } from './languageClient'
@@ -28,22 +28,22 @@ export class InitializeTextDocumentFeature implements StaticFeature {
2828
}
2929

3030
const languageClient = this.languageClient
31-
async function saveFile (textDocument: TextDocument) {
32-
if (Services.get().languages.match(documentSelector!, textDocument)) {
33-
await updateFile(textDocument.uri, textDocument.getText(), languageClient)
31+
async function saveFile (textDocument: vscode.TextDocument) {
32+
if (documentSelector != null && vscode.languages.match(documentSelector, textDocument) > 0) {
33+
await updateFile(textDocument.uri.toString(), textDocument.getText(), languageClient)
3434

3535
// Always send notification even if the server doesn't support it (because csharp register the didSave feature too late)
36-
languageClient.sendNotification(DidSaveTextDocumentNotification.type, {
36+
await languageClient.sendNotification(DidSaveTextDocumentNotification.type, {
3737
textDocument: {
38-
uri: textDocument.uri
38+
uri: textDocument.uri.toString()
3939
},
4040
text: textDocument.getText()
4141
})
4242
}
4343
}
4444

45-
this.didOpenTextDocumentDisposable = Services.get().workspace.onDidOpenTextDocument(saveFile)
46-
Services.get().workspace.textDocuments.forEach(saveFile)
45+
this.didOpenTextDocumentDisposable = vscode.workspace.onDidOpenTextDocument(saveFile)
46+
vscode.workspace.textDocuments.forEach(saveFile)
4747
}
4848

4949
getState (): FeatureState {
@@ -66,18 +66,18 @@ class CobolResolveSubroutineFeature implements StaticFeature {
6666
fillClientCapabilities (): void {}
6767

6868
initialize (capabilities: ServerCapabilities, documentSelector: DocumentSelector): void {
69-
this.onRequestDisposable = this.languageClient.onRequest(ResolveCobolSubroutineRequestType, (routineName: string) => {
69+
this.onRequestDisposable = this.languageClient.onRequest(ResolveCobolSubroutineRequestType, (routineName: string): string => {
7070
const constantRoutinePaths: Partial<Record<string, string>> = {
71-
'assert-equals': `${Services.get().workspace.rootUri ?? 'file:/tmp/project'}/deps/assert-equals.cbl`
71+
'assert-equals': `file:${vscode.workspace.rootPath ?? '/tmp/project'}/deps/assert-equals.cbl`
7272
}
7373
const contantRoutinePath = constantRoutinePaths[routineName.toLowerCase()]
7474
if (contantRoutinePath != null) {
7575
return contantRoutinePath
7676
}
77-
return Services.get().workspace.textDocuments
78-
.filter(textDocument => Services.get().languages.match(documentSelector, textDocument))
77+
return vscode.workspace.textDocuments
78+
.filter(textDocument => vscode.languages.match(documentSelector, textDocument))
7979
.filter(document => document.getText().match(new RegExp(`PROGRAM-ID\\.\\W+${routineName}\\.`, 'gi')))
80-
.sort((a, b) => a.uri.localeCompare(b.uri))[0]?.uri
80+
.sort((a, b) => a.uri.toString().localeCompare(b.uri.toString()))[0]?.uri.toString()
8181
})
8282
}
8383

@@ -131,9 +131,9 @@ export class FileSystemFeature implements StaticFeature {
131131
}
132132
}))
133133
disposableCollection.push(getServices().workspace.registerSaveDocumentHandler({
134-
async saveTextContent (textDocument, reason) {
135-
if (languageClientManager.isModelManaged(textDocument)) {
136-
await infrastructure.saveFileContent?.(textDocument, reason, languageClientManager)
134+
async saveTextContent (document, reason) {
135+
if (languageClientManager.isModelManaged(document)) {
136+
await infrastructure.saveFileContent?.(document, reason, languageClientManager)
137137
}
138138
}
139139
}))

src/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MessageTransports, TextDocument, TextDocumentSaveReason } from 'monaco-languageclient'
1+
import { MessageTransports } from 'monaco-languageclient'
22
import 'proxy-polyfill'
33
import type { WorkspaceFolder } from 'vscode'
44
import { CodinGameInfrastructure, Infrastructure } from './infrastructure'
@@ -24,8 +24,6 @@ export type {
2424
WillShutdownParams,
2525
Infrastructure,
2626
WorkspaceFolder,
27-
TextDocument,
28-
TextDocumentSaveReason,
2927
LanguageClientOptions,
3028
LanguageClientManagerOptions,
3129
MessageTransports

src/infrastructure.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { IWebSocket, WebSocketMessageReader, WebSocketMessageWriter, toSocket } from '@codingame/monaco-jsonrpc'
2-
import { MessageTransports, TextDocument, TextDocumentSaveReason } from 'monaco-languageclient'
2+
import { MessageTransports } from 'monaco-languageclient'
33
import * as monaco from 'monaco-editor'
44
import type * as vscode from 'vscode'
5+
import { TextDocument } from 'vscode-languageserver-textdocument'
6+
import { TextDocumentSaveReason } from 'vscode-languageserver-protocol'
57
import { getFile, updateFile } from './customRequests'
68
import { LanguageClientManager } from './languageClient'
79
import { LanguageClientId, LanguageClientOptions } from './languageClientOptions'
@@ -33,7 +35,7 @@ export interface Infrastructure {
3335
* @param reason The reason of the save
3436
* @param languageClient The languageclient we're trying to save the file to
3537
*/
36-
saveFileContent? (document: TextDocument, reason: TextDocumentSaveReason, languageClient: LanguageClientManager): Promise<void>
38+
saveFileContent? (document: vscode.TextDocument, reason: vscode.TextDocumentSaveReason, languageClient: LanguageClientManager): Promise<void>
3739
/**
3840
* Get a text file content as a model
3941
* @param resource the Uri of the file
@@ -96,7 +98,7 @@ export abstract class CodinGameInfrastructure implements Infrastructure {
9698
name: 'main'
9799
}]
98100

99-
public async saveFileContent (document: TextDocument, reason: TextDocumentSaveReason, languageClient: LanguageClientManager): Promise<void> {
101+
public async saveFileContent (document: vscode.TextDocument, reason: TextDocumentSaveReason, languageClient: LanguageClientManager): Promise<void> {
100102
if (languageClient.isConnected()) {
101103
await updateFile(document.uri.toString(), document.getText(), languageClient)
102104
}

src/languageClient.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
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, State, DisposableCollection
44
} from 'monaco-languageclient'
55
import delay from 'delay'
6+
import { CancellationToken, Emitter, NotificationType, RequestType, Event, LogMessageNotification } from 'vscode-languageserver-protocol'
7+
import * as vscode from 'vscode'
68
import { updateServices } from './services'
79
import createLanguageClient from './createLanguageClient'
810
import { WillShutdownParams } from './customRequests'
@@ -12,7 +14,7 @@ import { getLanguageClientOptions, LanguageClientId, LanguageClientOptions } fro
1214
import { Infrastructure } from './infrastructure'
1315

1416
export interface LanguageClient {
15-
sendNotification<P>(type: NotificationType<P>, params?: P): void
17+
sendNotification<P>(type: NotificationType<P>, params?: P): Promise<void>
1618
sendRequest<P, R, E> (request: RequestType<P, R, E>, params: P, token?: CancellationToken): Promise<R>
1719
}
1820

@@ -94,11 +96,11 @@ export class LanguageClientManager implements LanguageClient {
9496
return this.onErrorEmitter.event
9597
}
9698

97-
isModelManaged (document: TextDocument): boolean {
99+
isModelManaged (document: vscode.TextDocument): boolean {
98100
if (this.clientOptions.documentSelector == null) {
99101
return false
100102
}
101-
return Services.get().languages.match(this.clientOptions.documentSelector, document)
103+
return vscode.languages.match(this.clientOptions.documentSelector, document) > 0
102104
}
103105

104106
isDisposed (): boolean {

src/services.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,37 @@
11

2-
import * as monaco from 'monaco-editor'
3-
import {
4-
Services, MonacoToProtocolConverter, ProtocolToMonacoConverter, MonacoLanguages, MonacoCommands
5-
} from 'monaco-languageclient'
6-
import { RenameFile, CreateFile, WorkspaceEdit, Disposable } from 'vscode-languageserver-protocol'
2+
import { Services } from 'vscode/services'
3+
import { WorkspaceEdit, Disposable } from 'vscode-languageserver-protocol'
4+
import * as vscode from 'vscode'
5+
import { createConverter as createProtocolConverter } from 'vscode-languageclient/lib/common/protocolConverter'
76
import WatchableConsoleWindow from './services/WatchableConsoleWindow'
87
import CodinGameMonacoWorkspace from './services/CodinGameMonacoWorkspace'
98
import { Infrastructure } from './infrastructure'
109
import CodinGameMonacoEnv from './services/CodinGameMonacoEnv'
1110

1211
interface CgMonacoServices extends Services {
13-
commands: MonacoCommands
14-
languages: MonacoLanguages
1512
workspace: CodinGameMonacoWorkspace
1613
window: WatchableConsoleWindow
1714
}
1815

19-
function installCommands (services: CgMonacoServices): Disposable {
16+
function installCommands (): Disposable {
2017
// Comes from https://github.com/redhat-developer/vscode-java/blob/9b0f0aca80cbefabad4c034fb5dd365d029f6170/src/extension.ts#L155-L160
2118
// Other commands needs to be implemented as well?
2219
// (https://github.com/eclipse/eclipse.jdt.ls/issues/376#issuecomment-333923685)
23-
return services.commands.registerCommand('java.apply.workspaceEdit', (edit: WorkspaceEdit) => {
24-
if (edit.documentChanges != null && edit.documentChanges.some(change => RenameFile.is(change) || CreateFile.is(change))) {
25-
alert('Unimplemented command')
26-
return
27-
}
28-
29-
return services.workspace.applyEdit(edit)
20+
const protocolConverter = createProtocolConverter(undefined, true, true)
21+
return vscode.commands.registerCommand('java.apply.workspaceEdit', async (obj: WorkspaceEdit) => {
22+
const edit = await protocolConverter.asWorkspaceEdit(obj)
23+
return vscode.workspace.applyEdit(edit)
3024
})
3125
}
3226

33-
const m2p = new MonacoToProtocolConverter(monaco)
34-
const p2m = new ProtocolToMonacoConverter(monaco)
3527
const services = {
36-
commands: new MonacoCommands(monaco),
37-
languages: new MonacoLanguages(monaco, p2m, m2p),
38-
workspace: new CodinGameMonacoWorkspace(p2m, m2p, 'file:///tmp/project'),
28+
workspace: new CodinGameMonacoWorkspace('file:///tmp/project'),
3929
window: new WatchableConsoleWindow(),
4030
env: new CodinGameMonacoEnv()
4131
}
4232

43-
installCommands(services)
4433
Services.install(services)
34+
installCommands()
4535

4636
function updateServices (infrastructure: Infrastructure): void {
4737
services.workspace.initialize(

src/services/CodinGameMonacoEnv.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
Env
3-
} from 'monaco-languageclient'
3+
} from 'vscode/services'
44

55
/**
66
* This function comes from vscode: https://github.com/microsoft/vscode/blob/85bf8af5b9661b0c7f9587d33b3cb61499f6e4b8/src/vs/base/browser/dom.ts#L1282

src/services/CodinGameMonacoWorkspace.ts

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,43 @@
11
import {
2-
MonacoWorkspace, TextDocument, TextDocumentSaveReason,
3-
ProtocolToMonacoConverter, MonacoToProtocolConverter, Emitter, Event, TextDocumentWillSaveEvent, Disposable, DisposableCollection
2+
Disposable, DisposableCollection
43
} from 'monaco-languageclient'
54
import * as monaco from 'monaco-editor'
6-
import type * as vscode from 'vscode'
5+
import * as vscode from 'vscode'
6+
import { Workspace } from 'vscode/services'
7+
import { Event, Emitter, TextDocumentSaveReason } from 'vscode-languageserver-protocol'
78
import Configuration from './Configuration'
89

910
export interface ITextModelContentSaveHandler {
10-
saveTextContent(document: TextDocument, reason: TextDocumentSaveReason): Promise<void>
11+
saveTextContent(document: vscode.TextDocument, reason: TextDocumentSaveReason): Promise<void>
1112
}
1213

13-
export default class CodinGameMonacoWorkspace extends MonacoWorkspace {
14-
protected readonly onWillSaveTextDocumentEmitter = new Emitter<TextDocumentWillSaveEvent>()
14+
export default class CodinGameMonacoWorkspace implements Workspace {
15+
protected readonly onWillSaveTextDocumentEmitter = new Emitter<vscode.TextDocumentWillSaveEvent>()
1516
private readonly savehandlers: ITextModelContentSaveHandler[] = []
16-
protected readonly onDidSaveTextDocumentEmitter = new Emitter<TextDocument>()
17+
protected readonly onDidSaveTextDocumentEmitter = new Emitter<vscode.TextDocument>()
1718

18-
configurations = new Configuration()
19+
private configuration = new Configuration()
20+
21+
getConfiguration = (section?: string | undefined): vscode.WorkspaceConfiguration => {
22+
return this.configuration.getConfiguration(section)
23+
}
24+
25+
onDidChangeConfiguration = this.configuration.onDidChangeConfiguration
1926

2027
private autoSaveModelDisposable: Disposable | undefined
2128

2229
public workspaceFolders: typeof vscode.workspace.workspaceFolders
2330

2431
constructor (
25-
p2m: ProtocolToMonacoConverter,
26-
m2p: MonacoToProtocolConverter,
27-
rootUri: string | null = null
32+
public readonly rootUri: string | null = null
2833
) {
29-
super(monaco, p2m, m2p, rootUri)
3034
}
3135

3236
public initialize (
3337
rootUri: string | null = null,
3438
workspaceFolders: typeof vscode.workspace.workspaceFolders,
3539
autoSaveModels: boolean
3640
): void {
37-
this._rootUri = rootUri
3841
if (workspaceFolders != null) {
3942
this.workspaceFolders = workspaceFolders
4043
} else if (rootUri != null) {
@@ -53,11 +56,11 @@ export default class CodinGameMonacoWorkspace extends MonacoWorkspace {
5356
}
5457
}
5558

56-
get onWillSaveTextDocument (): Event<TextDocumentWillSaveEvent> {
59+
get onWillSaveTextDocument (): Event<vscode.TextDocumentWillSaveEvent> {
5760
return this.onWillSaveTextDocumentEmitter.event
5861
}
5962

60-
get onDidSaveTextDocument (): Event<TextDocument> {
63+
get onDidSaveTextDocument (): Event<vscode.TextDocument> {
6164
return this.onDidSaveTextDocumentEmitter.event
6265
}
6366

@@ -71,10 +74,13 @@ export default class CodinGameMonacoWorkspace extends MonacoWorkspace {
7174
})
7275
}
7376

74-
async saveDocument (document: TextDocument, reason: TextDocumentSaveReason): Promise<void> {
77+
async saveDocument (document: vscode.TextDocument, reason: TextDocumentSaveReason): Promise<void> {
7578
this.onWillSaveTextDocumentEmitter.fire({
76-
textDocument: document,
77-
reason
79+
document,
80+
reason,
81+
waitUntil () {
82+
// Ignored
83+
}
7884
})
7985

8086
try {
@@ -93,16 +99,17 @@ export default class CodinGameMonacoWorkspace extends MonacoWorkspace {
9399
private autoSaveModels (): Disposable {
94100
const disposableCollection = new DisposableCollection()
95101
const timeoutMap = new Map<string, number>()
96-
disposableCollection.push(this.onDidChangeTextDocument(e => {
97-
const timeout = timeoutMap.get(e.textDocument.uri)
102+
disposableCollection.push(vscode.workspace.onDidChangeTextDocument(e => {
103+
const uri = e.document.uri.toString()
104+
const timeout = timeoutMap.get(uri)
98105
if (timeout != null) {
99106
window.clearTimeout(timeout)
100-
timeoutMap.delete(e.textDocument.uri)
107+
timeoutMap.delete(uri)
101108
}
102-
timeoutMap.set(e.textDocument.uri, window.setTimeout(() => {
103-
timeoutMap.delete(e.textDocument.uri)
104-
this.saveDocument(e.textDocument, TextDocumentSaveReason.AfterDelay).catch((error: Error) => {
105-
monaco.errorHandler.onUnexpectedError(new Error(`[LSP] Unable to save the document ${e.textDocument.uri.toString()}`, {
109+
timeoutMap.set(uri, window.setTimeout(() => {
110+
timeoutMap.delete(uri)
111+
this.saveDocument(e.document, TextDocumentSaveReason.AfterDelay).catch((error: Error) => {
112+
monaco.errorHandler.onUnexpectedError(new Error(`[LSP] Unable to save the document ${uri}`, {
106113
cause: error
107114
}))
108115
})
@@ -116,10 +123,9 @@ export default class CodinGameMonacoWorkspace extends MonacoWorkspace {
116123
return disposableCollection
117124
}
118125

119-
override dispose (): void {
120-
super.dispose()
126+
dispose (): void {
121127
this.autoSaveModelDisposable?.dispose()
122-
this.configurations.dispose()
128+
this.configuration.dispose()
123129
this.onWillSaveTextDocumentEmitter.dispose()
124130
this.onDidSaveTextDocumentEmitter.dispose()
125131
}

0 commit comments

Comments
 (0)