diff --git a/extensions/markdown-language-features/src/client/client.ts b/extensions/markdown-language-features/src/client/client.ts index 55b0948ddd4f9..0939d78f62a6c 100644 --- a/extensions/markdown-language-features/src/client/client.ts +++ b/extensions/markdown-language-features/src/client/client.ts @@ -60,7 +60,7 @@ export class MdLanguageClient implements IDisposable { return this.#client.sendRequest(proto.getUpdatePastedLinksEdit, { metadata, pasteIntoDoc: pastingIntoDoc.toString(), - edits: edits.map(edit => lsp.TextEdit.replace(toLspRange(edit.range), edit.newText)), + edits: edits.map(proto.serializeTextEdit), }, token); } } diff --git a/extensions/markdown-language-features/src/client/protocol.ts b/extensions/markdown-language-features/src/client/protocol.ts index a822327f9ffb4..db004edc8ecff 100644 --- a/extensions/markdown-language-features/src/client/protocol.ts +++ b/extensions/markdown-language-features/src/client/protocol.ts @@ -32,7 +32,23 @@ export const getReferencesToFileInWorkspace = new RequestType<{ uri: string }, l export const getEditForFileRenames = new RequestType, { participatingRenames: readonly FileRename[]; edit: lsp.WorkspaceEdit }, any>('markdown/getEditForFileRenames'); export const prepareUpdatePastedLinks = new RequestType<{ uri: string; ranges: lsp.Range[] }, string, any>('markdown/prepareUpdatePastedLinks'); -export const getUpdatePastedLinksEdit = new RequestType<{ pasteIntoDoc: string; metadata: string; edits: lsp.TextEdit[] }, lsp.TextEdit[] | undefined, any>('markdown/getUpdatePastedLinksEdit'); +/** Text edit wire format expected by vscode-markdown-languageserver. */ +export type SerializedTextEdit = { + readonly range: readonly [lsp.Position, lsp.Position]; + readonly newText: string; +}; + +export function serializeTextEdit(edit: vscode.TextEdit): SerializedTextEdit { + return { + range: [ + { line: edit.range.start.line, character: edit.range.start.character }, + { line: edit.range.end.line, character: edit.range.end.character }, + ], + newText: edit.newText, + }; +} + +export const getUpdatePastedLinksEdit = new RequestType<{ pasteIntoDoc: string; metadata: string; edits: SerializedTextEdit[] }, lsp.TextEdit[] | undefined, any>('markdown/getUpdatePastedLinksEdit'); export const fs_watcher_onChange = new RequestType<{ id: number; uri: string; kind: 'create' | 'change' | 'delete' }, void, any>('markdown/fs/watcher/onChange'); diff --git a/extensions/markdown-language-features/src/test/protocol.test.ts b/extensions/markdown-language-features/src/test/protocol.test.ts new file mode 100644 index 0000000000000..1d7930c8ebdfc --- /dev/null +++ b/extensions/markdown-language-features/src/test/protocol.test.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import 'mocha'; +import * as vscode from 'vscode'; +import { serializeTextEdit } from '../client/protocol'; + +suite('Markdown protocol', () => { + test('serializes text edits using the server range format', () => { + const edit = new vscode.TextEdit(new vscode.Range(1, 2, 3, 4), 'new text'); + + assert.deepStrictEqual(serializeTextEdit(edit), { + range: [ + { line: 1, character: 2 }, + { line: 3, character: 4 }, + ], + newText: 'new text', + }); + }); +});