From 9f56fc54121c2112b949bfa1a6e0387b31379394 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Mon, 2 Jun 2025 10:58:51 -0400 Subject: [PATCH 1/5] Refactor --- packages/tailwindcss-language-server/src/tw.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/tailwindcss-language-server/src/tw.ts b/packages/tailwindcss-language-server/src/tw.ts index 245fa9e5..ebcc9270 100644 --- a/packages/tailwindcss-language-server/src/tw.ts +++ b/packages/tailwindcss-language-server/src/tw.ts @@ -124,16 +124,24 @@ export class TW { private getWorkspaceFolders(): WorkspaceFolder[] { if (this.initializeParams.workspaceFolders?.length) { - return this.initializeParams.workspaceFolders.map((folder) => ({ - uri: URI.parse(folder.uri).fsPath, - name: folder.name, - })) + return this.initializeParams.workspaceFolders.flatMap((folder) => { + let uri = URI.parse(folder.uri) + + return [ + { + uri: uri.fsPath, + name: folder.name, + }, + ] + }) } if (this.initializeParams.rootUri) { + let uri = URI.parse(this.initializeParams.rootUri) + return [ { - uri: URI.parse(this.initializeParams.rootUri).fsPath, + uri: uri.fsPath, name: 'Root', }, ] From d932f28aefcc2f59dc78648be444a2be5302671b Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Mon, 2 Jun 2025 10:59:10 -0400 Subject: [PATCH 2/5] =?UTF-8?q?Ignore=20workspaces=20that=20don=E2=80=99t?= =?UTF-8?q?=20use=20the=20`file`=20scheme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The VSCode extension itself already does this but the language server should as well --- packages/tailwindcss-language-server/src/tw.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/tailwindcss-language-server/src/tw.ts b/packages/tailwindcss-language-server/src/tw.ts index ebcc9270..36197e3f 100644 --- a/packages/tailwindcss-language-server/src/tw.ts +++ b/packages/tailwindcss-language-server/src/tw.ts @@ -126,6 +126,10 @@ export class TW { if (this.initializeParams.workspaceFolders?.length) { return this.initializeParams.workspaceFolders.flatMap((folder) => { let uri = URI.parse(folder.uri) + if (uri.scheme !== 'file') { + console.warn(`Non-file workspace folder will be ignored: ${folder.uri}`) + return [] + } return [ { @@ -139,6 +143,11 @@ export class TW { if (this.initializeParams.rootUri) { let uri = URI.parse(this.initializeParams.rootUri) + if (uri.scheme !== 'file') { + console.warn(`Non-file workspace folder will be ignored: ${uri.toString()}`) + return [] + } + return [ { uri: uri.fsPath, @@ -156,6 +165,8 @@ export class TW { ] } + console.warn(`No workspace folders detected`) + return [] } From 18dcc70d1a1152f19c2e7861eb84e50a4c447a82 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Mon, 2 Jun 2025 11:05:28 -0400 Subject: [PATCH 3/5] Bail from getProject when given a non-file URI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’ll fail matching things *anyway* so we can just bail earlier --- packages/tailwindcss-language-server/src/tw.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/tailwindcss-language-server/src/tw.ts b/packages/tailwindcss-language-server/src/tw.ts index 36197e3f..0e4d0b86 100644 --- a/packages/tailwindcss-language-server/src/tw.ts +++ b/packages/tailwindcss-language-server/src/tw.ts @@ -995,6 +995,15 @@ export class TW { let matchedPriority: number = Infinity let uri = URI.parse(document.uri) + + if (uri.scheme !== 'file') { + console.debug(`Cannot get project for a non-file document. They are unsupported.`, { + uri: uri.toString(), + }) + + return null + } + let fsPath = uri.fsPath let normalPath = uri.path From 41bd9ce78f10ab67a8f51885d2606ed02410f853 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 3 Jun 2025 11:55:07 -0400 Subject: [PATCH 4/5] Refactor --- .../tailwindcss-language-server/src/tw.ts | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/tailwindcss-language-server/src/tw.ts b/packages/tailwindcss-language-server/src/tw.ts index 0e4d0b86..4a82b08c 100644 --- a/packages/tailwindcss-language-server/src/tw.ts +++ b/packages/tailwindcss-language-server/src/tw.ts @@ -122,14 +122,23 @@ export class TW { await this.initPromise } + private validateFolderUri(uri: URI): boolean { + if (uri.scheme !== 'file') { + console.warn( + `The workspace folder [${uri.toString()}] will be ignored: it does not use the file scheme.`, + ) + return false + } + + return true + } + private getWorkspaceFolders(): WorkspaceFolder[] { if (this.initializeParams.workspaceFolders?.length) { return this.initializeParams.workspaceFolders.flatMap((folder) => { let uri = URI.parse(folder.uri) - if (uri.scheme !== 'file') { - console.warn(`Non-file workspace folder will be ignored: ${folder.uri}`) - return [] - } + + if (!this.validateFolderUri(uri)) return [] return [ { @@ -143,10 +152,7 @@ export class TW { if (this.initializeParams.rootUri) { let uri = URI.parse(this.initializeParams.rootUri) - if (uri.scheme !== 'file') { - console.warn(`Non-file workspace folder will be ignored: ${uri.toString()}`) - return [] - } + if (!this.validateFolderUri(uri)) return [] return [ { @@ -157,9 +163,13 @@ export class TW { } if (this.initializeParams.rootPath) { + let uri = URI.file(this.initializeParams.rootPath) + + if (!this.validateFolderUri(uri)) return [] + return [ { - uri: URI.file(this.initializeParams.rootPath).fsPath, + uri: uri.fsPath, name: 'Root', }, ] From fbae8c95ab65f95929dced3926b05da311898039 Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Tue, 3 Jun 2025 11:55:19 -0400 Subject: [PATCH 5/5] Check for filesystem root and bail --- packages/tailwindcss-language-server/src/tw.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/tailwindcss-language-server/src/tw.ts b/packages/tailwindcss-language-server/src/tw.ts index 4a82b08c..6eb58553 100644 --- a/packages/tailwindcss-language-server/src/tw.ts +++ b/packages/tailwindcss-language-server/src/tw.ts @@ -130,6 +130,13 @@ export class TW { return false } + if (uri.fsPath === '/' || uri.fsPath === '\\\\') { + console.warn( + `The workspace folder [${uri.toString()}] will be ignored: it starts at the root of the filesystem which is most likely an error.`, + ) + return false + } + return true }