Add setting enableRecursiveFileSearch to control @-file completion (#1290)

This commit is contained in:
Billy Biggs
2025-06-21 18:23:35 -07:00
committed by GitHub
parent 63f6a497cb
commit 0779697da6
8 changed files with 77 additions and 13 deletions

View File

@@ -47,6 +47,7 @@ describe('useCompletion git-aware filtering integration', () => {
mockConfig = {
getFileFilteringRespectGitIgnore: vi.fn(() => true),
getFileService: vi.fn().mockReturnValue(mockFileDiscoveryService),
getEnableRecursiveFileSearch: vi.fn(() => true),
};
vi.mocked(FileDiscoveryService).mockImplementation(
@@ -170,6 +171,35 @@ describe('useCompletion git-aware filtering integration', () => {
);
});
it('should not perform recursive search when disabled in config', async () => {
const globResults = [`${testCwd}/data`, `${testCwd}/dist`];
vi.mocked(glob).mockResolvedValue(globResults);
// Disable recursive search in the mock config
const mockConfigNoRecursive = {
...mockConfig,
getEnableRecursiveFileSearch: vi.fn(() => false),
};
vi.mocked(fs.readdir).mockResolvedValue([
{ name: 'data', isDirectory: () => true },
{ name: 'dist', isDirectory: () => true },
] as Array<{ name: string; isDirectory: () => boolean }>);
renderHook(() =>
useCompletion('@d', testCwd, true, slashCommands, mockConfigNoRecursive),
);
await act(async () => {
await new Promise((resolve) => setTimeout(resolve, 150));
});
// `glob` should not be called because recursive search is disabled
expect(glob).not.toHaveBeenCalled();
// `fs.readdir` should be called for the top-level directory instead
expect(fs.readdir).toHaveBeenCalledWith(testCwd, { withFileTypes: true });
});
it('should work without config (fallback behavior)', async () => {
vi.mocked(fs.readdir).mockResolvedValue([
{ name: 'src', isDirectory: () => true },

View File

@@ -322,10 +322,16 @@ export function useCompletion(
let fetchedSuggestions: Suggestion[] = [];
const fileDiscoveryService = config ? config.getFileService() : null;
const enableRecursiveSearch =
config?.getEnableRecursiveFileSearch() ?? true;
try {
// If there's no slash, or it's the root, do a recursive search from cwd
if (partialPath.indexOf('/') === -1 && prefix) {
if (
partialPath.indexOf('/') === -1 &&
prefix &&
enableRecursiveSearch
) {
if (fileDiscoveryService) {
fetchedSuggestions = await findFilesWithGlob(
prefix,