Path: blob/main/src/vs/editor/contrib/inlineCompletions/browser/model/singleTextEditHelpers.ts
4798 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 { commonPrefixLength } from '../../../../../base/common/strings.js';6import { Range } from '../../../../common/core/range.js';7import { TextLength } from '../../../../common/core/text/textLength.js';8import { TextReplacement } from '../../../../common/core/edits/textEdit.js';9import { EndOfLinePreference, ITextModel } from '../../../../common/model.js';1011export function singleTextRemoveCommonPrefix(edit: TextReplacement, model: ITextModel, validModelRange?: Range): TextReplacement {12const modelRange = validModelRange ? edit.range.intersectRanges(validModelRange) : edit.range;13if (!modelRange) {14return edit;15}16const normalizedText = edit.text.replaceAll('\r\n', '\n');17const valueToReplace = model.getValueInRange(modelRange, EndOfLinePreference.LF);18const commonPrefixLen = commonPrefixLength(valueToReplace, normalizedText);19const start = TextLength.ofText(valueToReplace.substring(0, commonPrefixLen)).addToPosition(edit.range.getStartPosition());20const text = normalizedText.substring(commonPrefixLen);21const range = Range.fromPositions(start, edit.range.getEndPosition());22return new TextReplacement(range, text);23}2425export function singleTextEditAugments(edit: TextReplacement, base: TextReplacement): boolean {26// The augmented completion must replace the base range, but can replace even more27return edit.text.startsWith(base.text) && rangeExtends(edit.range, base.range);28}2930function rangeExtends(extendingRange: Range, rangeToExtend: Range): boolean {31return rangeToExtend.getStartPosition().equals(extendingRange.getStartPosition())32&& rangeToExtend.getEndPosition().isBeforeOrEqual(extendingRange.getEndPosition());33}343536