Fix terminal completion items not appearing when resourceOptions provided (#284148)

This commit is contained in:
Copilot
2025-12-18 09:58:31 -06:00
committed by GitHub
parent 385329863f
commit 96cc23e2e2
6 changed files with 28 additions and 28 deletions

View File

@@ -21,7 +21,7 @@ import { IFigExecuteExternals } from './execute';
export interface IFigSpecSuggestionsResult {
showFiles: boolean;
showFolders: boolean;
showDirectories: boolean;
fileExtensions?: string[];
hasCurrentArg: boolean;
items: vscode.TerminalCompletionItem[];
@@ -41,7 +41,7 @@ export async function getFigSuggestions(
): Promise<IFigSpecSuggestionsResult> {
const result: IFigSpecSuggestionsResult = {
showFiles: false,
showFolders: false,
showDirectories: false,
hasCurrentArg: false,
items: [],
};
@@ -107,7 +107,7 @@ export async function getFigSuggestions(
result.hasCurrentArg ||= !!completionItemResult?.hasCurrentArg;
if (completionItemResult) {
result.showFiles ||= completionItemResult.showFiles;
result.showFolders ||= completionItemResult.showFolders;
result.showDirectories ||= completionItemResult.showDirectories;
result.fileExtensions ||= completionItemResult.fileExtensions;
if (completionItemResult.items) {
result.items = result.items.concat(completionItemResult.items);
@@ -129,7 +129,7 @@ async function getFigSpecSuggestions(
token?: vscode.CancellationToken,
): Promise<IFigSpecSuggestionsResult | undefined> {
let showFiles = false;
let showFolders = false;
let showDirectories = false;
let fileExtensions: string[] | undefined;
const command = getCommand(terminalContext.commandLine, {}, terminalContext.cursorIndex);
@@ -154,13 +154,13 @@ async function getFigSpecSuggestions(
if (completionItemResult) {
showFiles = completionItemResult.showFiles;
showFolders = completionItemResult.showFolders;
showDirectories = completionItemResult.showDirectories;
fileExtensions = completionItemResult.fileExtensions;
}
return {
showFiles: showFiles,
showFolders: showFolders,
showDirectories: showDirectories,
fileExtensions,
hasCurrentArg: !!parsedArguments.currentArg,
items,
@@ -178,9 +178,9 @@ export async function collectCompletionItemResult(
env: Record<string, string>,
items: vscode.TerminalCompletionItem[],
executeExternals: IFigExecuteExternals
): Promise<{ showFiles: boolean; showFolders: boolean; fileExtensions: string[] | undefined } | undefined> {
): Promise<{ showFiles: boolean; showDirectories: boolean; fileExtensions: string[] | undefined } | undefined> {
let showFiles = false;
let showFolders = false;
let showDirectories = false;
let fileExtensions: string[] | undefined;
const addSuggestions = async (specArgs: SpecArg[] | Record<string, SpecArg> | undefined, kind: vscode.TerminalCompletionItemKind, parsedArguments?: ArgumentParserResult) => {
@@ -223,11 +223,11 @@ export async function collectCompletionItemResult(
for (const item of (await generatorResult?.request) ?? []) {
if (item.type === 'file') {
showFiles = true;
showFolders = true;
showDirectories = true;
fileExtensions = item._internal?.fileExtensions as string[] | undefined;
}
if (item.type === 'folder') {
showFolders = true;
showDirectories = true;
}
if (!item.name) {
@@ -258,14 +258,14 @@ export async function collectCompletionItemResult(
if (template === 'filepaths') {
showFiles = true;
} else if (template === 'folders') {
showFolders = true;
showDirectories = true;
}
}
}
}
}
if (!specArgs) {
return { showFiles, showFolders };
return { showFiles, showDirectories };
}
const flagsToExclude = kind === vscode.TerminalCompletionItemKind.Flag ? parsedArguments?.passedOptions.map(option => option.name).flat() : undefined;
@@ -344,7 +344,7 @@ export async function collectCompletionItemResult(
await addSuggestions(parsedArguments.completionObj.persistentOptions, vscode.TerminalCompletionItemKind.Flag, parsedArguments);
}
return { showFiles, showFolders, fileExtensions };
return { showFiles, showDirectories, fileExtensions };
}
function convertEnvRecordToArray(env: Record<string, string>): EnvironmentVariable[] {

View File

@@ -309,11 +309,11 @@ export async function activate(context: vscode.ExtensionContext) {
}
const cwd = result.cwd ?? terminal.shellIntegration?.cwd;
if (cwd && (result.showFiles || result.showFolders)) {
if (cwd && (result.showFiles || result.showDirectories)) {
const globPattern = createFileGlobPattern(result.fileExtensions);
return new vscode.TerminalCompletionList(result.items, {
showFiles: result.showFiles,
showDirectories: result.showFolders,
showDirectories: result.showDirectories,
globPattern,
cwd,
});
@@ -473,10 +473,10 @@ export async function getCompletionItemsFromSpecs(
name: string,
token?: vscode.CancellationToken,
executeExternals?: IFigExecuteExternals,
): Promise<{ items: vscode.TerminalCompletionItem[]; showFiles: boolean; showFolders: boolean; fileExtensions?: string[]; cwd?: vscode.Uri }> {
): Promise<{ items: vscode.TerminalCompletionItem[]; showFiles: boolean; showDirectories: boolean; fileExtensions?: string[]; cwd?: vscode.Uri }> {
let items: vscode.TerminalCompletionItem[] = [];
let showFiles = false;
let showFolders = false;
let showDirectories = false;
let hasCurrentArg = false;
let fileExtensions: string[] | undefined;
@@ -510,7 +510,7 @@ export async function getCompletionItemsFromSpecs(
if (result) {
hasCurrentArg ||= result.hasCurrentArg;
showFiles ||= result.showFiles;
showFolders ||= result.showFolders;
showDirectories ||= result.showDirectories;
fileExtensions = result.fileExtensions;
if (result.items) {
items = items.concat(result.items);
@@ -546,18 +546,18 @@ export async function getCompletionItemsFromSpecs(
}
}
showFiles = true;
showFolders = true;
} else if (!items.length && !showFiles && !showFolders && !hasCurrentArg) {
showDirectories = true;
} else if (!items.length && !showFiles && !showDirectories && !hasCurrentArg) {
showFiles = true;
showFolders = true;
showDirectories = true;
}
let cwd: vscode.Uri | undefined;
if (shellIntegrationCwd && (showFiles || showFolders)) {
if (shellIntegrationCwd && (showFiles || showDirectories)) {
cwd = await resolveCwdFromCurrentCommandString(currentCommandString, shellIntegrationCwd);
}
return { items, showFiles, showFolders, fileExtensions, cwd };
return { items, showFiles, showDirectories, fileExtensions, cwd };
}
function getEnvAsRecord(shellIntegrationEnv: ITerminalEnvironment): Record<string, string> {

View File

@@ -94,7 +94,7 @@ suite('Terminal Suggest', () => {
const cursorIndex = testSpec.input.indexOf('|');
const currentCommandString = getCurrentCommandAndArgs(commandLine, cursorIndex, undefined);
const showFiles = testSpec.expectedResourceRequests?.type === 'files' || testSpec.expectedResourceRequests?.type === 'both';
const showFolders = testSpec.expectedResourceRequests?.type === 'folders' || testSpec.expectedResourceRequests?.type === 'both';
const showDirectories = testSpec.expectedResourceRequests?.type === 'folders' || testSpec.expectedResourceRequests?.type === 'both';
const terminalContext = { commandLine, cursorIndex };
const result = await getCompletionItemsFromSpecs(
completionSpecs,
@@ -119,7 +119,7 @@ suite('Terminal Suggest', () => {
(testSpec.expectedCompletions ?? []).sort()
);
strictEqual(result.showFiles, showFiles, 'Show files different than expected, got: ' + result.showFiles);
strictEqual(result.showFolders, showFolders, 'Show folders different than expected, got: ' + result.showFolders);
strictEqual(result.showDirectories, showDirectories, 'Show directories different than expected, got: ' + result.showDirectories);
if (testSpec.expectedResourceRequests?.cwd) {
strictEqual(result.cwd?.fsPath, testSpec.expectedResourceRequests.cwd.fsPath, 'Non matching cwd');
}

View File

@@ -2635,7 +2635,7 @@ export class TerminalCompletionListDto<T extends ITerminalCompletionItemDto = IT
export interface TerminalCompletionResourceOptionsDto {
showFiles?: boolean;
showFolders?: boolean;
showDirectories?: boolean;
globPattern?: string | IRelativePattern;
cwd: UriComponents;
pathSeparator: string;

View File

@@ -990,7 +990,7 @@ export class TerminalCompletionList<T extends TerminalCompletionItem = TerminalC
export interface TerminalCompletionResourceOptions {
showFiles?: boolean;
showFolders?: boolean;
showDirectories?: boolean;
fileExtensions?: string[];
cwd?: vscode.Uri;
}

View File

@@ -142,7 +142,7 @@ suite('TerminalCompletionService', () => {
});
suite('resolveResources should return undefined', () => {
test('if neither showFiles nor showFolders are true', async () => {
test('if neither showFiles nor showDirectories are true', async () => {
const resourceOptions: TerminalCompletionResourceOptions = {
cwd: URI.parse('file:///test'),
pathSeparator