Path: blob/main/extensions/copilot/src/platform/editSurvivalTracking/common/editComputer.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 type * as vscode from 'vscode';6import { BugIndicatingError } from '../../../util/vs/base/common/errors';7import { Disposable } from '../../../util/vs/base/common/lifecycle';8import { StringEdit } from '../../../util/vs/editor/common/core/edits/stringEdit';9import { IDiffService } from '../../diff/common/diffService';10import { stringEditFromDiff, stringEditFromTextContentChange } from '../../editing/common/edit';11import { IWorkspaceService } from '../../workspace/common/workspaceService';1213export class EditComputer extends Disposable {14private readonly _baseDocumentText = this._document.getText();15/**16* ```17* _baseText18* ----diffEdits---->19* _baseDocumentText20* ----_editsOnTop---->21* _document.getText()22* ```23*/24private _editsOnTop: StringEdit = StringEdit.empty;2526constructor(27private readonly _baseText: string,28private readonly _document: vscode.TextDocument,29@IWorkspaceService private readonly _workspaceService: IWorkspaceService,30@IDiffService private readonly _diffService: IDiffService,31) {32super();3334this._register(this._workspaceService.onDidChangeTextDocument(e => {35if (e.document.uri.toString() !== this._document.uri.toString()) {36return;37}38const edits = stringEditFromTextContentChange(e.contentChanges);39this._editsOnTop = this._editsOnTop.compose(edits);40}));41}4243async compute(): Promise<ISyncEditProvider> {44const diffEdits = await stringEditFromDiff(this._baseText, this._baseDocumentText, this._diffService);45return {46document: this._document,47baseText: this._baseText,48getEditsSinceInitial: () => {49if (this._store.isDisposed) {50throw new BugIndicatingError('EditComputer has been disposed');51}52return diffEdits.compose(this._editsOnTop);53}54};55}56}5758export interface ISyncEditProvider {59readonly baseText: string;60readonly document: vscode.TextDocument;61/**62* ```63* baseText ----getEditsSinceInitial()----> document.getText()64* ```65*/66getEditsSinceInitial(): StringEdit;67}6869export class DocumentEditRecorder extends Disposable {70private _edits: StringEdit = StringEdit.empty;7172public readonly initialTextVersion = this.textDocument.version;7374constructor(75public readonly textDocument: vscode.TextDocument,76@IWorkspaceService private readonly _workspaceService: IWorkspaceService,77) {78super();7980this._register(this._workspaceService.onDidChangeTextDocument(e => {81if (e.document.uri.toString() === this.textDocument.uri.toString()) {82const edits = stringEditFromTextContentChange(e.contentChanges);83this._edits = this._edits.compose(edits);84}85}));86}8788/**89* ```90* this.initialTextVersion91* ----this.getEdits()---->92* this.textDocument.version93* ```94*/95getEdits(): StringEdit {96if (this._store.isDisposed) {97throw new BugIndicatingError('DocumentEditRecorder has been disposed');98}99return this._edits;100}101}102103104