Skip to content

Commit b179c7c

Browse files
committed
Dont store originalPath as separate, instead store originalPath || resolvedFileName and resolve the symlinks on read
1 parent 2bb56da commit b179c7c

26 files changed

+2053
-1952
lines changed

src/compiler/builder.ts

+21-22
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import {
5252
getEmitDeclarations,
5353
getNormalizedAbsolutePath,
5454
getOptionsNameMap,
55+
getOriginalAndResolvedFileName,
5556
getOriginalOrResolvedModuleFileName,
5657
getOriginalOrResolvedTypeReferenceFileName,
5758
getOwnKeys,
@@ -67,6 +68,7 @@ import {
6768
isJsonSourceFile,
6869
isNumber,
6970
isString,
71+
isTraceEnabled,
7072
map,
7173
mapDefined,
7274
maybeBind,
@@ -956,7 +958,6 @@ export type ProgramMultiFileEmitBuildInfoFileInfo = string | ProgramMultiFileEmi
956958
/** @internal */
957959
export interface ProgramBuildInfoResolved {
958960
readonly resolvedFileName: ProgramBuildInfoAbsoluteFileId;
959-
readonly originalPath: ProgramBuildInfoAbsoluteFileId | undefined;
960961
readonly packageId: PackageId | undefined;
961962
}
962963
/** @internal */
@@ -1455,10 +1456,9 @@ function getBuildInfo(state: BuilderProgramState, host: BuilderProgramHost, bund
14551456

14561457
function toProgramBuildInfoResolved(resolved: ResolvedModuleFull | ResolvedTypeReferenceDirective | undefined): ProgramBuildInfoAbsoluteFileId | ProgramBuildInfoResolved | undefined {
14571458
if (!resolved) return undefined;
1458-
const resolvedFileName = toAbsoluteFileId(resolved.resolvedFileName!);
1459-
const originalPath = resolved.originalPath ? toAbsoluteFileId(resolved.originalPath) : undefined;
1460-
if (!originalPath && !resolved.packageId) return resolvedFileName;
1461-
return { resolvedFileName, originalPath, packageId: resolved.packageId };
1459+
const resolvedFileName = toAbsoluteFileId(resolved.originalPath || resolved.resolvedFileName!);
1460+
if (!resolved.packageId) return resolvedFileName;
1461+
return { resolvedFileName, packageId: resolved.packageId };
14621462
}
14631463
}
14641464

@@ -2168,6 +2168,7 @@ export function createOldBuildInfoProgram(
21682168
let resolutions: (Resolution | false)[] | undefined;
21692169
let originalPathOrResolvedFileNames: string[] | undefined;
21702170
let resolutionEntries: ResolutionEntry[] | undefined;
2171+
const traceEnabled = isTraceEnabled(host.getCompilerOptions(), host.compilerHost);
21712172
return {
21722173
getCompilerOptions: () => compilerOptions,
21732174
getResolvedModule: (name, mode, dirPath, redirectedReference) => getResolvedFromCache(
@@ -2199,7 +2200,7 @@ export function createOldBuildInfoProgram(
21992200

22002201
function fileExists(fileName: string) {
22012202
let result = fileExistsMap.get(fileName);
2202-
if (result === undefined) fileExistsMap.set(fileName, result = host.fileExists(fileName));
2203+
if (result === undefined) fileExistsMap.set(fileName, result = host.compilerHost.fileExists(fileName));
22032204
return result;
22042205
}
22052206

@@ -2212,7 +2213,7 @@ export function createOldBuildInfoProgram(
22122213
const packageJsonInfo = host.getPackageJsonInfo(fileName);
22132214
const currentText = typeof packageJsonInfo === "object" ? packageJsonInfo.contents.packageJsonText : undefined;
22142215
if (isString(expected)) {
2215-
result = !!currentText && (host.createHash ?? generateDjb2Hash)(currentText) === expected;
2216+
result = !!currentText && (host.compilerHost.createHash ?? generateDjb2Hash)(currentText) === expected;
22162217
}
22172218
else {
22182219
result = currentText === expected?.packageJsonText;
@@ -2303,7 +2304,6 @@ export function createOldBuildInfoProgram(
23032304
// If we are using the cache, directly get from there
23042305
const fromCache = cache?.getFromCache(name, mode, dirPath, options);
23052306
if (fromCache) {
2306-
// TODO:: symlinks
23072307
const resolvedFileName = getResolvedFileName(fromCache);
23082308
return resolvedFileName && fileExists(resolvedFileName) && every(
23092309
fromCache.affectingLocations,
@@ -2336,7 +2336,7 @@ export function createOldBuildInfoProgram(
23362336
if (!reusableResolutionsCache.decoded) return undefined;
23372337
}
23382338
const resolutionId = reusableResolutionsCache.decoded.getFromCache(name, mode, dirPath, options);
2339-
return resolutionId ? toResolution(resolutionId) as T : undefined;
2339+
return resolutionId ? toResolution(resolutionId, name) as T : undefined;
23402340
}
23412341

23422342
function setBuildInfoResolutionEntries(
@@ -2382,12 +2382,8 @@ export function createOldBuildInfoProgram(
23822382
return resuableCacheResolutions!.cache.names[nameId - 1];
23832383
}
23842384

2385-
function toResolvedFileName(resolved: ProgramBuildInfoAbsoluteFileId | ProgramBuildInfoResolved) {
2386-
return isNumber(resolved) ? resolved : resolved.resolvedFileName;
2387-
}
2388-
23892385
function toOriginalOrResolvedFileName(resolved: ProgramBuildInfoAbsoluteFileId | ProgramBuildInfoResolved) {
2390-
return isNumber(resolved) ? resolved : resolved.originalPath || resolved.resolvedFileName;
2386+
return isNumber(resolved) ? resolved : resolved.resolvedFileName;
23912387
}
23922388

23932389
function toOriginalOrResolvedModuleFileName(resolutionId: ProgramBuildInfoResolutionId): string {
@@ -2413,13 +2409,13 @@ export function createOldBuildInfoProgram(
24132409
return affectingLocationsSame(file, hash) ? file : undefined;
24142410
}
24152411

2416-
function toResolution(resolutionId: ProgramBuildInfoResolutionId): Resolution | undefined {
2412+
function toResolution(resolutionId: ProgramBuildInfoResolutionId, name: string): Resolution | undefined {
24172413
const existing = resolutions?.[resolutionId - 1];
24182414
if (existing !== undefined) return existing || undefined;
24192415
resolutions ??= new Array(resuableCacheResolutions!.cache.resolutions.length);
24202416
const resolution = resuableCacheResolutions!.cache.resolutions[resolutionId - 1];
24212417
const resolvedFileName = resuableCacheResolutions!.getProgramBuildInfoFilePathDecoder().toFileAbsolutePath(
2422-
toResolvedFileName(resolution.resolvedModule || resolution.resolvedTypeReferenceDirective!)
2418+
toOriginalOrResolvedFileName(resolution.resolvedModule || resolution.resolvedTypeReferenceDirective!)
24232419
);
24242420
let affectingLocations: string[] | undefined;
24252421
if (fileExists(resolvedFileName) && every(resolution.affectingLocations, fileId => {
@@ -2430,8 +2426,8 @@ export function createOldBuildInfoProgram(
24302426
// Type Ref doesnt need extension
24312427
const extenstion = resolution.resolvedModule ? extensionFromPath(resolvedFileName) : undefined!;
24322428
return resolutions[resolutionId - 1] = {
2433-
resolvedModule: toResolved(resolution.resolvedModule, resolvedFileName, extenstion, /*primary*/ undefined),
2434-
resolvedTypeReferenceDirective: toResolved(resolution.resolvedTypeReferenceDirective, resolvedFileName, extenstion, !resolution.notPrimary),
2429+
resolvedModule: toResolved(resolution.resolvedModule, resolvedFileName, extenstion, name, /*primary*/ undefined),
2430+
resolvedTypeReferenceDirective: toResolved(resolution.resolvedTypeReferenceDirective, resolvedFileName, extenstion, /*name*/ undefined, !resolution.notPrimary),
24352431
affectingLocations,
24362432
resolutionDiagnostics: resolution.resolutionDiagnostics?.length ? convertToDiagnostics(resolution.resolutionDiagnostics, /*newProgram*/ undefined!) as Diagnostic[] : undefined
24372433
};
@@ -2444,18 +2440,21 @@ export function createOldBuildInfoProgram(
24442440
resolved: ProgramBuildInfoAbsoluteFileId | ProgramBuildInfoResolved | undefined,
24452441
resolvedFileName: string,
24462442
extension: Extension,
2443+
name: string | undefined,
24472444
primary: boolean | undefined,
24482445
): (ResolvedModuleFull & ResolvedTypeReferenceDirective) | undefined {
24492446
if (!resolved) return undefined;
2450-
const originalPath = isNumber(resolved) || !resolved.originalPath ?
2451-
undefined :
2452-
resuableCacheResolutions!.getProgramBuildInfoFilePathDecoder().toFileAbsolutePath(resolved.originalPath);
2447+
let originalPath: string | undefined;
2448+
const isExternalLibraryImport = pathContainsNodeModules(resolvedFileName);
2449+
if (!host.getCompilerOptions().preserveSymlinks && (!name || (isExternalLibraryImport && !isExternalModuleNameRelative(name)))) {
2450+
({ resolvedFileName, originalPath } = getOriginalAndResolvedFileName(resolvedFileName, host.compilerHost, traceEnabled));
2451+
}
24532452
const packageId = isNumber(resolved) ? undefined : resolved.packageId;
24542453
return {
24552454
resolvedFileName,
24562455
originalPath,
24572456
packageId,
2458-
isExternalLibraryImport: pathContainsNodeModules(originalPath || resolvedFileName),
2457+
isExternalLibraryImport,
24592458
extension,
24602459
primary,
24612460
};

src/compiler/moduleNameResolver.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,8 @@ function arePathsEqual(path1: string, path2: string, host: ModuleResolutionHost)
467467
return comparePaths(path1, path2, !useCaseSensitiveFileNames) === Comparison.EqualTo;
468468
}
469469

470-
function getOriginalAndResolvedFileName(fileName: string, host: ModuleResolutionHost, traceEnabled: boolean) {
470+
/** @internal */
471+
export function getOriginalAndResolvedFileName(fileName: string, host: ModuleResolutionHost, traceEnabled: boolean) {
471472
const resolvedFileName = realPath(fileName, host, traceEnabled);
472473
const pathsAreEqual = arePathsEqual(fileName, resolvedFileName, host);
473474
return {

src/compiler/program.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1582,9 +1582,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
15821582
if (!oldProgram && typeof oldProgramOrOldBuildInfoProgramConstructor === "function") {
15831583
const state = getTemporaryModuleResolutionState(moduleResolutionCache?.getPackageJsonInfoCache(), host, options);
15841584
oldBuildInfoProgram = oldProgramOrOldBuildInfoProgramConstructor({
1585-
fileExists: fileName => host.fileExists(fileName),
1585+
compilerHost: host,
15861586
getCompilerOptions: () => options,
1587-
createHash: maybeBind(host, host.createHash),
15881587
getPackageJsonInfo: fileName => getPackageJsonInfo(getDirectoryPath(fileName), /*onlyRecordFailures*/ false, state),
15891588
});
15901589
if (oldBuildInfoProgram) {

src/compiler/types.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -6988,9 +6988,8 @@ export interface OldBuildInfoProgram {
69886988

69896989
/** @internal */
69906990
export interface OldBuildInfoProgramHost {
6991-
fileExists(fileName: string): boolean;
6991+
compilerHost: CompilerHost;
69926992
getCompilerOptions(): CompilerOptions;
6993-
createHash?(data: string): string;
69946993
getPackageJsonInfo(fileName: string): PackageJsonInfo | undefined;
69956994
}
69966995

src/testRunner/unittests/tsc/helpers.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -538,9 +538,8 @@ type ReadableProgramBuildInfoFileInfo<T> = Omit<ts.BuilderState.FileInfo, "impli
538538
impliedFormat: string | undefined;
539539
original: T | undefined;
540540
};
541-
type ReadableProgramBuildInfoResolved = string | Omit<ts.ProgramBuildInfoResolved, "resolvedFileName" | "originalPath"> & {
541+
type ReadableProgramBuildInfoResolved = string | Omit<ts.ProgramBuildInfoResolved, "resolvedFileName"> & {
542542
readonly resolvedFileName: string;
543-
readonly originalPath: string | undefined;
544543
};
545544
type ReadableProgramBuildInfoResolution = Omit<ts.ProgramBuildInfoResolution, "resolvedModule" | "resolvedTypeReferenceDirective" | "failedLookupLocations" | "affectingLocations"> & {
546545
readonly resolutionId: ts.ProgramBuildInfoResolutionId;
@@ -794,7 +793,6 @@ function generateBuildInfoProgramBaseline(sys: ts.System, buildInfoPath: string,
794793
return resolved && (ts.isNumber(resolved) ? toFileName(resolved) : {
795794
...resolved,
796795
resolvedFileName: toFileName(resolved.resolvedFileName),
797-
originalPath: resolved.originalPath ? toFileName(resolved.originalPath) : undefined,
798796
});
799797
}
800798

tests/baselines/reference/tsbuild/cacheResolutions/bundle-emit.js

+6
Original file line numberDiff line numberDiff line change
@@ -985,9 +985,12 @@ Output::
985985
/lib/tsc -b /src/project --explainFiles
986986
Reusing resolution of module 'pkg0' from '/src/project/fileWithImports.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg0.d.ts'.
987987
Reusing resolution of module 'pkg1' from '/src/project/fileWithImports.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg1.d.ts'.
988+
Resolving real path for '/src/project/node_modules/pkg2/index.d.ts', result '/src/project/node_modules/pkg2/index.d.ts'.
988989
Reusing resolution of type reference directive 'pkg2' from '/src/project/fileWithTypeRefs.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/pkg2/index.d.ts'.
990+
Resolving real path for '/src/project/node_modules/pkg3/index.d.ts', result '/src/project/node_modules/pkg3/index.d.ts'.
989991
Reusing resolution of type reference directive 'pkg3' from '/src/project/fileWithTypeRefs.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/pkg3/index.d.ts'.
990992
Reusing resolution of module 'pkg0' from '/src/project/randomFileForImport.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg0.d.ts'.
993+
Resolving real path for '/src/project/node_modules/@types/pkg4/index.d.ts', result '/src/project/node_modules/@types/pkg4/index.d.ts'.
991994
Reusing resolution of type reference directive 'pkg4' from '/src/project/__inferred type names__.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/@types/pkg4/index.d.ts'.
992995
lib/lib.d.ts
993996
Default library for target 'es5'
@@ -1324,10 +1327,13 @@ Output::
13241327
/lib/tsc -b /src/project --explainFiles
13251328
Reusing resolution of module 'pkg0' from '/src/project/fileWithImports.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg0.d.ts'.
13261329
Reusing resolution of module 'pkg1' from '/src/project/fileWithImports.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg1.d.ts'.
1330+
Resolving real path for '/src/project/node_modules/pkg2/index.d.ts', result '/src/project/node_modules/pkg2/index.d.ts'.
13271331
Reusing resolution of type reference directive 'pkg2' from '/src/project/fileWithTypeRefs.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/pkg2/index.d.ts'.
1332+
Resolving real path for '/src/project/node_modules/pkg3/index.d.ts', result '/src/project/node_modules/pkg3/index.d.ts'.
13281333
Reusing resolution of type reference directive 'pkg3' from '/src/project/fileWithTypeRefs.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/pkg3/index.d.ts'.
13291334
Reusing resolution of module 'pkg0' from '/src/project/randomFileForImport.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/pkg0.d.ts'.
13301335
Reusing resolution of type reference directive 'pkg2' from '/src/project/randomFileForTypeRef.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/pkg2/index.d.ts'.
1336+
Resolving real path for '/src/project/node_modules/@types/pkg4/index.d.ts', result '/src/project/node_modules/@types/pkg4/index.d.ts'.
13311337
Reusing resolution of type reference directive 'pkg4' from '/src/project/__inferred type names__.ts' found in cache from location '/src/project', it was successfully resolved to '/src/project/node_modules/@types/pkg4/index.d.ts'.
13321338
lib/lib.d.ts
13331339
Default library for target 'es5'

0 commit comments

Comments
 (0)