Path: blob/main/src/vs/workbench/api/common/extHostCodeMapper.ts
5221 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import type * as vscode from 'vscode';6import { CancellationToken } from '../../../base/common/cancellation.js';7import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';8import { ICodeMapperResult } from '../../contrib/chat/common/editing/chatCodeMapperService.js';9import * as extHostProtocol from './extHost.protocol.js';10import { NotebookEdit, TextEdit } from './extHostTypeConverters.js';11import { URI } from '../../../base/common/uri.js';12import { asArray } from '../../../base/common/arrays.js';13import { LocalChatSessionUri } from '../../contrib/chat/common/model/chatUri.js';1415export class ExtHostCodeMapper implements extHostProtocol.ExtHostCodeMapperShape {1617private static _providerHandlePool: number = 0;18private readonly _proxy: extHostProtocol.MainThreadCodeMapperShape;19private readonly providers = new Map<number, vscode.MappedEditsProvider2>();2021constructor(22mainContext: extHostProtocol.IMainContext23) {24this._proxy = mainContext.getProxy(extHostProtocol.MainContext.MainThreadCodeMapper);25}2627async $mapCode(handle: number, internalRequest: extHostProtocol.ICodeMapperRequestDto, token: CancellationToken): Promise<ICodeMapperResult | null> {28// Received request to map code from the main thread29const provider = this.providers.get(handle);30if (!provider) {31throw new Error(`Received request to map code for unknown provider handle ${handle}`);32}3334// Construct a response object to pass to the provider35const stream: vscode.MappedEditsResponseStream = {36textEdit: (target: vscode.Uri, edits: vscode.TextEdit | vscode.TextEdit[]) => {37edits = asArray(edits);38this._proxy.$handleProgress(internalRequest.requestId, {39uri: target,40edits: edits.map(TextEdit.from)41});42},43notebookEdit: (target: vscode.Uri, edits: vscode.NotebookEdit | vscode.NotebookEdit[]) => {44edits = asArray(edits);45this._proxy.$handleProgress(internalRequest.requestId, {46uri: target,47edits: edits.map(NotebookEdit.from)48});49}50};5152const request: vscode.MappedEditsRequest = {53location: internalRequest.location,54chatRequestId: internalRequest.chatRequestId,55chatRequestModel: internalRequest.chatRequestModel,56chatSessionId: internalRequest.chatSessionResource ? LocalChatSessionUri.parseLocalSessionId(URI.revive(internalRequest.chatSessionResource)) : undefined,57codeBlocks: internalRequest.codeBlocks.map(block => {58return {59code: block.code,60resource: URI.revive(block.resource),61markdownBeforeBlock: block.markdownBeforeBlock62};63})64};6566const result = await provider.provideMappedEdits(request, stream, token);67return result ?? null;68}6970registerMappedEditsProvider(extension: IExtensionDescription, provider: vscode.MappedEditsProvider2): vscode.Disposable {71const handle = ExtHostCodeMapper._providerHandlePool++;72this._proxy.$registerCodeMapperProvider(handle, extension.displayName ?? extension.name);73this.providers.set(handle, provider);74return {75dispose: () => {76return this._proxy.$unregisterCodeMapperProvider(handle);77}78};79}80}818283