Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/arcTracker.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 { AnnotatedStringEdit, BaseStringEdit, IEditData } from '../../../util/vs/editor/common/core/edits/stringEdit';6import { sum } from '../../inlineEdits/common/workspaceEditTracker/nesHistoryContextProvider';78/**9* The ARC (accepted and retained characters) counts how many characters inserted by the initial suggestion (trackedEdit)10* stay unmodified after a certain amount of time after acceptance.11*/12export class ArcTracker {13private _updatedTrackedEdit: AnnotatedStringEdit<IsTrackedEditData>;1415constructor(16public readonly originalText: string,17private readonly _trackedEdit: BaseStringEdit,18) {19const eNormalized = _trackedEdit.removeCommonSuffixPrefix(originalText);20this._updatedTrackedEdit = eNormalized.mapData(() => new IsTrackedEditData(true));21}2223handleEdits(edit: BaseStringEdit): void {24const e = edit.mapData(_d => new IsTrackedEditData(false));25const composedEdit = this._updatedTrackedEdit.compose(e);26const onlyTrackedEdit = composedEdit.decomposeSplit(e => !e.data.isTrackedEdit).e2;27this._updatedTrackedEdit = onlyTrackedEdit;28}2930getAcceptedRestrainedCharactersCount(): number {31const s = sum(this._updatedTrackedEdit.replacements, e => e.getNewLength());32return s;33}3435getOriginalCharacterCount(): number {36return sum(this._trackedEdit.replacements, e => e.getNewLength());37}3839getDebugState(): unknown {40return {41edits: this._updatedTrackedEdit.replacements.map(e => ({42range: e.replaceRange.toString(),43newText: e.newText,44isTrackedEdit: e.data.isTrackedEdit,45}))46};47}48}4950export class IsTrackedEditData implements IEditData<IsTrackedEditData> {51constructor(52public readonly isTrackedEdit: boolean53) { }5455join(data: IsTrackedEditData): IsTrackedEditData | undefined {56if (this.isTrackedEdit !== data.isTrackedEdit) {57return undefined;58}59return this;60}61}626364