Skip to content

Commit 1d5521b

Browse files
committed
When iterating to load configured project, create copy.
1 parent 26ae2ee commit 1d5521b

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

@@ -1615,7 +1615,7 @@ namespace ts.server {
16151615
return;
16161616
}
16171617

1618-
const projectOptions = project.projectKind === ProjectKind.Configured ? (project as ConfiguredProject).projectOptions as ProjectOptions : undefined;
1618+
const projectOptions = isConfiguredProject(project) ? project.projectOptions as ProjectOptions : undefined;
16191619
setProjectOptionsUsed(project);
16201620
const data: ProjectInfoTelemetryEventData = {
16211621
projectId: this.host.createSHA256Hash(project.projectName),
@@ -2389,8 +2389,8 @@ namespace ts.server {
23892389

23902390
// Add configured projects as referenced
23912391
originalScriptInfo.containingProjects.forEach(project => {
2392-
if (project.projectKind === ProjectKind.Configured) {
2393-
addOriginalConfiguredProject(project as ConfiguredProject);
2392+
if (isConfiguredProject(project)) {
2393+
addOriginalConfiguredProject(project);
23942394
}
23952395
});
23962396
return originalLocation;
@@ -2526,7 +2526,9 @@ namespace ts.server {
25262526
/*@internal*/
25272527
loadAncestorAndReferenceConfiguredProjects(forProjects: ReadonlyMap<Project>) {
25282528
// Load all the projects ancestor projects for seen projects
2529-
this.configuredProjects.forEach(project => {
2529+
// Because the configured projects can update in the callback, get the copy to iterate
2530+
const currentConfigProjects = arrayFrom(this.configuredProjects.values());
2531+
currentConfigProjects.forEach(project => {
25302532
if (project.isInitialLoadPending() &&
25312533
project.forEachProjectReference(returnFalse, returnFalse, path => forProjects.has(path))) {
25322534
// 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)