Path: blob/main/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.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*--------------------------------------------------------------------------------------------*/4import { matchesSubString } from '../../../../../base/common/filters.js';5import { TextReplacement } from '../../../../common/core/edits/textEdit.js';6import { Position } from '../../../../common/core/position.js';7import { Range } from '../../../../common/core/range.js';8import { ITextModel, EndOfLinePreference } from '../../../../common/model.js';9import { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';1011export function inlineCompletionIsVisible(singleTextEdit: TextReplacement, originalRange: Range | undefined, model: ITextModel, cursorPosition: Position): boolean {12const minimizedReplacement = singleTextRemoveCommonPrefix(singleTextEdit, model);13const editRange = singleTextEdit.range;14if (!editRange15|| (originalRange && !originalRange.getStartPosition().equals(editRange.getStartPosition()))16|| cursorPosition.lineNumber !== minimizedReplacement.range.startLineNumber17|| minimizedReplacement.isEmpty // if the completion is empty after removing the common prefix of the completion and the model, the completion item would not be visible18) {19return false;20}2122// We might consider comparing by .toLowerText, but this requires GhostTextReplacement23const originalValue = model.getValueInRange(minimizedReplacement.range, EndOfLinePreference.LF);24const filterText = minimizedReplacement.text;2526const cursorPosIndex = Math.max(0, cursorPosition.column - minimizedReplacement.range.startColumn);2728let filterTextBefore = filterText.substring(0, cursorPosIndex);29let filterTextAfter = filterText.substring(cursorPosIndex);3031let originalValueBefore = originalValue.substring(0, cursorPosIndex);32let originalValueAfter = originalValue.substring(cursorPosIndex);3334const originalValueIndent = model.getLineIndentColumn(minimizedReplacement.range.startLineNumber);35if (minimizedReplacement.range.startColumn <= originalValueIndent) {36// Remove indentation37originalValueBefore = originalValueBefore.trimStart();38if (originalValueBefore.length === 0) {39originalValueAfter = originalValueAfter.trimStart();40}41filterTextBefore = filterTextBefore.trimStart();42if (filterTextBefore.length === 0) {43filterTextAfter = filterTextAfter.trimStart();44}45}4647return filterTextBefore.startsWith(originalValueBefore)48&& !!matchesSubString(originalValueAfter, filterTextAfter);49}505152