Skip to content

Commit c268143

Browse files
committed
Maintain libPath resolution in program
1 parent 8f86b4c commit c268143

14 files changed

+19
-415
lines changed

Diff for: 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) {

Diff for: 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
*

Diff for: 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
]

Diff for: 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.",

Diff for: 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.",

Diff for: 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.",

0 commit comments

Comments
 (0)