mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-19 17:58:39 +00:00
Fix terminal completion items not appearing when resourceOptions provided (#284148)
This commit is contained in:
@@ -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[] {
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user