Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/arcTracker.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { AnnotatedStringEdit, BaseStringEdit, IEditData } from '../../../util/vs/editor/common/core/edits/stringEdit';
7
import { sum } from '../../inlineEdits/common/workspaceEditTracker/nesHistoryContextProvider';
8
9
/**
10
* The ARC (accepted and retained characters) counts how many characters inserted by the initial suggestion (trackedEdit)
11
* stay unmodified after a certain amount of time after acceptance.
12
*/
13
export class ArcTracker {
14
private _updatedTrackedEdit: AnnotatedStringEdit<IsTrackedEditData>;
15
16
constructor(
17
public readonly originalText: string,
18
private readonly _trackedEdit: BaseStringEdit,
19
) {
20
const eNormalized = _trackedEdit.removeCommonSuffixPrefix(originalText);
21
this._updatedTrackedEdit = eNormalized.mapData(() => new IsTrackedEditData(true));
22
}
23
24
handleEdits(edit: BaseStringEdit): void {
25
const e = edit.mapData(_d => new IsTrackedEditData(false));
26
const composedEdit = this._updatedTrackedEdit.compose(e);
27
const onlyTrackedEdit = composedEdit.decomposeSplit(e => !e.data.isTrackedEdit).e2;
28
this._updatedTrackedEdit = onlyTrackedEdit;
29
}
30
31
getAcceptedRestrainedCharactersCount(): number {
32
const s = sum(this._updatedTrackedEdit.replacements, e => e.getNewLength());
33
return s;
34
}
35
36
getOriginalCharacterCount(): number {
37
return sum(this._trackedEdit.replacements, e => e.getNewLength());
38
}
39
40
getDebugState(): unknown {
41
return {
42
edits: this._updatedTrackedEdit.replacements.map(e => ({
43
range: e.replaceRange.toString(),
44
newText: e.newText,
45
isTrackedEdit: e.data.isTrackedEdit,
46
}))
47
};
48
}
49
}
50
51
export class IsTrackedEditData implements IEditData<IsTrackedEditData> {
52
constructor(
53
public readonly isTrackedEdit: boolean
54
) { }
55
56
join(data: IsTrackedEditData): IsTrackedEditData | undefined {
57
if (this.isTrackedEdit !== data.isTrackedEdit) {
58
return undefined;
59
}
60
return this;
61
}
62
}
63
64