From 7b7ee64776630977b59ae653235c81041ca59dd9 Mon Sep 17 00:00:00 2001 From: Harsh Vardhan Chauhan Date: Tue, 3 Nov 2026 14:46:39 +0530 Subject: [PATCH 1/2] Retain configured projects for API-opened files on closeProjects --- tsc/internal/project/projectcollectionbuilder.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tsc/internal/project/projectcollectionbuilder.go b/tsc/internal/project/projectcollectionbuilder.go index a5236abcb11ec..b4aeccb157215 100644 --- a/tsc/internal/project/projectcollectionbuilder.go +++ b/tsc/internal/project/projectcollectionbuilder.go @@ -256,6 +256,13 @@ func (b *ProjectCollectionBuilder) HandleAPIRequest(apiRequest *APISnapshotReque } } + // Projects that are still the default for API-opened files must be retained. + for path, file := range b.apiState.openFiles { + if entry := b.findDefaultConfiguredProject(file.fileName, path); entry != nil { + delete(projectsToClose, entry.Value().configFilePath) + } + } + for projectPath := range projectsToClose { if entry, ok := b.configuredProjects.Load(ConfiguredProjectIDFromPathKey(projectPath)); ok { b.deleteProject(entry, logger) From 527efade771b0bc1feac92ac8fa368ff28b2051b Mon Sep 17 00:00:00 2001 From: Harsh Vardhan Chauhan Date: Tue, 3 Nov 2026 14:46:40 +0530 Subject: [PATCH 2/2] Add test for closeProjects retaining project of API-opened file --- tsc/internal/api/session_apistate_test.go | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tsc/internal/api/session_apistate_test.go b/tsc/internal/api/session_apistate_test.go index 585e2aa3442fc..3ec3a729fd1d2 100644 --- a/tsc/internal/api/session_apistate_test.go +++ b/tsc/internal/api/session_apistate_test.go @@ -544,3 +544,30 @@ func TestOpenProjectsWithCircularExtendsReportCircularity(t *testing.T) { } assert.DeepEqual(t, codes, []int32{18000}) } + +func TestGetCurrentLanguageServerSnapshotCloseProjectRetainsProjectForOpenFile(t *testing.T) { + t.Parallel() + + const configFileName = "/home/projects/p/tsconfig.json" + const fileName = "/home/projects/p/index.ts" + projectSession, _ := projecttestutil.Setup(map[string]any{ + configFileName: `{}`, + fileName: `export const value = 1;`, + }) + defer projectSession.Close() + ctx := context.Background() + session := NewLSPSession(projectSession, nil) + defer session.Close() + cfg := DocumentIdentifier{FileName: configFileName} + _, err := session.handleGetCurrentLanguageServerSnapshot(ctx, &GetCurrentLanguageServerSnapshotParams{Changes: &LanguageServerSnapshotChanges{ + OpenProjects: []DocumentIdentifier{cfg}, + OpenFiles: []DocumentIdentifier{{FileName: fileName}}, + }}) + assert.NilError(t, err) + + _, err = session.handleGetCurrentLanguageServerSnapshot(ctx, &GetCurrentLanguageServerSnapshotParams{Changes: &LanguageServerSnapshotChanges{ + CloseProjects: []DocumentIdentifier{cfg}, + }}) + assert.NilError(t, err) + assert.Assert(t, projectSession.Snapshot().ProjectCollection.ConfiguredProject(tspath.PathKeyFromCanonical(configFileName)) != nil) +}