Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/editSurvivalTrackerService.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 type * as vscode from 'vscode';
7
import { createDecorator as createServiceIdentifier, IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';
8
import { ILogService } from '../../log/common/logService';
9
import { EditCollector } from './editCollector';
10
import { EditComputer } from './editComputer';
11
import { EditSurvivalReporter, EditSurvivalResult } from './editSurvivalReporter';
12
13
export const IEditSurvivalTrackerService = createServiceIdentifier<IEditSurvivalTrackerService>('IEditSurvivalTrackerService');
14
15
export interface IEditSurvivalTrackingSession {
16
collectAIEdits(textEdit: vscode.TextEdit | vscode.TextEdit[]): void;
17
startReporter(sendTelemetryEvent: (res: EditSurvivalResult) => void): void;
18
cancel(): void;
19
}
20
21
export interface IEditSurvivalTrackerService {
22
readonly _serviceBrand: undefined;
23
initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession;
24
}
25
26
export class NullEditSurvivalTrackingSession implements IEditSurvivalTrackingSession {
27
collectAIEdits() { }
28
startReporter() { }
29
cancel() { }
30
}
31
32
export class NullEditSurvivalTrackerService implements IEditSurvivalTrackerService {
33
readonly _serviceBrand: undefined;
34
35
initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession {
36
return new NullEditSurvivalTrackingSession();
37
}
38
}
39
40
export class EditSurvivalTrackerService implements IEditSurvivalTrackerService {
41
readonly _serviceBrand: undefined;
42
43
constructor(
44
@IInstantiationService private readonly _instantiationService: IInstantiationService,
45
@ILogService private readonly _logService: ILogService
46
) {
47
}
48
49
initialize(document: vscode.TextDocument): IEditSurvivalTrackingSession {
50
const editCollector = this._instantiationService.createInstance(EditCollector, document.getText());
51
let reporter: EditSurvivalReporter | undefined;
52
return {
53
collectAIEdits: (edits: vscode.TextEdit | vscode.TextEdit[]) => {
54
try {
55
editCollector.addEdits(Array.isArray(edits) ? edits : [edits]);
56
} catch (error) {
57
this._logService.error('[EditSurvivalTrackerService] Error while collecting edits', error);
58
}
59
},
60
startReporter: (sendTelemetryEvent: (res: EditSurvivalResult) => void) => {
61
const userEditComputer = this._instantiationService.createInstance(EditComputer, editCollector.getText(), document);
62
(async () => {
63
try {
64
const [aiEdits, userEditsResult] = await Promise.all([editCollector.getEdits(), userEditComputer.compute()]);
65
const userEdits = userEditsResult.getEditsSinceInitial();
66
reporter = this._instantiationService.createInstance(EditSurvivalReporter, document, editCollector.initialText, aiEdits, userEdits, {}, sendTelemetryEvent);
67
} finally {
68
userEditComputer.dispose();
69
}
70
})();
71
},
72
cancel: () => {
73
reporter?.cancel();
74
}
75
};
76
}
77
}
78
79