diff --git a/packages/vscode-tailwindcss/CHANGELOG.md b/packages/vscode-tailwindcss/CHANGELOG.md index d22e380c..01bf3b4a 100644 --- a/packages/vscode-tailwindcss/CHANGELOG.md +++ b/packages/vscode-tailwindcss/CHANGELOG.md @@ -3,6 +3,7 @@ ## Prerelease - v4: Support loading bundled versions of some first-party plugins ([#1240](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1240)) +- Cancel initial file search if it takes too long ([#1242](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1242)) # 0.14.8 diff --git a/packages/vscode-tailwindcss/src/extension.ts b/packages/vscode-tailwindcss/src/extension.ts index c0c7b9e7..a3748616 100755 --- a/packages/vscode-tailwindcss/src/extension.ts +++ b/packages/vscode-tailwindcss/src/extension.ts @@ -6,6 +6,7 @@ import type { ConfigurationScope, WorkspaceConfiguration, Selection, + CancellationToken, } from 'vscode' import { workspace as Workspace, @@ -16,6 +17,7 @@ import { Position, Range, RelativePattern, + CancellationTokenSource, } from 'vscode' import type { DocumentFilter, @@ -581,18 +583,34 @@ export async function activate(context: ExtensionContext) { return } - if (!(await anyFolderNeedsLanguageServer(Workspace.workspaceFolders ?? []))) { + let source: CancellationTokenSource | null = new CancellationTokenSource() + source.token.onCancellationRequested(() => { + source?.dispose() + source = null + outputChannel.appendLine( + 'Server was not started. Search for Tailwind CSS-related files was taking too long.', + ) + }) + + // Cancel the search after roughly 15 seconds + setTimeout(() => source?.cancel(), 15_000) + + if (!(await anyFolderNeedsLanguageServer(Workspace.workspaceFolders ?? [], source!.token))) { + source?.dispose() return } + source?.dispose() + await bootWorkspaceClient() } async function anyFolderNeedsLanguageServer( folders: readonly WorkspaceFolder[], + token: CancellationToken, ): Promise { for (let folder of folders) { - if (await folderNeedsLanguageServer(folder)) { + if (await folderNeedsLanguageServer(folder, token)) { return true } } @@ -600,7 +618,10 @@ export async function activate(context: ExtensionContext) { return false } - async function folderNeedsLanguageServer(folder: WorkspaceFolder): Promise { + async function folderNeedsLanguageServer( + folder: WorkspaceFolder, + token: CancellationToken, + ): Promise { let settings = Workspace.getConfiguration('tailwindCSS', folder) if (settings.get('experimental.configFile') !== null) { return true @@ -616,13 +637,19 @@ export async function activate(context: ExtensionContext) { new RelativePattern(folder, `**/${CONFIG_GLOB}`), exclude, 1, + token, ) for (let file of configFiles) { return true } - let cssFiles = await Workspace.findFiles(new RelativePattern(folder, `**/${CSS_GLOB}`), exclude) + let cssFiles = await Workspace.findFiles( + new RelativePattern(folder, `**/${CSS_GLOB}`), + exclude, + undefined, + token, + ) for (let file of cssFiles) { outputChannel.appendLine(`Checking if ${file.fsPath} may be Tailwind-related…`)