From a8ebf4dc0056fbd4d2a9637bad423ed1c3ee0d14 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 3 Aug 2020 21:54:38 +0000 Subject: [PATCH] Cherry-pick PR #39889 into release-4.0 Component commits: c3ac7fa2e7 Handle the fact that noResolveResolution resolution is reused Fixes #39795 --- src/compiler/resolutionCache.ts | 5 +++-- .../tsserver/approximateSemanticOnlyServer.ts | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/compiler/resolutionCache.ts b/src/compiler/resolutionCache.ts index 56ea6a03e8047..d6dfaf40966b5 100644 --- a/src/compiler/resolutionCache.ts +++ b/src/compiler/resolutionCache.ts @@ -406,7 +406,7 @@ namespace ts { perDirectoryResolution.set(name, resolution); } resolutionsInFile.set(name, resolution); - watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName); + watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName, noResolveResolution); if (existingResolution) { stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolutionWithResolvedFileName); } @@ -561,6 +561,7 @@ namespace ts { resolution: T, filePath: Path, getResolutionWithResolvedFileName: GetResolutionWithResolvedFileName, + noResolveResolution: T ) { if (resolution.refCount) { resolution.refCount++; @@ -568,7 +569,7 @@ namespace ts { } else { resolution.refCount = 1; - Debug.assert(resolution.files === undefined); + Debug.assert(resolution.files === undefined || (resolution === noResolveResolution && length(noResolveResolution.files) === 0)); if (isExternalModuleNameRelative(name)) { watchFailedLookupLocationOfResolution(resolution); } diff --git a/src/testRunner/unittests/tsserver/approximateSemanticOnlyServer.ts b/src/testRunner/unittests/tsserver/approximateSemanticOnlyServer.ts index 1b517e027b882..3cf036223404b 100644 --- a/src/testRunner/unittests/tsserver/approximateSemanticOnlyServer.ts +++ b/src/testRunner/unittests/tsserver/approximateSemanticOnlyServer.ts @@ -213,5 +213,23 @@ function fooB() { }` assert.isFalse(project.dirty); checkProjectActualFiles(project, [libFile.path, file1.path, file2.path, file3.path, something.path]); }); + + it("should not crash when external module name resolution is reused", () => { + const { session, file1, file2, file3 } = setup(); + const service = session.getProjectService(); + openFilesForSession([file1], session); + checkNumberOfProjects(service, { inferredProjects: 1 }); + const project = service.inferredProjects[0]; + checkProjectActualFiles(project, [libFile.path, file1.path, file2.path]); + + // Close the file that contains non relative external module name and open some file that doesnt have non relative external module import + closeFilesForSession([file1], session); + openFilesForSession([file3], session); + checkProjectActualFiles(project, [libFile.path, file3.path]); + + // Open file with non relative external module name + openFilesForSession([file2], session); + checkProjectActualFiles(project, [libFile.path, file2.path, file3.path]); + }); }); }