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 { export interface IFigSpecSuggestionsResult {
showFiles: boolean; showFiles: boolean;
showFolders: boolean; showDirectories: boolean;
fileExtensions?: string[]; fileExtensions?: string[];
hasCurrentArg: boolean; hasCurrentArg: boolean;
items: vscode.TerminalCompletionItem[]; items: vscode.TerminalCompletionItem[];
@@ -41,7 +41,7 @@ export async function getFigSuggestions(
): Promise<IFigSpecSuggestionsResult> { ): Promise<IFigSpecSuggestionsResult> {
const result: IFigSpecSuggestionsResult = { const result: IFigSpecSuggestionsResult = {
showFiles: false, showFiles: false,
showFolders: false, showDirectories: false,
hasCurrentArg: false, hasCurrentArg: false,
items: [], items: [],
}; };
@@ -107,7 +107,7 @@ export async function getFigSuggestions(
result.hasCurrentArg ||= !!completionItemResult?.hasCurrentArg; result.hasCurrentArg ||= !!completionItemResult?.hasCurrentArg;
if (completionItemResult) { if (completionItemResult) {
result.showFiles ||= completionItemResult.showFiles; result.showFiles ||= completionItemResult.showFiles;
result.showFolders ||= completionItemResult.showFolders; result.showDirectories ||= completionItemResult.showDirectories;
result.fileExtensions ||= completionItemResult.fileExtensions; result.fileExtensions ||= completionItemResult.fileExtensions;
if (completionItemResult.items) { if (completionItemResult.items) {
result.items = result.items.concat(completionItemResult.items); result.items = result.items.concat(completionItemResult.items);
@@ -129,7 +129,7 @@ async function getFigSpecSuggestions(
token?: vscode.CancellationToken, token?: vscode.CancellationToken,
): Promise<IFigSpecSuggestionsResult | undefined> { ): Promise<IFigSpecSuggestionsResult | undefined> {
let showFiles = false; let showFiles = false;
let showFolders = false; let showDirectories = false;
let fileExtensions: string[] | undefined; let fileExtensions: string[] | undefined;
const command = getCommand(terminalContext.commandLine, {}, terminalContext.cursorIndex); const command = getCommand(terminalContext.commandLine, {}, terminalContext.cursorIndex);
@@ -154,13 +154,13 @@ async function getFigSpecSuggestions(
if (completionItemResult) { if (completionItemResult) {
showFiles = completionItemResult.showFiles; showFiles = completionItemResult.showFiles;
showFolders = completionItemResult.showFolders; showDirectories = completionItemResult.showDirectories;
fileExtensions = completionItemResult.fileExtensions; fileExtensions = completionItemResult.fileExtensions;
} }
return { return {
showFiles: showFiles, showFiles: showFiles,
showFolders: showFolders, showDirectories: showDirectories,
fileExtensions, fileExtensions,
hasCurrentArg: !!parsedArguments.currentArg, hasCurrentArg: !!parsedArguments.currentArg,
items, items,
@@ -178,9 +178,9 @@ export async function collectCompletionItemResult(
env: Record<string, string>, env: Record<string, string>,
items: vscode.TerminalCompletionItem[], items: vscode.TerminalCompletionItem[],
executeExternals: IFigExecuteExternals executeExternals: IFigExecuteExternals
): Promise<{ showFiles: boolean; showFolders: boolean; fileExtensions: string[] | undefined } | undefined> { ): Promise<{ showFiles: boolean; showDirectories: boolean; fileExtensions: string[] | undefined } | undefined> {
let showFiles = false; let showFiles = false;
let showFolders = false; let showDirectories = false;
let fileExtensions: string[] | undefined; let fileExtensions: string[] | undefined;
const addSuggestions = async (specArgs: SpecArg[] | Record<string, SpecArg> | undefined, kind: vscode.TerminalCompletionItemKind, parsedArguments?: ArgumentParserResult) => { 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) ?? []) { for (const item of (await generatorResult?.request) ?? []) {
if (item.type === 'file') { if (item.type === 'file') {
showFiles = true; showFiles = true;
showFolders = true; showDirectories = true;
fileExtensions = item._internal?.fileExtensions as string[] | undefined; fileExtensions = item._internal?.fileExtensions as string[] | undefined;
} }
if (item.type === 'folder') { if (item.type === 'folder') {
showFolders = true; showDirectories = true;
} }
if (!item.name) { if (!item.name) {
@@ -258,14 +258,14 @@ export async function collectCompletionItemResult(
if (template === 'filepaths') { if (template === 'filepaths') {
showFiles = true; showFiles = true;
} else if (template === 'folders') { } else if (template === 'folders') {
showFolders = true; showDirectories = true;
} }
} }
} }
} }
} }
if (!specArgs) { if (!specArgs) {
return { showFiles, showFolders }; return { showFiles, showDirectories };
} }
const flagsToExclude = kind === vscode.TerminalCompletionItemKind.Flag ? parsedArguments?.passedOptions.map(option => option.name).flat() : undefined; 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); await addSuggestions(parsedArguments.completionObj.persistentOptions, vscode.TerminalCompletionItemKind.Flag, parsedArguments);
} }
return { showFiles, showFolders, fileExtensions }; return { showFiles, showDirectories, fileExtensions };
} }
function convertEnvRecordToArray(env: Record<string, string>): EnvironmentVariable[] { 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; const cwd = result.cwd ?? terminal.shellIntegration?.cwd;
if (cwd && (result.showFiles || result.showFolders)) { if (cwd && (result.showFiles || result.showDirectories)) {
const globPattern = createFileGlobPattern(result.fileExtensions); const globPattern = createFileGlobPattern(result.fileExtensions);
return new vscode.TerminalCompletionList(result.items, { return new vscode.TerminalCompletionList(result.items, {
showFiles: result.showFiles, showFiles: result.showFiles,
showDirectories: result.showFolders, showDirectories: result.showDirectories,
globPattern, globPattern,
cwd, cwd,
}); });
@@ -473,10 +473,10 @@ export async function getCompletionItemsFromSpecs(
name: string, name: string,
token?: vscode.CancellationToken, token?: vscode.CancellationToken,
executeExternals?: IFigExecuteExternals, 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 items: vscode.TerminalCompletionItem[] = [];
let showFiles = false; let showFiles = false;
let showFolders = false; let showDirectories = false;
let hasCurrentArg = false; let hasCurrentArg = false;
let fileExtensions: string[] | undefined; let fileExtensions: string[] | undefined;
@@ -510,7 +510,7 @@ export async function getCompletionItemsFromSpecs(
if (result) { if (result) {
hasCurrentArg ||= result.hasCurrentArg; hasCurrentArg ||= result.hasCurrentArg;
showFiles ||= result.showFiles; showFiles ||= result.showFiles;
showFolders ||= result.showFolders; showDirectories ||= result.showDirectories;
fileExtensions = result.fileExtensions; fileExtensions = result.fileExtensions;
if (result.items) { if (result.items) {
items = items.concat(result.items); items = items.concat(result.items);
@@ -546,18 +546,18 @@ export async function getCompletionItemsFromSpecs(
} }
} }
showFiles = true; showFiles = true;
showFolders = true; showDirectories = true;
} else if (!items.length && !showFiles && !showFolders && !hasCurrentArg) { } else if (!items.length && !showFiles && !showDirectories && !hasCurrentArg) {
showFiles = true; showFiles = true;
showFolders = true; showDirectories = true;
} }
let cwd: vscode.Uri | undefined; let cwd: vscode.Uri | undefined;
if (shellIntegrationCwd && (showFiles || showFolders)) { if (shellIntegrationCwd && (showFiles || showDirectories)) {
cwd = await resolveCwdFromCurrentCommandString(currentCommandString, shellIntegrationCwd); cwd = await resolveCwdFromCurrentCommandString(currentCommandString, shellIntegrationCwd);
} }
return { items, showFiles, showFolders, fileExtensions, cwd }; return { items, showFiles, showDirectories, fileExtensions, cwd };
} }
function getEnvAsRecord(shellIntegrationEnv: ITerminalEnvironment): Record<string, string> { function getEnvAsRecord(shellIntegrationEnv: ITerminalEnvironment): Record<string, string> {

View File

@@ -94,7 +94,7 @@ suite('Terminal Suggest', () => {
const cursorIndex = testSpec.input.indexOf('|'); const cursorIndex = testSpec.input.indexOf('|');
const currentCommandString = getCurrentCommandAndArgs(commandLine, cursorIndex, undefined); const currentCommandString = getCurrentCommandAndArgs(commandLine, cursorIndex, undefined);
const showFiles = testSpec.expectedResourceRequests?.type === 'files' || testSpec.expectedResourceRequests?.type === 'both'; 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 terminalContext = { commandLine, cursorIndex };
const result = await getCompletionItemsFromSpecs( const result = await getCompletionItemsFromSpecs(
completionSpecs, completionSpecs,
@@ -119,7 +119,7 @@ suite('Terminal Suggest', () => {
(testSpec.expectedCompletions ?? []).sort() (testSpec.expectedCompletions ?? []).sort()
); );
strictEqual(result.showFiles, showFiles, 'Show files different than expected, got: ' + result.showFiles); 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) { if (testSpec.expectedResourceRequests?.cwd) {
strictEqual(result.cwd?.fsPath, testSpec.expectedResourceRequests.cwd.fsPath, 'Non matching 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 { export interface TerminalCompletionResourceOptionsDto {
showFiles?: boolean; showFiles?: boolean;
showFolders?: boolean; showDirectories?: boolean;
globPattern?: string | IRelativePattern; globPattern?: string | IRelativePattern;
cwd: UriComponents; cwd: UriComponents;
pathSeparator: string; pathSeparator: string;

View File

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

View File

@@ -142,7 +142,7 @@ suite('TerminalCompletionService', () => {
}); });
suite('resolveResources should return undefined', () => { 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 = { const resourceOptions: TerminalCompletionResourceOptions = {
cwd: URI.parse('file:///test'), cwd: URI.parse('file:///test'),
pathSeparator pathSeparator