Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/editComputer.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 { BugIndicatingError } from '../../../util/vs/base/common/errors';
8
import { Disposable } from '../../../util/vs/base/common/lifecycle';
9
import { StringEdit } from '../../../util/vs/editor/common/core/edits/stringEdit';
10
import { IDiffService } from '../../diff/common/diffService';
11
import { stringEditFromDiff, stringEditFromTextContentChange } from '../../editing/common/edit';
12
import { IWorkspaceService } from '../../workspace/common/workspaceService';
13
14
export class EditComputer extends Disposable {
15
private readonly _baseDocumentText = this._document.getText();
16
/**
17
* ```
18
* _baseText
19
* ----diffEdits---->
20
* _baseDocumentText
21
* ----_editsOnTop---->
22
* _document.getText()
23
* ```
24
*/
25
private _editsOnTop: StringEdit = StringEdit.empty;
26
27
constructor(
28
private readonly _baseText: string,
29
private readonly _document: vscode.TextDocument,
30
@IWorkspaceService private readonly _workspaceService: IWorkspaceService,
31
@IDiffService private readonly _diffService: IDiffService,
32
) {
33
super();
34
35
this._register(this._workspaceService.onDidChangeTextDocument(e => {
36
if (e.document.uri.toString() !== this._document.uri.toString()) {
37
return;
38
}
39
const edits = stringEditFromTextContentChange(e.contentChanges);
40
this._editsOnTop = this._editsOnTop.compose(edits);
41
}));
42
}
43
44
async compute(): Promise<ISyncEditProvider> {
45
const diffEdits = await stringEditFromDiff(this._baseText, this._baseDocumentText, this._diffService);
46
return {
47
document: this._document,
48
baseText: this._baseText,
49
getEditsSinceInitial: () => {
50
if (this._store.isDisposed) {
51
throw new BugIndicatingError('EditComputer has been disposed');
52
}
53
return diffEdits.compose(this._editsOnTop);
54
}
55
};
56
}
57
}
58
59
export interface ISyncEditProvider {
60
readonly baseText: string;
61
readonly document: vscode.TextDocument;
62
/**
63
* ```
64
* baseText ----getEditsSinceInitial()----> document.getText()
65
* ```
66
*/
67
getEditsSinceInitial(): StringEdit;
68
}
69
70
export class DocumentEditRecorder extends Disposable {
71
private _edits: StringEdit = StringEdit.empty;
72
73
public readonly initialTextVersion = this.textDocument.version;
74
75
constructor(
76
public readonly textDocument: vscode.TextDocument,
77
@IWorkspaceService private readonly _workspaceService: IWorkspaceService,
78
) {
79
super();
80
81
this._register(this._workspaceService.onDidChangeTextDocument(e => {
82
if (e.document.uri.toString() === this.textDocument.uri.toString()) {
83
const edits = stringEditFromTextContentChange(e.contentChanges);
84
this._edits = this._edits.compose(edits);
85
}
86
}));
87
}
88
89
/**
90
* ```
91
* this.initialTextVersion
92
* ----this.getEdits()---->
93
* this.textDocument.version
94
* ```
95
*/
96
getEdits(): StringEdit {
97
if (this._store.isDisposed) {
98
throw new BugIndicatingError('DocumentEditRecorder has been disposed');
99
}
100
return this._edits;
101
}
102
}
103
104