Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/inlineCompletions/browser/model/singleTextEditHelpers.ts
4798 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 { commonPrefixLength } from '../../../../../base/common/strings.js';
7
import { Range } from '../../../../common/core/range.js';
8
import { TextLength } from '../../../../common/core/text/textLength.js';
9
import { TextReplacement } from '../../../../common/core/edits/textEdit.js';
10
import { EndOfLinePreference, ITextModel } from '../../../../common/model.js';
11
12
export function singleTextRemoveCommonPrefix(edit: TextReplacement, model: ITextModel, validModelRange?: Range): TextReplacement {
13
const modelRange = validModelRange ? edit.range.intersectRanges(validModelRange) : edit.range;
14
if (!modelRange) {
15
return edit;
16
}
17
const normalizedText = edit.text.replaceAll('\r\n', '\n');
18
const valueToReplace = model.getValueInRange(modelRange, EndOfLinePreference.LF);
19
const commonPrefixLen = commonPrefixLength(valueToReplace, normalizedText);
20
const start = TextLength.ofText(valueToReplace.substring(0, commonPrefixLen)).addToPosition(edit.range.getStartPosition());
21
const text = normalizedText.substring(commonPrefixLen);
22
const range = Range.fromPositions(start, edit.range.getEndPosition());
23
return new TextReplacement(range, text);
24
}
25
26
export function singleTextEditAugments(edit: TextReplacement, base: TextReplacement): boolean {
27
// The augmented completion must replace the base range, but can replace even more
28
return edit.text.startsWith(base.text) && rangeExtends(edit.range, base.range);
29
}
30
31
function rangeExtends(extendingRange: Range, rangeToExtend: Range): boolean {
32
return rangeToExtend.getStartPosition().equals(extendingRange.getStartPosition())
33
&& rangeToExtend.getEndPosition().isBeforeOrEqual(extendingRange.getEndPosition());
34
}
35
36