diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index c4a844d..24a191e 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -1611,7 +1611,7 @@ function getContentDocumentSelectorFromConfigFile( } class TW { - private initialized = false + private initPromise: Promise private lspHandlersAdded = false private workspaces: Map private projects: Map @@ -1631,12 +1631,15 @@ class TW { } async init(): Promise { - if (this.initialized) return + if (!this.initPromise) { + this.initPromise = this._init() + } + await this.initPromise + } + private async _init(): Promise { clearRequireCache() - this.initialized = true - let base: string if (this.initializeParams.rootUri) { base = URI.parse(this.initializeParams.rootUri).fsPath @@ -2131,7 +2134,7 @@ class TW { } } - private setupLSPHandlers() { + setupLSPHandlers() { if (this.lspHandlersAdded) { return } @@ -2147,6 +2150,10 @@ class TW { } private updateCapabilities() { + if (!supportsDynamicRegistration(this.initializeParams)) { + return + } + if (this.registrations) { this.registrations.then((r) => r.dispose()) } @@ -2221,30 +2228,37 @@ class TW { } async onDocumentColor(params: DocumentColorParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onDocumentColor(params) ?? [] } async onColorPresentation(params: ColorPresentationParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onColorPresentation(params) ?? [] } async onHover(params: TextDocumentPositionParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onHover(params) ?? null } async onCompletion(params: CompletionParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onCompletion(params) ?? null } async onCompletionResolve(item: CompletionItem): Promise { + await this.init() return this.projects.get(item.data?._projectKey)?.onCompletionResolve(item) ?? null } - onCodeAction(params: CodeActionParams): Promise { + async onCodeAction(params: CodeActionParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onCodeAction(params) ?? null } - onDocumentLinks(params: DocumentLinkParams): DocumentLink[] { + async onDocumentLinks(params: DocumentLinkParams): Promise { + await this.init() return this.getProject(params.textDocument)?.onDocumentLinks(params) ?? null } @@ -2274,7 +2288,7 @@ class TW { restart(): void { console.log('----------\nRESTARTING\n----------') this.dispose() - this.initialized = false + this.initPromise = undefined this.init() } } @@ -2306,9 +2320,8 @@ class DocumentService { } } -function supportsDynamicRegistration(connection: Connection, params: InitializeParams): boolean { +function supportsDynamicRegistration(params: InitializeParams): boolean { return ( - connection.onInitialized && params.capabilities.textDocument.hover?.dynamicRegistration && params.capabilities.textDocument.colorProvider?.dynamicRegistration && params.capabilities.textDocument.codeAction?.dynamicRegistration && @@ -2322,7 +2335,7 @@ const tw = new TW(connection) connection.onInitialize(async (params: InitializeParams): Promise => { tw.initializeParams = params - if (supportsDynamicRegistration(connection, params)) { + if (supportsDynamicRegistration(params)) { return { capabilities: { textDocumentSync: TextDocumentSyncKind.Full, @@ -2330,7 +2343,7 @@ connection.onInitialize(async (params: InitializeParams): Promise