Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.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
import { matchesSubString } from '../../../../../base/common/filters.js';
6
import { TextReplacement } from '../../../../common/core/edits/textEdit.js';
7
import { Position } from '../../../../common/core/position.js';
8
import { Range } from '../../../../common/core/range.js';
9
import { ITextModel, EndOfLinePreference } from '../../../../common/model.js';
10
import { singleTextRemoveCommonPrefix } from './singleTextEditHelpers.js';
11
12
export function inlineCompletionIsVisible(singleTextEdit: TextReplacement, originalRange: Range | undefined, model: ITextModel, cursorPosition: Position): boolean {
13
const minimizedReplacement = singleTextRemoveCommonPrefix(singleTextEdit, model);
14
const editRange = singleTextEdit.range;
15
if (!editRange
16
|| (originalRange && !originalRange.getStartPosition().equals(editRange.getStartPosition()))
17
|| cursorPosition.lineNumber !== minimizedReplacement.range.startLineNumber
18
|| minimizedReplacement.isEmpty // if the completion is empty after removing the common prefix of the completion and the model, the completion item would not be visible
19
) {
20
return false;
21
}
22
23
// We might consider comparing by .toLowerText, but this requires GhostTextReplacement
24
const originalValue = model.getValueInRange(minimizedReplacement.range, EndOfLinePreference.LF);
25
const filterText = minimizedReplacement.text;
26
27
const cursorPosIndex = Math.max(0, cursorPosition.column - minimizedReplacement.range.startColumn);
28
29
let filterTextBefore = filterText.substring(0, cursorPosIndex);
30
let filterTextAfter = filterText.substring(cursorPosIndex);
31
32
let originalValueBefore = originalValue.substring(0, cursorPosIndex);
33
let originalValueAfter = originalValue.substring(cursorPosIndex);
34
35
const originalValueIndent = model.getLineIndentColumn(minimizedReplacement.range.startLineNumber);
36
if (minimizedReplacement.range.startColumn <= originalValueIndent) {
37
// Remove indentation
38
originalValueBefore = originalValueBefore.trimStart();
39
if (originalValueBefore.length === 0) {
40
originalValueAfter = originalValueAfter.trimStart();
41
}
42
filterTextBefore = filterTextBefore.trimStart();
43
if (filterTextBefore.length === 0) {
44
filterTextAfter = filterTextAfter.trimStart();
45
}
46
}
47
48
return filterTextBefore.startsWith(originalValueBefore)
49
&& !!matchesSubString(originalValueAfter, filterTextAfter);
50
}
51
52