Path: blob/main/src/vs/workbench/contrib/editTelemetry/common/arcTracker.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 { sumBy } from '../../../../base/common/arrays.js';6import { LineEdit } from '../../../../editor/common/core/edits/lineEdit.js';7import { AnnotatedStringEdit, BaseStringEdit, IEditData } from '../../../../editor/common/core/edits/stringEdit.js';8import { AbstractText } from '../../../../editor/common/core/text/abstractText.js';910/**11* The ARC (accepted and retained characters) counts how many characters inserted by the initial suggestion (trackedEdit)12* stay unmodified after a certain amount of time after acceptance.13*/14export class ArcTracker {15private _updatedTrackedEdit: AnnotatedStringEdit<IsTrackedEditData>;16private _trackedEdit: BaseStringEdit;1718constructor(19private readonly _valueBeforeTrackedEdit: AbstractText,20trackedEdit: BaseStringEdit,21) {22this._trackedEdit = trackedEdit.removeCommonSuffixPrefix(_valueBeforeTrackedEdit.getValue());23this._updatedTrackedEdit = this._trackedEdit.mapData(() => new IsTrackedEditData(true));24}2526getOriginalCharacterCount(): number {27return sumBy(this._trackedEdit.replacements, e => e.getNewLength());28}2930/**31* edit must apply to _updatedTrackedEdit.apply(_valueBeforeTrackedEdit)32*/33handleEdits(edit: BaseStringEdit): void {34const e = edit.mapData(_d => new IsTrackedEditData(false));35const composedEdit = this._updatedTrackedEdit.compose(e); // (still) applies to _valueBeforeTrackedEdit3637// TODO@hediet improve memory by using:38// composedEdit = const onlyTrackedEdit = composedEdit.decomposeSplit(e => !e.data.isTrackedEdit).e2;3940this._updatedTrackedEdit = composedEdit;41}4243getAcceptedRestrainedCharactersCount(): number {44const s = sumBy(this._updatedTrackedEdit.replacements, e => e.data.isTrackedEdit ? e.getNewLength() : 0);45return s;46}4748getDebugState(): unknown {49return {50edits: this._updatedTrackedEdit.replacements.map(e => ({51range: e.replaceRange.toString(),52newText: e.newText,53isTrackedEdit: e.data.isTrackedEdit,54}))55};56}5758public getLineCountInfo(): { deletedLineCounts: number; insertedLineCounts: number } {59const e = this._updatedTrackedEdit.toStringEdit(r => r.data.isTrackedEdit);60const le = LineEdit.fromStringEdit(e, this._valueBeforeTrackedEdit);61const deletedLineCount = sumBy(le.replacements, r => r.lineRange.length);62const insertedLineCount = sumBy(le.getNewLineRanges(), r => r.length);63return {64deletedLineCounts: deletedLineCount,65insertedLineCounts: insertedLineCount,66};67}68}6970export class IsTrackedEditData implements IEditData<IsTrackedEditData> {71constructor(72public readonly isTrackedEdit: boolean73) { }7475join(data: IsTrackedEditData): IsTrackedEditData | undefined {76if (this.isTrackedEdit !== data.isTrackedEdit) {77return undefined;78}79return this;80}81}828384