Skip to content

Commit 0bef05d

Browse files
committed
When iterating to load configured project, create copy.
1 parent 84c06bb commit 0bef05d

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

src/server/editorServices.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,8 @@ namespace ts.server {
410410
}
411411

412412
function setProjectOptionsUsed(project: ConfiguredProject | ExternalProject) {
413-
if (project.projectKind === ProjectKind.Configured) {
414-
(project as ConfiguredProject).projectOptions = true;
413+
if (isConfiguredProject(project)) {
414+
project.projectOptions = true;
415415
}
416416
}
417417

@@ -1606,7 +1606,7 @@ namespace ts.server {
16061606
return;
16071607
}
16081608

1609-
const projectOptions = project.projectKind === ProjectKind.Configured ? (project as ConfiguredProject).projectOptions as ProjectOptions : undefined;
1609+
const projectOptions = isConfiguredProject(project) ? project.projectOptions as ProjectOptions : undefined;
16101610
setProjectOptionsUsed(project);
16111611
const data: ProjectInfoTelemetryEventData = {
16121612
projectId: this.host.createSHA256Hash(project.projectName),
@@ -2399,8 +2399,8 @@ namespace ts.server {
23992399

24002400
// Add configured projects as referenced
24012401
originalScriptInfo.containingProjects.forEach(project => {
2402-
if (project.projectKind === ProjectKind.Configured) {
2403-
addOriginalConfiguredProject(project as ConfiguredProject);
2402+
if (isConfiguredProject(project)) {
2403+
addOriginalConfiguredProject(project);
24042404
}
24052405
});
24062406
return originalLocation;
@@ -2536,7 +2536,9 @@ namespace ts.server {
25362536
/*@internal*/
25372537
loadAncestorAndReferenceConfiguredProjects(forProjects: ReadonlyMap<Project>) {
25382538
// Load all the projects ancestor projects for seen projects
2539-
this.configuredProjects.forEach(project => {
2539+
// Because the configured projects can update in the callback, get the copy to iterate
2540+
const currentConfigProjects = arrayFrom(this.configuredProjects.values());
2541+
currentConfigProjects.forEach(project => {
25402542
if (project.isInitialLoadPending() &&
25412543
project.forEachProjectReference(returnFalse, returnFalse, path => forProjects.has(path))) {
25422544
// Load the project

src/server/project.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ namespace ts.server {
9292
return value instanceof ScriptInfo;
9393
}
9494

95+
export function isConfiguredProject(p: Project): p is ConfiguredProject {
96+
return p.projectKind === ProjectKind.Configured;
97+
}
98+
9599
export abstract class Project implements LanguageServiceHost, ModuleResolutionHost {
96100
private rootFiles: ScriptInfo[] = [];
97101
private rootFilesMap: Map<ProjectRoot> = createMap<ProjectRoot>();

src/server/session.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,8 @@ namespace ts.server {
421421

422422
// After initial references are collected, go over every other project and see if it has a reference for the symbol definition.
423423
if (getDefinition) {
424-
projectService.loadAncestorAndReferenceConfiguredProjects(seenProjects);
425-
426424
const memGetDefinition = memoize(getDefinition);
425+
projectService.loadAncestorAndReferenceConfiguredProjects(seenProjects);
427426
projectService.forEachEnabledProject(project => {
428427
if (!addToSeen(seenProjects, project)) return;
429428
const definition = getDefinitionInProject(memGetDefinition(), defaultProject, project);
@@ -449,7 +448,7 @@ namespace ts.server {
449448
}
450449

451450
function getProjectKey(project: Project) {
452-
return project.projectKind === ProjectKind.Configured ? (project as ConfiguredProject).canonicalConfigFilePath : project.projectName;
451+
return isConfiguredProject(project) ? project.canonicalConfigFilePath : project.projectName;
453452
}
454453

455454
function callbackProjectAndLocation<TLocation extends sourcemaps.SourceMappableLocation | undefined>(

0 commit comments

Comments
 (0)