From 1b21350e1719428b8d0c3280add470d1b395e2af Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Fri, 16 Oct 2020 12:04:36 -0700 Subject: [PATCH] test(language-service): Make project service a singleton (#39308) Constructing a project service is expensive. Making it a singleton could speed up tests considerably. On my MacBook Pro, test execution went from 24.4s to 14.5s (~40% improvement). PR Close #39308 --- .../language-service/ivy/test/mock_host.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/language-service/ivy/test/mock_host.ts b/packages/language-service/ivy/test/mock_host.ts index 34a052eacf..b28c13335a 100644 --- a/packages/language-service/ivy/test/mock_host.ts +++ b/packages/language-service/ivy/test/mock_host.ts @@ -69,6 +69,12 @@ export const host: ts.server.ServerHost = { }, }; +/** + * Constructing a project service is expensive (~2.5s on MacBook Pro), so it + * should be a singleton service shared throughout all tests. + */ +let projectService: ts.server.ProjectService; + /** * Create a ConfiguredProject and an actual program for the test project located * in packages/language-service/test/project. Project creation exercises the @@ -76,17 +82,19 @@ export const host: ts.server.ServerHost = { * and modify test files. */ export function setup() { - const projectService = new ts.server.ProjectService({ - host, - logger, - cancellationToken: ts.server.nullCancellationToken, - useSingleInferredProject: true, - useInferredProjectPerProjectRoot: true, - typingsInstaller: ts.server.nullTypingsInstaller, - }); - // Opening APP_COMPONENT forces a new ConfiguredProject to be created based - // on the tsconfig.json in the test project. - projectService.openClientFile(APP_COMPONENT); + if (!projectService) { + projectService = new ts.server.ProjectService({ + host, + logger, + cancellationToken: ts.server.nullCancellationToken, + useSingleInferredProject: true, + useInferredProjectPerProjectRoot: true, + typingsInstaller: ts.server.nullTypingsInstaller, + }); + // Opening APP_COMPONENT forces a new ConfiguredProject to be created based + // on the tsconfig.json in the test project. + projectService.openClientFile(APP_COMPONENT); + } const project = projectService.findProject(TSCONFIG); if (!project) { throw new Error(`Failed to create project for ${TSCONFIG}`);