Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/editSurvivalTrackerService.ts
13401 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 { createDecorator as createServiceIdentifier, IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';7import { ILogService } from '../../log/common/logService';8import { EditCollector } from './editCollector';9import { EditComputer } from './editComputer';10import { EditSurvivalReporter, EditSurvivalResult } from './editSurvivalReporter';1112export const IEditSurvivalTrackerService = createServiceIdentifier<IEditSurvivalTrackerService>('IEditSurvivalTrackerService');1314export interface IEditSurvivalTrackingSession {15collectAIEdits(textEdit: vscode.TextEdit | vscode.TextEdit[]): void;16startReporter(sendTelemetryEvent: (res: EditSurvivalResult) => void): void;17cancel(): void;18}1920export interface IEditSurvivalTrackerService {21readonly _serviceBrand: undefined;22initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession;23}2425export class NullEditSurvivalTrackingSession implements IEditSurvivalTrackingSession {26collectAIEdits() { }27startReporter() { }28cancel() { }29}3031export class NullEditSurvivalTrackerService implements IEditSurvivalTrackerService {32readonly _serviceBrand: undefined;3334initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession {35return new NullEditSurvivalTrackingSession();36}37}3839export class EditSurvivalTrackerService implements IEditSurvivalTrackerService {40readonly _serviceBrand: undefined;4142constructor(43@IInstantiationService private readonly _instantiationService: IInstantiationService,44@ILogService private readonly _logService: ILogService45) {46}4748initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession {49const editCollector = this._instantiationService.createInstance(EditCollector, document.getText());50let reporter: EditSurvivalReporter | undefined;51return {52collectAIEdits: (edits: vscode.TextEdit | vscode.TextEdit[]) => {53try {54editCollector.addEdits(Array.isArray(edits) ? edits : [edits]);55} catch (error) {56this._logService.error('[EditSurvivalTrackerService] Error while collecting edits', error);57}58},59startReporter: (sendTelemetryEvent: (res: EditSurvivalResult) => void) => {60const userEditComputer = this._instantiationService.createInstance(EditComputer, editCollector.getText(), document);61(async () => {62try {63const [aiEdits, userEditsResult] = await Promise.all([editCollector.getEdits(), userEditComputer.compute()]);64const userEdits = userEditsResult.getEditsSinceInitial();65reporter = this._instantiationService.createInstance(EditSurvivalReporter, document, editCollector.initialText, aiEdits, userEdits, {}, sendTelemetryEvent);66} finally {67userEditComputer.dispose();68}69})();70},71cancel: () => {72reporter?.cancel();73}74};75}76}777879