Skip to content

Commit c5dc1a0

Browse files
committed
Maintain libPath resolution in program
1 parent f30c951 commit c5dc1a0

28 files changed

+19
-760
lines changed

src/compiler/program.ts

+13-6
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
14691469
let automaticTypeDirectiveNames: string[] | undefined;
14701470
let automaticTypeDirectiveResolutions: ModeAwareCache<ResolvedTypeReferenceDirectiveWithFailedLookupLocations>;
14711471

1472+
let resolvedLibReferences: Map<string, string> | undefined;
1473+
14721474
// The below settings are to track if a .js file should be add to the program if loaded via searching under node_modules.
14731475
// This works as imported modules are discovered recursively in a depth first manner, specifically:
14741476
// - For each root file, findSourceFile is called.
@@ -1813,6 +1815,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
18131815
sourceFileToPackageName,
18141816
redirectTargetsMap,
18151817
usesUriStyleNodeCoreModules,
1818+
resolvedLibReferences,
18161819
isEmittedFile,
18171820
getConfigFileParsingDiagnostics,
18181821
getProjectReferences,
@@ -2481,6 +2484,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
24812484
sourceFileToPackageName = oldProgram.sourceFileToPackageName;
24822485
redirectTargetsMap = oldProgram.redirectTargetsMap;
24832486
usesUriStyleNodeCoreModules = oldProgram.usesUriStyleNodeCoreModules;
2487+
resolvedLibReferences = oldProgram.resolvedLibReferences;
24842488

24852489
return StructureIsReused.Completely;
24862490
}
@@ -2596,7 +2600,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
25962600
return equalityComparer(file.fileName, getDefaultLibraryFileName());
25972601
}
25982602
else {
2599-
return some(options.lib, libFileName => equalityComparer(file.fileName, pathForLibFile(libFileName)));
2603+
return some(options.lib, libFileName => equalityComparer(file.fileName, resolvedLibReferences!.get(libFileName)!));
26002604
}
26012605
}
26022606

@@ -3313,7 +3317,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
33133317
const libName = toFileNameLowerCase(ref.fileName);
33143318
const libFileName = libMap.get(libName);
33153319
if (libFileName) {
3316-
return getSourceFile(pathForLibFile(libFileName));
3320+
return getSourceFile(resolvedLibReferences?.get(libFileName)!);
33173321
}
33183322
}
33193323

@@ -3810,6 +3814,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
38103814
}
38113815

38123816
function pathForLibFile(libFileName: string): string {
3817+
const existing = resolvedLibReferences?.get(libFileName);
3818+
if (existing) return existing;
38133819
// Support resolving to lib.dom.d.ts -> @typescript/lib-dom, and
38143820
// lib.dom.iterable.d.ts -> @typescript/lib-dom/iterable
38153821
// lib.es2015.symbol.wellknown.d.ts -> @typescript/lib-es2015/symbol-wellknown
@@ -3823,10 +3829,11 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
38233829
const containingDirectory = options.configFilePath ? getDirectoryPath(options.configFilePath) : currentDirectory;
38243830
const resolveFrom = combinePaths(containingDirectory, `__lib_node_modules_lookup_${libFileName}__.ts`);
38253831
const localOverrideModuleResult = resolveModuleName("@typescript/lib-" + path, resolveFrom, { moduleResolution: ModuleResolutionKind.Node10, traceResolution: options.traceResolution }, host, moduleResolutionCache);
3826-
if (localOverrideModuleResult?.resolvedModule) {
3827-
return localOverrideModuleResult.resolvedModule.resolvedFileName;
3828-
}
3829-
return combinePaths(defaultLibraryPath, libFileName);
3832+
const result = localOverrideModuleResult?.resolvedModule ?
3833+
localOverrideModuleResult.resolvedModule.resolvedFileName :
3834+
combinePaths(defaultLibraryPath, libFileName);
3835+
(resolvedLibReferences ??= new Map()).set(libFileName, result);
3836+
return result;
38303837
}
38313838

