mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-20 02:08:47 +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 {
|
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[] {
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user