From 73986039e3b99f9d2f0badcb4923dfb05f292b3e Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 19 Aug 2024 14:41:17 -0700 Subject: [PATCH] Add fast path exits if we are retaining all configured projects --- src/server/editorServices.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 2ce702d694988..fc231472a619b 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -4456,7 +4456,7 @@ export class ProjectService { toRetainConfiguredProjects: Set | undefined, openFilesWithRetainedConfiguredProject: Set | undefined, externalProjectsRetainingConfiguredProjects: Set | undefined, - ) { + ): Set { const toRemoveConfiguredProjects = new Set(this.configuredProjects.values()); const markOriginalProjectsAsUsed = (project: Project) => { if (project.originalConfiguredProjects && (isConfiguredProject(project) || !project.isOrphan())) { @@ -4469,6 +4469,8 @@ export class ProjectService { } }; toRetainConfiguredProjects?.forEach(retainConfiguredProject); + // Everything needs to be retained, fast path to skip all the work + if (!toRemoveConfiguredProjects.size) return toRemoveConfiguredProjects; // Do not remove configured projects that are used as original projects of other this.inferredProjects.forEach(markOriginalProjectsAsUsed); @@ -4479,7 +4481,10 @@ export class ProjectService { projects.forEach(retainConfiguredProject); } }); - this.openFiles.forEach((_projectRootPath, path) => { + // Everything needs to be retained, fast path to skip all the work + if (!toRemoveConfiguredProjects.size) return toRemoveConfiguredProjects; + + forEachEntry(this.openFiles, (_projectRootPath, path) => { if (openFilesWithRetainedConfiguredProject?.has(path)) return; const info = this.getScriptInfoForPath(path)!; // Part of external project @@ -4491,15 +4496,21 @@ export class ProjectService { ); if (result?.defaultProject) { result?.seenProjects.forEach(retainConfiguredProject); + // Everything needs to be retained, fast path to skip all the work + if (!toRemoveConfiguredProjects.size) return toRemoveConfiguredProjects; } }); + // Everything needs to be retained, fast path to skip all the work + if (!toRemoveConfiguredProjects.size) return toRemoveConfiguredProjects; + // Retain all the configured projects that have pending updates // or the ones that is referencing retained project (or to be retained) - this.configuredProjects.forEach(project => { + forEachEntry(this.configuredProjects, project => { if (toRemoveConfiguredProjects.has(project)) { if (isPendingUpdate(project) || forEachReferencedProject(project, isRetained)) { retainConfiguredProject(project); + if (!toRemoveConfiguredProjects.size) return toRemoveConfiguredProjects; } } });