-
Notifications
You must be signed in to change notification settings - Fork 28k
/
extHostMappedEdits.ts
61 lines (52 loc) · 2.54 KB
/
extHostMappedEdits.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { CancellationToken } from 'vs/base/common/cancellation';
import { URI, UriComponents } from 'vs/base/common/uri';
import { IURITransformer } from 'vs/base/common/uriIpc';
import { ExtHostMappedEditsShape, IMainContext, IMappedEditsContextDto, IWorkspaceEditDto, MainContext, MainThreadMappedEditsShape } from 'vs/workbench/api/common/extHost.protocol';
import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
import { Range, Selection, DocumentSelector, WorkspaceEdit } from 'vs/workbench/api/common/extHostTypeConverters';
import type * as vscode from 'vscode';
export class ExtHostMappedEdits implements ExtHostMappedEditsShape {
private static handlePool: number = 0;
private proxy: MainThreadMappedEditsShape;
private providers = new Map<number, vscode.MappedEditsProvider>();
constructor(
mainContext: IMainContext,
private readonly _documents: ExtHostDocuments,
private readonly uriTransformer: IURITransformer | undefined
) {
this.proxy = mainContext.getProxy(MainContext.MainThreadMappedEdits);
}
async $provideMappedEdits(handle: number, docUri: UriComponents, codeBlocks: string[], context: IMappedEditsContextDto, token: CancellationToken): Promise<IWorkspaceEditDto | null> {
const provider = this.providers.get(handle);
if (!provider) {
return null;
}
const uri = URI.revive(docUri);
const doc = this._documents.getDocument(uri);
const ctx = {
selections: context.selections.map(s => Selection.to(s)),
related: context.related.map(r => ({ uri: URI.revive(r.uri), range: Range.to(r.range) })),
};
const mappedEdits = await provider.provideMappedEdits(doc, codeBlocks, ctx, token);
if (!mappedEdits) {
return null;
}
return WorkspaceEdit.from(mappedEdits);
}
registerMappedEditsProvider(selector: vscode.DocumentSelector, provider: vscode.MappedEditsProvider): vscode.Disposable {
const handle = ExtHostMappedEdits.handlePool++;
this.providers.set(handle, provider);
this.proxy.$registerMappedEditsProvider(handle, DocumentSelector.from(selector, this.uriTransformer));
return {
dispose: () => {
ExtHostMappedEdits.handlePool--;
this.proxy.$unregisterMappedEditsProvider(handle);
this.providers.delete(handle);
}
};
}
}