38323839
function processLibReferenceDirectives(file: SourceFile) {

src/compiler/types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -4825,6 +4825,11 @@ export interface Program extends ScriptReferenceHost {
48254825
* @internal
48264826
*/
48274827
readonly usesUriStyleNodeCoreModules: boolean;
4828+
/**
4829+
* Map from libFileName to actual resolved location of the lib
4830+
* @internal
4831+
*/
4832+
resolvedLibReferences: Map<string, string> | undefined;
48284833
/**
48294834
* Is the file emitted file
48304835
*

tests/baselines/reference/jsdocInTypeScript.trace.json

+1-10
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@
9898
"Directory 'node_modules' does not exist, skipping all lookups in it.",
9999
"Directory '/node_modules' does not exist, skipping all lookups in it.",
100100
"======== Module name '@typescript/lib-es2015/generator' was not resolved. ========",
101-
"======== Resolving module '@typescript/lib-es2015/iterable' from '__lib_node_modules_lookup_lib.es2015.iterable.d.ts__.ts'. ========",
102-
"Resolution for module '@typescript/lib-es2015/iterable' was found in cache from location '/.src'.",
103-
"======== Module name '@typescript/lib-es2015/iterable' was not resolved. ========",
104101
"======== Resolving module '@typescript/lib-es2015/promise' from '__lib_node_modules_lookup_lib.es2015.promise.d.ts__.ts'. ========",
105102
"Explicitly specified module resolution kind: 'Node10'.",
106103
"Loading module '@typescript/lib-es2015/promise' from 'node_modules' folder, target file types: TypeScript, Declaration.",
@@ -134,9 +131,6 @@
134131
"Directory 'node_modules' does not exist, skipping all lookups in it.",
135132
"Directory '/node_modules' does not exist, skipping all lookups in it.",
136133
"======== Module name '@typescript/lib-es2015/reflect' was not resolved. ========",
137-
"======== Resolving module '@typescript/lib-es2015/symbol' from '__lib_node_modules_lookup_lib.es2015.symbol.d.ts__.ts'. ========",
138-
"Resolution for module '@typescript/lib-es2015/symbol' was found in cache from location '/.src'.",
139-
"======== Module name '@typescript/lib-es2015/symbol' was not resolved. ========",
140134
"======== Resolving module '@typescript/lib-es2015/symbol-wellknown' from '__lib_node_modules_lookup_lib.es2015.symbol.wellknown.d.ts__.ts'. ========",
141135
"Explicitly specified module resolution kind: 'Node10'.",
142136
"Loading module '@typescript/lib-es2015/symbol-wellknown' from 'node_modules' folder, target file types: TypeScript, Declaration.",
@@ -147,8 +141,5 @@
147141
"Loading module '@typescript/lib-es2015/symbol-wellknown' from 'node_modules' folder, target file types: JavaScript.",
148142
"Directory 'node_modules' does not exist, skipping all lookups in it.",
149143
"Directory '/node_modules' does not exist, skipping all lookups in it.",
150-
"======== Module name '@typescript/lib-es2015/symbol-wellknown' was not resolved. ========",
151-
"======== Resolving module '@typescript/lib-es2015/symbol' from '__lib_node_modules_lookup_lib.es2015.symbol.d.ts__.ts'. ========",
152-
"Resolution for module '@typescript/lib-es2015/symbol' was found in cache from location '/.src'.",
153-
"======== Module name '@typescript/lib-es2015/symbol' was not resolved. ========"
144+
"======== Module name '@typescript/lib-es2015/symbol-wellknown' was not resolved. ========"
154145
]

tests/baselines/reference/libTypeScriptOverrideSimple.trace.json

-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@
5353
"Loading module '@typescript/lib-decorators/legacy' from 'node_modules' folder, target file types: JavaScript.",
5454
"Directory 'node_modules' does not exist, skipping all lookups in it.",
5555
"======== Module name '@typescript/lib-decorators/legacy' was not resolved. ========",
56-
"======== Resolving module '@typescript/lib-dom' from '__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========",
57-
"Resolution for module '@typescript/lib-dom' was found in cache from location '/.src'.",
58-
"======== Module name '@typescript/lib-dom' was successfully resolved to '/node_modules/@typescript/lib-dom/index.d.ts'. ========",
5956
"======== Resolving module '@typescript/lib-webworker/importscripts' from '__lib_node_modules_lookup_lib.webworker.importscripts.d.ts__.ts'. ========",
6057
"Explicitly specified module resolution kind: 'Node10'.",
6158
"Loading module '@typescript/lib-webworker/importscripts' from 'node_modules' folder, target file types: TypeScript, Declaration.",

tests/baselines/reference/libTypeScriptOverrideSimpleConfig.trace.json

-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@
5151
"Loading module '@typescript/lib-decorators/legacy' from 'node_modules' folder, target file types: JavaScript.",
5252
"Directory '/node_modules' does not exist, skipping all lookups in it.",
5353
"======== Module name '@typescript/lib-decorators/legacy' was not resolved. ========",
54-
"======== Resolving module '@typescript/lib-dom' from '/somepath/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========",
55-
"Resolution for module '@typescript/lib-dom' was found in cache from location '/somepath'.",
56-
"======== Module name '@typescript/lib-dom' was successfully resolved to '/somepath/node_modules/@typescript/lib-dom/index.d.ts'. ========",
5754
"======== Resolving module '@typescript/lib-webworker/importscripts' from '/somepath/__lib_node_modules_lookup_lib.webworker.importscripts.d.ts__.ts'. ========",
5855
"Explicitly specified module resolution kind: 'Node10'.",
5956
"Loading module '@typescript/lib-webworker/importscripts' from 'node_modules' folder, target file types: TypeScript, Declaration.",

tests/baselines/reference/moduleResolutionWithExtensions_withPaths.trace.json

-9
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@
104104
"Scoped package detected, looking in 'typescript__lib-es2015/generator'",
105105
"Loading module '@typescript/lib-es2015/generator' from 'node_modules' folder, target file types: JavaScript.",
106106
"======== Module name '@typescript/lib-es2015/generator' was not resolved. ========",
107-
"======== Resolving module '@typescript/lib-es2015/iterable' from '/__lib_node_modules_lookup_lib.es2015.iterable.d.ts__.ts'. ========",
108-
"Resolution for module '@typescript/lib-es2015/iterable' was found in cache from location '/'.",
109-
"======== Module name '@typescript/lib-es2015/iterable' was not resolved. ========",
110107
"======== Resolving module '@typescript/lib-es2015/promise' from '/__lib_node_modules_lookup_lib.es2015.promise.d.ts__.ts'. ========",
111108
"Explicitly specified module resolution kind: 'Node10'.",
112109
"Loading module '@typescript/lib-es2015/promise' from 'node_modules' folder, target file types: TypeScript, Declaration.",
@@ -128,19 +125,13 @@
128125
"Scoped package detected, looking in 'typescript__lib-es2015/reflect'",
129126
"Loading module '@typescript/lib-es2015/reflect' from 'node_modules' folder, target file types: JavaScript.",
130127
"======== Module name '@typescript/lib-es2015/reflect' was not resolved. ========",
131-
"======== Resolving module '@typescript/lib-es2015/symbol' from '/__lib_node_modules_lookup_lib.es2015.symbol.d.ts__.ts'. ========",
132-
"Resolution for module '@typescript/lib-es2015/symbol' was found in cache from location '/'.",
133-
"======== Module name '@typescript/lib-es2015/symbol' was not resolved. ========",
134128
"======== Resolving module '@typescript/lib-es2015/symbol-wellknown' from '/__lib_node_modules_lookup_lib.es2015.symbol.wellknown.d.ts__.ts'. ========",
135129
"Explicitly specified module resolution kind: 'Node10'.",
136130
"Loading module '@typescript/lib-es2015/symbol-wellknown' from 'node_modules' folder, target file types: TypeScript, Declaration.",
137131
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
138132
"Scoped package detected, looking in 'typescript__lib-es2015/symbol-wellknown'",
139133
"Loading module '@typescript/lib-es2015/symbol-wellknown' from 'node_modules' folder, target file types: JavaScript.",
140134
"======== Module name '@typescript/lib-es2015/symbol-wellknown' was not resolved. ========",
141-
"======== Resolving module '@typescript/lib-es2015/symbol' from '/__lib_node_modules_lookup_lib.es2015.symbol.d.ts__.ts'. ========",
142-
"Resolution for module '@typescript/lib-es2015/symbol' was found in cache from location '/'.",
143-
"======== Module name '@typescript/lib-es2015/symbol' was not resolved. ========",
144135
"======== Resolving module '@typescript/lib-dom' from '/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========",
145136
"Explicitly specified module resolution kind: 'Node10'.",
146137
"Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: TypeScript, Declaration.",

tests/baselines/reference/tsbuild/libraryResolution/with-config-with-redirection.js

-12
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,6 @@ File '/home/src/projects/project1/typeroot1/sometype/package.json' does not exis
210210
File '/home/src/projects/project1/typeroot1/sometype/index.d.ts' exists - use it as a name resolution result.
211211
Resolving real path for '/home/src/projects/project1/typeroot1/sometype/index.d.ts', result '/home/src/projects/project1/typeroot1/sometype/index.d.ts'.
212212
======== Type reference directive 'sometype' was successfully resolved to '/home/src/projects/project1/typeroot1/sometype/index.d.ts', primary: true. ========
213-
======== Resolving module '@typescript/lib-es5' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========
214-
Resolution for module '@typescript/lib-es5' was found in cache from location '/home/src/projects/project1'.
215-
======== Module name '@typescript/lib-es5' was successfully resolved to '/home/src/projects/node_modules/@typescript/lib-es5/index.d.ts'. ========
216213
======== Resolving module '@typescript/lib-dom' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========
217214
Explicitly specified module resolution kind: 'Node10'.
218215
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: TypeScript, Declaration.
@@ -227,15 +224,6 @@ File '/home/src/projects/node_modules/@typescript/lib-dom/index.tsx' does not ex
227224
File '/home/src/projects/node_modules/@typescript/lib-dom/index.d.ts' exists - use it as a name resolution result.
228225
Resolving real path for '/home/src/projects/node_modules/@typescript/lib-dom/index.d.ts', result '/home/src/projects/node_modules/@typescript/lib-dom/index.d.ts'.
229226
======== Module name '@typescript/lib-dom' was successfully resolved to '/home/src/projects/node_modules/@typescript/lib-dom/index.d.ts'. ========
230-
======== Resolving module '@typescript/lib-webworker' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.webworker.d.ts__.ts'. ========
231-
Resolution for module '@typescript/lib-webworker' was found in cache from location '/home/src/projects/project1'.
232-
======== Module name '@typescript/lib-webworker' was successfully resolved to '/home/src/projects/node_modules/@typescript/lib-webworker/index.d.ts'. ========
233-
======== Resolving module '@typescript/lib-scripthost' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.scripthost.d.ts__.ts'. ========
234-
Resolution for module '@typescript/lib-scripthost' was found in cache from location '/home/src/projects/project1'.
235-
======== Module name '@typescript/lib-scripthost' was successfully resolved to '/home/src/projects/node_modules/@typescript/lib-scripthost/index.d.ts'. ========
236-
======== Resolving module '@typescript/lib-es5' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========
237-
Resolution for module '@typescript/lib-es5' was found in cache from location '/home/src/projects/project1'.
238-
======== Module name '@typescript/lib-es5' was successfully resolved to '/home/src/projects/node_modules/@typescript/lib-es5/index.d.ts'. ========
239227
node_modules/@typescript/lib-webworker/index.d.ts
240228
Library referenced via 'webworker' from file 'project1/file2.ts'
241229
node_modules/@typescript/lib-scripthost/index.d.ts

tests/baselines/reference/tsbuild/libraryResolution/with-config.js

-12
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,6 @@ File '/home/src/projects/project1/typeroot1/sometype/package.json' does not exis
201201
File '/home/src/projects/project1/typeroot1/sometype/index.d.ts' exists - use it as a name resolution result.
202202
Resolving real path for '/home/src/projects/project1/typeroot1/sometype/index.d.ts', result '/home/src/projects/project1/typeroot1/sometype/index.d.ts'.
203203
======== Type reference directive 'sometype' was successfully resolved to '/home/src/projects/project1/typeroot1/sometype/index.d.ts', primary: true. ========
204-
======== Resolving module '@typescript/lib-es5' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========
205-
Resolution for module '@typescript/lib-es5' was found in cache from location '/home/src/projects/project1'.
206-
======== Module name '@typescript/lib-es5' was not resolved. ========
207204
======== Resolving module '@typescript/lib-dom' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.dom.d.ts__.ts'. ========
208205
Explicitly specified module resolution kind: 'Node10'.
209206
Loading module '@typescript/lib-dom' from 'node_modules' folder, target file types: TypeScript, Declaration.
@@ -228,15 +225,6 @@ Directory '/home/src/node_modules' does not exist, skipping all lookups in it.
228225
Directory '/home/node_modules' does not exist, skipping all lookups in it.
229226
Directory '/node_modules' does not exist, skipping all lookups in it.
230227
======== Module name '@typescript/lib-dom' was not resolved. ========
231-
======== Resolving module '@typescript/lib-webworker' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.webworker.d.ts__.ts'. ========
232-
Resolution for module '@typescript/lib-webworker' was found in cache from location '/home/src/projects/project1'.
233-
======== Module name '@typescript/lib-webworker' was not resolved. ========
234-
======== Resolving module '@typescript/lib-scripthost' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.scripthost.d.ts__.ts'. ========
235-
Resolution for module '@typescript/lib-scripthost' was found in cache from location '/home/src/projects/project1'.
236-
======== Module name '@typescript/lib-scripthost' was not resolved. ========
237-
======== Resolving module '@typescript/lib-es5' from '/home/src/projects/project1/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========
238-
Resolution for module '@typescript/lib-es5' was found in cache from location '/home/src/projects/project1'.
239-
======== Module name '@typescript/lib-es5' was not resolved. ========
240228
../lib/lib.es5.d.ts
241229
Library referenced via 'es5' from file 'project1/file2.ts'
242230
Library 'lib.es5.d.ts' specified in compilerOptions

0 commit comments

Comments
 (0)