Path: blob/main/extensions/copilot/src/extension/prompts/node/inline/summarizedDocument/projectedText.ts
13406 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 { PositionOffsetTransformer } from '../../../../../platform/editing/common/positionOffsetTransformer';7import { Lazy } from '../../../../../util/vs/base/common/lazy';8import { StringEdit } from '../../../../../util/vs/editor/common/core/edits/stringEdit';9import { OffsetRange } from '../../../../../util/vs/editor/common/core/ranges/offsetRange';10import { Range } from '../../../../../vscodeTypes';1112export class ProjectedText {13constructor(14public readonly originalText: string,15public readonly edits: StringEdit,16) { }1718private readonly _positionOffsetTransformer = new Lazy(() => new PositionOffsetTransformer(this.text));19private readonly _originalPositionOffsetTransformer = new Lazy(() => new PositionOffsetTransformer(this.originalText));20public get positionOffsetTransformer(): PositionOffsetTransformer { return this._positionOffsetTransformer.value; }21public get originalPositionOffsetTransformer(): PositionOffsetTransformer { return this._originalPositionOffsetTransformer.value; }2223private readonly _text = new Lazy(() => this.edits.apply(this.originalText));24public get text(): string { return this._text.value; }2526public get lineCount(): number { return this.positionOffsetTransformer.getLineCount(); }2728public get isOriginal(): boolean { return this.edits.isEmpty() || this.edits.isNeutralOn(this.originalText); }2930public project(originalOffset: number): number {31return this.edits.applyToOffset(originalOffset);32}3334public projectOffsetRange(originalRange: OffsetRange): OffsetRange {35return this.edits.applyToOffsetRange(originalRange);36}3738public projectRange(originalRange: Range): Range {39const offsetRange = this.originalPositionOffsetTransformer.toOffsetRange(originalRange);40const projectedRange = this.projectOffsetRange(offsetRange);41return this.positionOffsetTransformer.toRange(projectedRange);42}4344public projectOffsetEdit(edit: StringEdit): StringEdit {45return edit.rebaseSkipConflicting(this.edits);46}4748public tryRebase(originalEdit: StringEdit): { edit: StringEdit; text: ProjectedText } | undefined {49const edit = originalEdit.tryRebase(this.edits);50if (!edit) {51return undefined;52}53const newEdits = this.edits.tryRebase(originalEdit);54if (!newEdits) {55return undefined;56}57return {58edit,59text: new ProjectedText(originalEdit.apply(this.originalText), newEdits),60};61}6263public projectBack(projectedOffset: number): number {64return this.edits.applyInverseToOffset(projectedOffset);65}6667public projectBackOffsetEdit(edit: StringEdit): StringEdit {68return edit.rebaseSkipConflicting(this.edits.inverse(this.originalText));69}7071public projectBackTextEdit(edits: readonly vscode.TextEdit[]): vscode.TextEdit[] {72const offsetEdit = this.positionOffsetTransformer.toOffsetEdit(edits);73const back = this.projectBackOffsetEdit(offsetEdit);74return this.originalPositionOffsetTransformer.toTextEdits(back);75}76}777879