Path: blob/main/src/vs/workbench/api/common/extHostCodeMapper.ts
3296 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/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';1314export class ExtHostCodeMapper implements extHostProtocol.ExtHostCodeMapperShape {1516private static _providerHandlePool: number = 0;17private readonly _proxy: extHostProtocol.MainThreadCodeMapperShape;18private readonly providers = new Map<number, vscode.MappedEditsProvider2>();1920constructor(21mainContext: extHostProtocol.IMainContext22) {23this._proxy = mainContext.getProxy(extHostProtocol.MainContext.MainThreadCodeMapper);24}2526async $mapCode(handle: number, internalRequest: extHostProtocol.ICodeMapperRequestDto, token: CancellationToken): Promise<ICodeMapperResult | null> {27// Received request to map code from the main thread28const provider = this.providers.get(handle);29if (!provider) {30throw new Error(`Received request to map code for unknown provider handle ${handle}`);31}3233// Construct a response object to pass to the provider34const stream: vscode.MappedEditsResponseStream = {35textEdit: (target: vscode.Uri, edits: vscode.TextEdit | vscode.TextEdit[]) => {36edits = asArray(edits);37this._proxy.$handleProgress(internalRequest.requestId, {38uri: target,39edits: edits.map(TextEdit.from)40});41},42notebookEdit: (target: vscode.Uri, edits: vscode.NotebookEdit | vscode.NotebookEdit[]) => {43edits = asArray(edits);44this._proxy.$handleProgress(internalRequest.requestId, {45uri: target,46edits: edits.map(NotebookEdit.from)47});48}49};5051const request: vscode.MappedEditsRequest = {52location: internalRequest.location,53chatRequestId: internalRequest.chatRequestId,54chatRequestModel: internalRequest.chatRequestModel,55chatSessionId: internalRequest.chatSessionId,56codeBlocks: internalRequest.codeBlocks.map(block => {57return {58code: block.code,59resource: URI.revive(block.resource),60markdownBeforeBlock: block.markdownBeforeBlock61};62})63};6465const result = await provider.provideMappedEdits(request, stream, token);66return result ?? null;67}6869registerMappedEditsProvider(extension: IExtensionDescription, provider: vscode.MappedEditsProvider2): vscode.Disposable {70const handle = ExtHostCodeMapper._providerHandlePool++;71this._proxy.$registerCodeMapperProvider(handle, extension.displayName ?? extension.name);72this.providers.set(handle, provider);73return {74dispose: () => {75return this._proxy.$unregisterCodeMapperProvider(handle);76}77};78}79}808182