From 13043156fdb281e883677452f915c1a957ff816f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 8 Mar 2025 01:42:47 +0800 Subject: [PATCH] perf(language-server): cache project info --- packages/language-server/node.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index f49aea5c6a..5a1efa93d2 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -24,6 +24,7 @@ connection.onInitialize(params => { const { typescript: ts } = loadTsdkByPath(options.typescript.tsdk, params.locale); const tsconfigProjects = createUriMap(); + const file2ProjectInfo = new Map>(); server.fileWatcher.onDidChangeWatchedFiles(({ changes }) => { for (const change of changes) { @@ -31,6 +32,7 @@ connection.onInitialize(params => { if (tsconfigProjects.has(changeUri)) { tsconfigProjects.get(changeUri)!.dispose(); tsconfigProjects.delete(changeUri); + file2ProjectInfo.clear(); } } }); @@ -44,13 +46,18 @@ connection.onInitialize(params => { async getLanguageService(uri) { if (uri.scheme === 'file' && options.typescript.tsserverRequestCommand) { const fileName = uri.fsPath.replace(/\\/g, '/'); - const projectInfo = await sendTsRequest( - ts.server.protocol.CommandTypes.ProjectInfo, - { - file: fileName, - needFileNameList: false, - } satisfies ts.server.protocol.ProjectInfoRequestArgs - ); + let projectInfoPromise = file2ProjectInfo.get(fileName); + if (!projectInfoPromise) { + projectInfoPromise = sendTsRequest( + 'ts:projectInfo', + { + file: fileName, + needFileNameList: false, + } + ); + file2ProjectInfo.set(fileName, projectInfoPromise); + } + const projectInfo = await projectInfoPromise; if (projectInfo) { const { configFileName } = projectInfo; let ls = tsconfigProjects.get(URI.file(configFileName));