fix(language-service): address potential memory leak during project creation

This addresses a potential memory leak in plugin-factory.ts.
The require call inside the create function reloads the entire language
service module for every new project, which is inefficient and could be a cause of the memory leak during branch
switching. This ensures the module is loaded only once and the same
instance is shared across all projects.

(cherry picked from commit 4405725943)
This commit is contained in:
Andrew Scott
2025-11-07 19:57:22 +00:00
committed by Andrew Kushnir
parent aada582e96
commit 89095946cf
2 changed files with 7 additions and 2 deletions
+1 -2
View File
@@ -21,8 +21,7 @@ export const factory: ts.server.PluginModuleFactory = (tsModule): PluginModule =
return {
create(info: ts.server.PluginCreateInfo): NgLanguageService {
// Use a module name based import path to allow it to be marked external.
plugin = require(`@angular/language-service/bundles/language-service.js`)(tsModule);
plugin ??= require(`@angular/language-service/bundles/language-service.js`)(tsModule);
return plugin.create(info);
},
getExternalFiles(project: ts.server.Project): string[] {
@@ -706,6 +706,11 @@ export class Session {
this.triggerDiagnostics(event.data.openFiles, event.eventName);
break;
case ts.server.ProjectLanguageServiceStateEvent:
this.logger.info(
`Project language service state changed for ${event.data.project.getProjectName()}. Enabled: ${
event.data.languageServiceEnabled
}`,
);
this.connection.sendNotification(ProjectLanguageService, {
projectName: event.data.project.getProjectName(),
languageServiceEnabled: event.data.languageServiceEnabled,
@@ -969,6 +974,7 @@ export class Session {
if (!filePath) {
return;
}
this.logger.info(`Closing file: ${filePath}`);
this.openFiles.delete(filePath);
this.projectService.closeClientFile(filePath);
}