From ce761ba6bc14526570db742361d727a6e632727d Mon Sep 17 00:00:00 2001 From: Brad Cornes Date: Tue, 4 May 2021 10:59:34 +0100 Subject: [PATCH] boot language clients lazily --- src/extension.ts | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index d8db4b3..5881624 100755 --- a/src/extension.ts +++ b/src/extension.ts @@ -16,6 +16,7 @@ import { Position, Range, TextEditorDecorationType, + RelativePattern, } from 'vscode' import { LanguageClient, LanguageClientOptions, TransportKind } from 'vscode-languageclient/node' import { DEFAULT_LANGUAGES } from './lib/languages' @@ -28,8 +29,11 @@ const colorNames = Object.keys(namedColors) const CLIENT_ID = 'tailwindcss-intellisense' const CLIENT_NAME = 'Tailwind CSS IntelliSense' +const CONFIG_FILE_GLOB = 'tailwind.config.{js,cjs}' + let clients: Map = new Map() let languages: Map = new Map() +let searchedFolders: Set = new Set() let _sortedWorkspaceFolders: string[] | undefined function sortedWorkspaceFolders(): string[] { @@ -83,6 +87,19 @@ export function activate(context: ExtensionContext) { }) ) + let watcher = Workspace.createFileSystemWatcher(`**/${CONFIG_FILE_GLOB}`, false, true, true) + + watcher.onDidCreate((uri) => { + let folder = Workspace.getWorkspaceFolder(uri) + if (!folder) { + return + } + folder = getOuterMostWorkspaceFolder(folder) + bootWorkspaceClient(folder) + }) + + context.subscriptions.push(watcher) + // TODO: check if the actual language MAPPING changed // not just the language IDs // e.g. "plaintext" already exists but you change it from "html" to "css" @@ -117,6 +134,13 @@ export function activate(context: ExtensionContext) { // placeholder so we don't boot another server before this one is ready clients.set(folder.uri.toString(), null) + if (!languages.has(folder.uri.toString())) { + languages.set( + folder.uri.toString(), + dedupe([...DEFAULT_LANGUAGES, ...Object.keys(getUserLanguages(folder))]) + ) + } + let debugOptions = { execArgv: ['--nolazy', `--inspect=${6011 + clients.size}`], } @@ -255,6 +279,7 @@ export function activate(context: ExtensionContext) { configurationSection: ['editor', 'tailwindCSS'], }, } + let client = new LanguageClient(CLIENT_ID, CLIENT_NAME, serverOptions, clientOptions) client.onReady().then(() => { @@ -284,7 +309,7 @@ export function activate(context: ExtensionContext) { clients.set(folder.uri.toString(), client) } - function didOpenTextDocument(document: TextDocument): void { + async function didOpenTextDocument(document: TextDocument): Promise { // We are only interested in language mode text if (document.uri.scheme !== 'file') { return @@ -300,11 +325,18 @@ export function activate(context: ExtensionContext) { // If we have nested workspace folders we only start a server on the outer most workspace folder. folder = getOuterMostWorkspaceFolder(folder) - if (!languages.has(folder.uri.toString())) { - languages.set( - folder.uri.toString(), - dedupe([...DEFAULT_LANGUAGES, ...Object.keys(getUserLanguages())]) - ) + if (searchedFolders.has(folder.uri.toString())) return + + searchedFolders.add(folder.uri.toString()) + + let [configFile] = await Workspace.findFiles( + new RelativePattern(folder, `**/${CONFIG_FILE_GLOB}`), + '**/node_modules/**', + 1 + ) + + if (!configFile) { + return } bootWorkspaceClient(folder) @@ -316,6 +348,7 @@ export function activate(context: ExtensionContext) { for (let folder of event.removed) { let client = clients.get(folder.uri.toString()) if (client) { + searchedFolders.delete(folder.uri.toString()) clients.delete(folder.uri.toString()) client.stop() }