Skip to content

Commit 2011a25

Browse files
committed
Add support for CodeActions triggering commands on language servers
Signed-off-by: Nicholas Gates <ngates@palantir.com>
1 parent 69d27ea commit 2011a25

4 files changed

Lines changed: 43 additions & 8 deletions

File tree

example/src/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const value = `{
2222
"$schema": "http://json.schemastore.org/coffeelint",
2323
"line_endings": "unix"
2424
}`;
25-
monaco.editor.create(document.getElementById("container")!, {
25+
const editor = monaco.editor.create(document.getElementById("container")!, {
2626
model: monaco.editor.createModel(value, 'json', monaco.Uri.parse('inmemory://model.json'))
2727
});
2828

@@ -40,7 +40,7 @@ listen({
4040
}
4141
});
4242

43-
const services = createMonacoServices();
43+
const services = createMonacoServices(editor);
4444
function createLanguageClient(connection: MessageConnection): BaseLanguageClient {
4545
return new BaseLanguageClient({
4646
name: "Sample Language Client",

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
* ------------------------------------------------------------------------------------------ */
55
export * from './disposable';
6+
export * from './commands';
67
export * from './console-window';
78
export * from './languages';
89
export * from './workspace';

src/services.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44
* ------------------------------------------------------------------------------------------ */
55
import { BaseLanguageClient } from "vscode-base-languageclient/lib/base";
66
import { MonacoToProtocolConverter, ProtocolToMonacoConverter } from "./converter";
7+
import { MonacoCommands } from './commands';
78
import { MonacoLanguages } from "./languages";
89
import { MonacoWorkspace } from "./workspace";
910
import { ConsoleWindow } from "./console-window";
1011

11-
export function createMonacoServices(): BaseLanguageClient.IServices {
12+
export function createMonacoServices(editor: monaco.editor.IStandaloneCodeEditor): BaseLanguageClient.IServices {
1213
const m2p = new MonacoToProtocolConverter();
1314
const p2m = new ProtocolToMonacoConverter();
1415
return {
16+
commands: new MonacoCommands(editor),
1517
languages: new MonacoLanguages(p2m, m2p),
16-
workspace: new MonacoWorkspace(m2p),
17-
window: new ConsoleWindow()
18+
workspace: new MonacoWorkspace(p2m, m2p),
19+
window: new ConsoleWindow(),
1820
}
1921
}

src/workspace.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
* Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io). All rights reserved.
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
* ------------------------------------------------------------------------------------------ */
5-
import { MonacoToProtocolConverter } from './converter';
5+
import { MonacoToProtocolConverter, ProtocolToMonacoConverter } from './converter';
66
import { Workspace, TextDocumentDidChangeEvent, TextDocument, Event, Emitter } from "vscode-base-languageclient/lib/services";
7+
import { WorkspaceEdit, TextEdit } from 'vscode-base-languageclient/lib/base';
78
import IModel = monaco.editor.IModel;
89

910
export class MonacoWorkspace implements Workspace {
@@ -15,8 +16,7 @@ export class MonacoWorkspace implements Workspace {
1516
protected readonly onDidCloseTextDocumentEmitter = new Emitter<TextDocument>();
1617
protected readonly onDidChangeTextDocumentEmitter = new Emitter<TextDocumentDidChangeEvent>();
1718

18-
constructor(
19-
protected readonly m2p: MonacoToProtocolConverter) {
19+
constructor(protected readonly p2m: ProtocolToMonacoConverter, protected readonly m2p: MonacoToProtocolConverter) {
2020
for (const model of monaco.editor.getModels()) {
2121
this.addModel(model);
2222
}
@@ -83,4 +83,36 @@ export class MonacoWorkspace implements Workspace {
8383
return this.onDidChangeTextDocumentEmitter.event;
8484
}
8585

86+
public applyEdit(workspaceEdit: WorkspaceEdit): Thenable<boolean> {
87+
let applied = true;
88+
if (workspaceEdit.documentChanges) {
89+
for (const change of workspaceEdit.documentChanges) {
90+
if (change.textDocument.version && change.textDocument.version >= 0) {
91+
const textDocument = this.documents.get(change.textDocument.uri);
92+
if (textDocument && textDocument.version === change.textDocument.version) {
93+
monaco.editor.getModel(monaco.Uri.parse(textDocument.uri)).pushEditOperations(
94+
[], // Do not try and preserve editor selections.
95+
change.edits.map((edit: TextEdit) => {
96+
return {
97+
identifier: {major: 1, minor: 0},
98+
range: this.p2m.asRange(edit.range),
99+
text: edit.newText,
100+
forceMoveMarkers: true,
101+
};
102+
}),
103+
() => [], // Do not try and preserve editor selections.
104+
);
105+
} else {
106+
applied = false;
107+
}
108+
} else {
109+
applied = false;
110+
}
111+
}
112+
} else {
113+
applied = false;
114+
}
115+
return Promise.resolve(applied);
116+
}
117+
86118
}

0 commit comments

Comments
 (0)