Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/common/extHostCodeMapper.ts
5221 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/editing/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
import { LocalChatSessionUri } from '../../contrib/chat/common/model/chatUri.js';
15
16
export class ExtHostCodeMapper implements extHostProtocol.ExtHostCodeMapperShape {
17
18
private static _providerHandlePool: number = 0;
19
private readonly _proxy: extHostProtocol.MainThreadCodeMapperShape;
20
private readonly providers = new Map<number, vscode.MappedEditsProvider2>();
21
22
constructor(
23
mainContext: extHostProtocol.IMainContext
24
) {
25
this._proxy = mainContext.getProxy(extHostProtocol.MainContext.MainThreadCodeMapper);
26
}
27
28
async $mapCode(handle: number, internalRequest: extHostProtocol.ICodeMapperRequestDto, token: CancellationToken): Promise<ICodeMapperResult | null> {
29
// Received request to map code from the main thread
30
const provider = this.providers.get(handle);
31
if (!provider) {
32
throw new Error(`Received request to map code for unknown provider handle ${handle}`);
33
}
34
35
// Construct a response object to pass to the provider
36
const stream: vscode.MappedEditsResponseStream = {
37
textEdit: (target: vscode.Uri, edits: vscode.TextEdit | vscode.TextEdit[]) => {
38
edits = asArray(edits);
39
this._proxy.$handleProgress(internalRequest.requestId, {
40
uri: target,
41
edits: edits.map(TextEdit.from)
42
});
43
},
44
notebookEdit: (target: vscode.Uri, edits: vscode.NotebookEdit | vscode.NotebookEdit[]) => {
45
edits = asArray(edits);
46
this._proxy.$handleProgress(internalRequest.requestId, {
47
uri: target,
48
edits: edits.map(NotebookEdit.from)
49
});
50
}
51
};
52
53
const request: vscode.MappedEditsRequest = {
54
location: internalRequest.location,
55
chatRequestId: internalRequest.chatRequestId,
56
chatRequestModel: internalRequest.chatRequestModel,
57
chatSessionId: internalRequest.chatSessionResource ? LocalChatSessionUri.parseLocalSessionId(URI.revive(internalRequest.chatSessionResource)) : undefined,
58
codeBlocks: internalRequest.codeBlocks.map(block => {
59
return {
60
code: block.code,
61
resource: URI.revive(block.resource),
62
markdownBeforeBlock: block.markdownBeforeBlock
63
};
64
})
65
};
66
67
const result = await provider.provideMappedEdits(request, stream, token);
68
return result ?? null;
69
}
70
71
registerMappedEditsProvider(extension: IExtensionDescription, provider: vscode.MappedEditsProvider2): vscode.Disposable {
72
const handle = ExtHostCodeMapper._providerHandlePool++;
73
this._proxy.$registerCodeMapperProvider(handle, extension.displayName ?? extension.name);
74
this.providers.set(handle, provider);
75
return {
76
dispose: () => {
77
return this._proxy.$unregisterCodeMapperProvider(handle);
78
}
79
};
80
}
81
}
82
83