From 7d03da02f0b353191b0dbce95e62a5dc4fd426b6 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Feb 2025 17:18:56 -0500 Subject: [PATCH 1/3] Pass cancellation tokens through to findFiles --- packages/vscode-tailwindcss/src/extension.ts | 25 ++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/vscode-tailwindcss/src/extension.ts b/packages/vscode-tailwindcss/src/extension.ts index c0c7b9e7..1271d789 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,24 @@ export async function activate(context: ExtensionContext) { return } - if (!(await anyFolderNeedsLanguageServer(Workspace.workspaceFolders ?? []))) { + let source: CancellationTokenSource | null = new CancellationTokenSource() + + 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 +608,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 +627,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…`) From 63ce8d92f7a9411d51810184cf527066893c8272 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Feb 2025 17:19:14 -0500 Subject: [PATCH 2/3] Cancel initial file search if it takes too long The presence of symlinks can cause ripgrep processes to spawn and run for a really long time on some systems and/or projects. We set an upper limit of 15s to search for files in a workspace before we cancell the process. --- packages/vscode-tailwindcss/src/extension.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/vscode-tailwindcss/src/extension.ts b/packages/vscode-tailwindcss/src/extension.ts index 1271d789..a3748616 100755 --- a/packages/vscode-tailwindcss/src/extension.ts +++ b/packages/vscode-tailwindcss/src/extension.ts @@ -584,6 +584,16 @@ export async function activate(context: ExtensionContext) { } 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() From c7f09e52e70cb9d1166e25cb803aaaf9e8dc41a8 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Thu, 27 Feb 2025 17:22:08 -0500 Subject: [PATCH 3/3] Update changelog --- packages/vscode-tailwindcss/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) 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