Skip to content

Commit c8ebfb8

Browse files
committed
Handle impliedNodeFormat when handling sourceFileCache
Fixes #50872
1 parent 05d739b commit c8ebfb8

File tree

2 files changed

+19
-62
lines changed

2 files changed

+19
-62
lines changed

src/compiler/program.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ namespace ts {
171171
const readFileCache = new Map<string, string | false>();
172172
const fileExistsCache = new Map<string, boolean>();
173173
const directoryExistsCache = new Map<string, boolean>();
174-
const sourceFileCache = new Map<string, SourceFile>();
174+
const sourceFileCache = new Map<string, ESMap<SourceFile["impliedNodeFormat"], SourceFile>>();
175175

176176
const readFileWithCache = (fileName: string): string | undefined => {
177177
const key = toPath(fileName);
@@ -196,14 +196,16 @@ namespace ts {
196196
return setReadFileCache(key, fileName);
197197
};
198198

199-
const getSourceFileWithCache: CompilerHost["getSourceFile"] | undefined = getSourceFile ? (fileName, languageVersion, onError, shouldCreateNewSourceFile) => {
199+
const getSourceFileWithCache: CompilerHost["getSourceFile"] | undefined = getSourceFile ? (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
200200
const key = toPath(fileName);
201-
const value = sourceFileCache.get(key);
201+
const impliedNodeFormat: SourceFile["impliedNodeFormat"] = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions.impliedNodeFormat : undefined;
202+
const forPath = sourceFileCache.get(key);
203+
const value = forPath?.get(impliedNodeFormat);
202204
if (value) return value;
203205

204-
const sourceFile = getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);
206+
const sourceFile = getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
205207
if (sourceFile && (isDeclarationFileName(fileName) || fileExtensionIs(fileName, Extension.Json))) {
206-
sourceFileCache.set(key, sourceFile);
208+
sourceFileCache.set(key, (forPath || new Map()).set(impliedNodeFormat, sourceFile));
207209
}
208210
return sourceFile;
209211
} : undefined;
@@ -228,7 +230,8 @@ namespace ts {
228230
sourceFileCache.delete(key);
229231
}
230232
else if (getSourceFileWithCache) {
231-
const sourceFile = sourceFileCache.get(key);
233+
const sourceFileMap = sourceFileCache.get(key);
234+
const sourceFile = sourceFileMap && firstDefinedIterator(sourceFileMap.values(), identity);
232235
if (sourceFile && sourceFile.text !== data) {
233236
sourceFileCache.delete(key);
234237
}

tests/baselines/reference/tsbuild/moduleResolution/impliedNodeFormat-differs-between-projects-for-shared-file.js

Lines changed: 10 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -108,29 +108,27 @@ Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', resul
108108
======== Type reference directive 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts', primary: true. ========
109109
File '/lib/package.json' does not exist.
110110
File '/package.json' does not exist.
111-
src/projects/b/src/index.ts:1:8 - error TS1192: Module '"/src/projects/node_modules/@types/pg/index"' has no default export.
112-
113-
1 import pg from "pg";
114-
   ~~
115-
116111
lib/lib.es2022.full.d.ts
117112
Default library for target 'es2022'
118113
src/projects/node_modules/@types/pg/index.d.ts
119114
Imported via "pg" from file 'src/projects/b/src/index.ts'
120115
Entry point for implicit type library 'pg'
116+
File is CommonJS module because 'src/projects/node_modules/@types/pg/package.json' does not have field "type"
121117
src/projects/b/src/index.ts
122118
Matched by default include pattern '**/*'
123119
File is ECMAScript module because 'src/projects/b/package.json' has field "type" with value "module"
124-
125-
Found 1 error.
126-
127-
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
120+
exitCode:: ExitStatus.Success
128121

129122

130123
//// [/src/projects/a/src/index.js]
131124
"use strict";
132125

133126

127+
//// [/src/projects/b/src/index.js]
128+
import pg from "pg";
129+
pg.foo();
130+
131+
134132

135133

136134
Change:: no-change-run
@@ -139,58 +137,14 @@ Input::
139137

140138
Output::
141139
/lib/tsc -b /src/projects/a /src/projects/b --verbose --traceResolution --explainFiles
142-
[[90m12:00:28 AM[0m] Projects in this build:
140+
[[90m12:00:29 AM[0m] Projects in this build:
143141
* src/projects/a/tsconfig.json
144142
* src/projects/b/tsconfig.json
145143

146-
[[90m12:00:29 AM[0m] Project 'src/projects/a/tsconfig.json' is up to date because newest input 'src/projects/a/src/index.ts' is older than output 'src/projects/a/src/index.js'
144+
[[90m12:00:30 AM[0m] Project 'src/projects/a/tsconfig.json' is up to date because newest input 'src/projects/a/src/index.ts' is older than output 'src/projects/a/src/index.js'
147145

148-
[[90m12:00:30 AM[0m] Project 'src/projects/b/tsconfig.json' is out of date because output file 'src/projects/b/src/index.js' does not exist
146+
[[90m12:00:31 AM[0m] Project 'src/projects/b/tsconfig.json' is up to date because newest input 'src/projects/b/src/index.ts' is older than output 'src/projects/b/src/index.js'
149147

150-
[12:00:31 AM] Building project '/src/projects/b/tsconfig.json'...
151-
152-
File '/src/projects/b/src/package.json' does not exist.
153-
Found 'package.json' at '/src/projects/b/package.json'.
154-
'package.json' does not have a 'typesVersions' field.
155-
======== Resolving module 'pg' from '/src/projects/b/src/index.ts'. ========
156-
Module resolution kind is not specified, using 'Node16'.
157-
File '/src/projects/b/src/package.json' does not exist according to earlier cached lookups.
158-
File '/src/projects/b/package.json' exists according to earlier cached lookups.
159-
Loading module 'pg' from 'node_modules' folder, target file type 'TypeScript'.
160-
Directory '/src/projects/b/src/node_modules' does not exist, skipping all lookups in it.
161-
Directory '/src/projects/b/node_modules' does not exist, skipping all lookups in it.
162-
Found 'package.json' at '/src/projects/node_modules/@types/pg/package.json'.
163-
'package.json' does not have a 'typesVersions' field.
164-
'package.json' does not have a 'typings' field.
165-
'package.json' has 'types' field 'index.d.ts' that references '/src/projects/node_modules/@types/pg/index.d.ts'.
166-
File '/src/projects/node_modules/@types/pg/index.d.ts' exist - use it as a name resolution result.
167-
Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', result '/src/projects/node_modules/@types/pg/index.d.ts'.
168-
======== Module name 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts'. ========
169-
File '/src/projects/node_modules/@types/pg/package.json' exists according to earlier cached lookups.
170-
======== Resolving type reference directive 'pg', containing file '/src/projects/b/__inferred type names__.ts', root directory '/src/projects/node_modules/@types'. ========
171-
Resolving with primary search path '/src/projects/node_modules/@types'.
172-
File '/src/projects/node_modules/@types/pg/package.json' exists according to earlier cached lookups.
173-
'package.json' does not have a 'typings' field.
174-
'package.json' has 'types' field 'index.d.ts' that references '/src/projects/node_modules/@types/pg/index.d.ts'.
175-
File '/src/projects/node_modules/@types/pg/index.d.ts' exist - use it as a name resolution result.
176-
Resolving real path for '/src/projects/node_modules/@types/pg/index.d.ts', result '/src/projects/node_modules/@types/pg/index.d.ts'.
177-
======== Type reference directive 'pg' was successfully resolved to '/src/projects/node_modules/@types/pg/index.d.ts', primary: true. ========
178-
File '/lib/package.json' does not exist.
179-
File '/package.json' does not exist.
180-
lib/lib.es2022.full.d.ts
181-
Default library for target 'es2022'
182-
src/projects/node_modules/@types/pg/index.d.ts
183-
Imported via "pg" from file 'src/projects/b/src/index.ts'
184-
Entry point for implicit type library 'pg'
185-
File is CommonJS module because 'src/projects/node_modules/@types/pg/package.json' does not have field "type"
186-
src/projects/b/src/index.ts
187-
Matched by default include pattern '**/*'
188-
File is ECMAScript module because 'src/projects/b/package.json' has field "type" with value "module"
189148
exitCode:: ExitStatus.Success
190149

191150

192-
//// [/src/projects/b/src/index.js]
193-
import pg from "pg";
194-
pg.foo();
195-
196-

0 commit comments

Comments
 (0)