Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/common/extHostCodeMapper.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import type * as vscode from 'vscode';
7
import { CancellationToken } from '../../../base/common/cancellation.js';
8
import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
9
import { ICodeMapperResult } from '../../contrib/chat/common/chatCodeMapperService.js';
10
import * as extHostProtocol from './extHost.protocol.js';
11
import { NotebookEdit, TextEdit } from './extHostTypeConverters.js';
12
import { URI } from '../../../base/common/uri.js';
13
import { asArray } from '../../../base/common/arrays.js';
14
15
export class ExtHostCodeMapper implements extHostProtocol.ExtHostCodeMapperShape {
16
17
private static _providerHandlePool: number = 0;
18
private readonly _proxy: extHostProtocol.MainThreadCodeMapperShape;
19
private readonly providers = new Map<number, vscode.MappedEditsProvider2>();
20
21
constructor(
22
mainContext: extHostProtocol.IMainContext
23
) {
24
this._proxy = mainContext.getProxy(extHostProtocol.MainContext.MainThreadCodeMapper);
25
}
26
27
async $mapCode(handle: number, internalRequest: extHostProtocol.ICodeMapperRequestDto, token: CancellationToken): Promise<ICodeMapperResult | null> {
28
// Received request to map code from the main thread
29
const provider = this.providers.get(handle);
30
if (!provider) {
31
throw new Error(`Received request to map code for unknown provider handle ${handle}`);
32
}
33
34
// Construct a response object to pass to the provider
35
const stream: vscode.MappedEditsResponseStream = {
36
textEdit: (target: vscode.Uri, edits: vscode.TextEdit | vscode.TextEdit[]) => {
37
edits = asArray(edits);
38
this._proxy.$handleProgress(internalRequest.requestId, {
39
uri: target,
40
edits: edits.map(TextEdit.from)
41
});
42
},
43
notebookEdit: (target: vscode.Uri, edits: vscode.NotebookEdit | vscode.NotebookEdit[]) => {
44
edits = asArray(edits);
45
this._proxy.$handleProgress(internalRequest.requestId, {
46
uri: target,
47
edits: edits.map(NotebookEdit.from)
48
});
49
}
50
};
51
52
const request: vscode.MappedEditsRequest = {
53
location: internalRequest.location,
54
chatRequestId: internalRequest.chatRequestId,
55
chatRequestModel: internalRequest.chatRequestModel,
56
chatSessionId: internalRequest.chatSessionId,
57
codeBlocks: internalRequest.codeBlocks.map(block => {
58
return {
59
code: block.code,
60
resource: URI.revive(block.resource),
61
markdownBeforeBlock: block.markdownBeforeBlock
62
};
63
})
64
};
65
66
const result = await provider.provideMappedEdits(request, stream, token);
67
return result ?? null;
68
}
69
70
registerMappedEditsProvider(extension: IExtensionDescription, provider: vscode.MappedEditsProvider2): vscode.Disposable {
71
const handle = ExtHostCodeMapper._providerHandlePool++;
72
this._proxy.$registerCodeMapperProvider(handle, extension.displayName ?? extension.name);
73
this.providers.set(handle, provider);
74
return {
75
dispose: () => {
76
return this._proxy.$unregisterCodeMapperProvider(handle);
77
}
78
};
79
}
80
}
81
82