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
This commit is contained in:
parent
0c01c4a898
commit
1b21350e17
@ -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
|
* Create a ConfiguredProject and an actual program for the test project located
|
||||||
* in packages/language-service/test/project. Project creation exercises the
|
* in packages/language-service/test/project. Project creation exercises the
|
||||||
@ -76,17 +82,19 @@ export const host: ts.server.ServerHost = {
|
|||||||
* and modify test files.
|
* and modify test files.
|
||||||
*/
|
*/
|
||||||
export function setup() {
|
export function setup() {
|
||||||
const projectService = new ts.server.ProjectService({
|
if (!projectService) {
|
||||||
host,
|
projectService = new ts.server.ProjectService({
|
||||||
logger,
|
host,
|
||||||
cancellationToken: ts.server.nullCancellationToken,
|
logger,
|
||||||
useSingleInferredProject: true,
|
cancellationToken: ts.server.nullCancellationToken,
|
||||||
useInferredProjectPerProjectRoot: true,
|
useSingleInferredProject: true,
|
||||||
typingsInstaller: ts.server.nullTypingsInstaller,
|
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.
|
// Opening APP_COMPONENT forces a new ConfiguredProject to be created based
|
||||||
projectService.openClientFile(APP_COMPONENT);
|
// on the tsconfig.json in the test project.
|
||||||
|
projectService.openClientFile(APP_COMPONENT);
|
||||||
|
}
|
||||||
const project = projectService.findProject(TSCONFIG);
|
const project = projectService.findProject(TSCONFIG);
|
||||||
if (!project) {
|
if (!project) {
|
||||||
throw new Error(`Failed to create project for ${TSCONFIG}`);
|
throw new Error(`Failed to create project for ${TSCONFIG}`);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user