Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/prompts/node/inline/summarizedDocument/projectedText.ts
13406 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 { PositionOffsetTransformer } from '../../../../../platform/editing/common/positionOffsetTransformer';
8
import { Lazy } from '../../../../../util/vs/base/common/lazy';
9
import { StringEdit } from '../../../../../util/vs/editor/common/core/edits/stringEdit';
10
import { OffsetRange } from '../../../../../util/vs/editor/common/core/ranges/offsetRange';
11
import { Range } from '../../../../../vscodeTypes';
12
13
export class ProjectedText {
14
constructor(
15
public readonly originalText: string,
16
public readonly edits: StringEdit,
17
) { }
18
19
private readonly _positionOffsetTransformer = new Lazy(() => new PositionOffsetTransformer(this.text));
20
private readonly _originalPositionOffsetTransformer = new Lazy(() => new PositionOffsetTransformer(this.originalText));
21
public get positionOffsetTransformer(): PositionOffsetTransformer { return this._positionOffsetTransformer.value; }
22
public get originalPositionOffsetTransformer(): PositionOffsetTransformer { return this._originalPositionOffsetTransformer.value; }
23
24
private readonly _text = new Lazy(() => this.edits.apply(this.originalText));
25
public get text(): string { return this._text.value; }
26
27
public get lineCount(): number { return this.positionOffsetTransformer.getLineCount(); }
28
29
public get isOriginal(): boolean { return this.edits.isEmpty() || this.edits.isNeutralOn(this.originalText); }
30
31
public project(originalOffset: number): number {
32
return this.edits.applyToOffset(originalOffset);
33
}
34
35
public projectOffsetRange(originalRange: OffsetRange): OffsetRange {
36
return this.edits.applyToOffsetRange(originalRange);
37
}
38
39
public projectRange(originalRange: Range): Range {
40
const offsetRange = this.originalPositionOffsetTransformer.toOffsetRange(originalRange);
41
const projectedRange = this.projectOffsetRange(offsetRange);
42
return this.positionOffsetTransformer.toRange(projectedRange);
43
}
44
45
public projectOffsetEdit(edit: StringEdit): StringEdit {
46
return edit.rebaseSkipConflicting(this.edits);
47
}
48
49
public tryRebase(originalEdit: StringEdit): { edit: StringEdit; text: ProjectedText } | undefined {
50
const edit = originalEdit.tryRebase(this.edits);
51
if (!edit) {
52
return undefined;
53
}
54
const newEdits = this.edits.tryRebase(originalEdit);
55
if (!newEdits) {
56
return undefined;
57
}
58
return {
59
edit,
60
text: new ProjectedText(originalEdit.apply(this.originalText), newEdits),
61
};
62
}
63
64
public projectBack(projectedOffset: number): number {
65
return this.edits.applyInverseToOffset(projectedOffset);
66
}
67
68
public projectBackOffsetEdit(edit: StringEdit): StringEdit {
69
return edit.rebaseSkipConflicting(this.edits.inverse(this.originalText));
70
}
71
72
public projectBackTextEdit(edits: readonly vscode.TextEdit[]): vscode.TextEdit[] {
73
const offsetEdit = this.positionOffsetTransformer.toOffsetEdit(edits);
74
const back = this.projectBackOffsetEdit(offsetEdit);
75
return this.originalPositionOffsetTransformer.toTextEdits(back);
76
}
77
}
78
79