diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts index 99bb98946f010e802c6ea1425a2afe4b692a73bb..7fe1bd9c1362bbf6a9d73e9e81fe7a0585c29893 100644 --- a/packages/tailwindcss-language-server/src/server.ts +++ b/packages/tailwindcss-language-server/src/server.ts @@ -177,7 +177,6 @@ } } interface ProjectService { - projectConfig: ProjectConfig enabled: () => boolean enable: () => void documentSelector: () => Array @@ -362,7 +361,6 @@ return patterns } async function createProjectService( - projectKey: string, projectConfig: ProjectConfig, connection: Connection, params: InitializeParams, @@ -1066,7 +1064,6 @@ updateCapabilities() } return { - projectConfig, enabled() { return enabled }, @@ -1120,7 +1117,7 @@ return { isIncomplete: result.isIncomplete, items: result.items.map((item) => ({ ...item, - data: { projectKey, originalData: item.data }, + data: { projectKey: JSON.stringify(projectConfig), originalData: item.data }, })), } }, null) @@ -1564,7 +1561,6 @@ private initialized = false private lspHandlersAdded = false private workspaces: Map private projects: Map - private projectCounter: number private documentService: DocumentService public initializeParams: InitializeParams private registrations: Promise @@ -1576,7 +1572,6 @@ constructor(private connection: Connection) { this.documentService = new DocumentService(this.connection) this.workspaces = new Map() this.projects = new Map() - this.projectCounter = 0 } async init(): Promise { @@ -1759,18 +1754,19 @@ } let isPackageFile = minimatch(normalizedFilename, `**/${PACKAGE_LOCK_GLOB}`, { dot: true }) if (isPackageFile) { - for (let [, project] of this.projects) { + for (let [key] of this.projects) { + let projectConfig = JSON.parse(key) as ProjectConfig let twVersion = require('tailwindcss/package.json').version try { let v = require(resolveFrom( - path.dirname(project.projectConfig.configPath), + path.dirname(projectConfig.configPath), 'tailwindcss/package.json' )).version if (typeof v === 'string') { twVersion = v } } catch {} - if (configTailwindVersionMap.get(project.projectConfig.configPath) !== twVersion) { + if (configTailwindVersionMap.get(projectConfig.configPath) !== twVersion) { needsRestart = true break changeLoop } @@ -1802,10 +1798,11 @@ needsRestart = true break } - for (let [, project] of this.projects) { + for (let [key] of this.projects) { + let projectConfig = JSON.parse(key) as ProjectConfig if ( change.type === FileChangeType.Deleted && - changeAffectsFile(normalizedFilename, [project.projectConfig.configPath]) + changeAffectsFile(normalizedFilename, [projectConfig.configPath]) ) { needsRestart = true break changeLoop @@ -2020,29 +2017,31 @@ params: InitializeParams, watchPatterns: (patterns: string[]) => void, tailwindVersion: string ): Promise { - let key = String(this.projectCounter++) - const project = await createProjectService( - key, - projectConfig, - this.connection, - params, - this.documentService, - () => this.updateCapabilities(), - () => { - for (let document of this.documentService.getAllDocuments()) { - let project = this.getProject(document) - if (project && !project.enabled()) { - project.enable() - project.tryInit() - break + let key = JSON.stringify(projectConfig) + + if (!this.projects.has(key)) { + const project = await createProjectService( + projectConfig, + this.connection, + params, + this.documentService, + () => this.updateCapabilities(), + () => { + for (let document of this.documentService.getAllDocuments()) { + let project = this.getProject(document) + if (project && !project.enabled()) { + project.enable() + project.tryInit() + break + } } - } - }, - () => this.refreshDiagnostics(), - (patterns: string[]) => watchPatterns(patterns), - tailwindVersion - ) - this.projects.set(key, project) + }, + () => this.refreshDiagnostics(), + (patterns: string[]) => watchPatterns(patterns), + tailwindVersion + ) + this.projects.set(key, project) + } } private refreshDiagnostics() { @@ -2105,8 +2104,9 @@ let fallbackProject: ProjectService let matchedProject: ProjectService let matchedPriority: number = Infinity - for (let [, project] of this.projects) { - if (project.projectConfig.configPath) { + for (let [key, project] of this.projects) { + let projectConfig = JSON.parse(key) as ProjectConfig + if (projectConfig.configPath) { let documentSelector = project .documentSelector() .concat()