diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 334c054a8fb..7b31d09ad68 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -135,7 +135,7 @@ namespace ts { sys.writeFile(fileName, data, writeByteOrderMark); - const mtimeAfter = sys.getModifiedTime!(fileName); // TODO: GH#18217 + const mtimeAfter = sys.getModifiedTime!(fileName) || missingFileModifiedTime; // TODO: GH#18217 outputFingerprints.set(fileName, { hash, diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 4edba26333a..8f6a58a3567 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -482,7 +482,7 @@ namespace ts { getCurrentDirectory(): string; getDirectories(path: string): string[]; readDirectory(path: string, extensions?: ReadonlyArray, exclude?: ReadonlyArray, include?: ReadonlyArray, depth?: number): string[]; - getModifiedTime?(path: string): Date; + getModifiedTime?(path: string): Date | undefined; setModifiedTime?(path: string, time: Date): void; deleteFile?(path: string): void; /** diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index 5c9c7086db8..205e7cd8940 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -843,14 +843,18 @@ namespace ts { return buildHost.message(Diagnostics.A_non_dry_build_would_build_project_0, proj.options.configFilePath!); } - if (context.options.verbose) buildHost.verbose(Diagnostics.Updating_output_timestamps_of_project_0, proj.options.configFilePath!); + if (context.options.verbose) { + buildHost.verbose(Diagnostics.Updating_output_timestamps_of_project_0, proj.options.configFilePath!); + } + const now = new Date(); const outputs = getAllProjectOutputs(proj); let priorNewestUpdateTime = minimumDate; for (const file of outputs) { if (isDeclarationFile(file)) { - priorNewestUpdateTime = newer(priorNewestUpdateTime, compilerHost.getModifiedTime!(file)); + priorNewestUpdateTime = newer(priorNewestUpdateTime, compilerHost.getModifiedTime!(file) || missingFileModifiedTime); } + compilerHost.setModifiedTime!(file, now); } @@ -1057,7 +1061,7 @@ namespace ts { }; } - const inputTime = host.getModifiedTime(inputFile); + const inputTime = host.getModifiedTime(inputFile) || missingFileModifiedTime; if (inputTime > newestInputFileTime) { newestInputFileName = inputFile; newestInputFileTime = inputTime; @@ -1089,7 +1093,7 @@ namespace ts { break; } - const outputTime = host.getModifiedTime(output); + const outputTime = host.getModifiedTime(output) || missingFileModifiedTime; if (outputTime < oldestOutputFileTime) { oldestOutputFileTime = outputTime; oldestOutputFileName = output; @@ -1117,7 +1121,8 @@ namespace ts { newestDeclarationFileContentChangedTime = newer(unchangedTime, newestDeclarationFileContentChangedTime); } else { - newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, host.getModifiedTime(output)); + const outputModifiedTime = host.getModifiedTime(output) || missingFileModifiedTime; + newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, outputModifiedTime); } } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 54f85349bf1..87664652b35 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -4684,7 +4684,7 @@ namespace ts { export interface UpToDateHost { fileExists(fileName: string): boolean; - getModifiedTime(fileName: string): Date; + getModifiedTime(fileName: string): Date | undefined; getUnchangedTime?(fileName: string): Date | undefined; getLastStatus?(fileName: string): UpToDateStatus | undefined; setLastStatus?(fileName: string, status: UpToDateStatus): void; @@ -4822,7 +4822,7 @@ namespace ts { /* @internal */ hasChangedAutomaticTypeDirectiveNames?: boolean; createHash?(data: string): string; - getModifiedTime?(fileName: string): Date; + getModifiedTime?(fileName: string): Date | undefined; setModifiedTime?(fileName: string, date: Date): void; deleteFile?(fileName: string): void; } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index eede4badc7e..5118830e840 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2584,7 +2584,7 @@ declare namespace ts { } interface UpToDateHost { fileExists(fileName: string): boolean; - getModifiedTime(fileName: string): Date; + getModifiedTime(fileName: string): Date | undefined; getUnchangedTime?(fileName: string): Date | undefined; getLastStatus?(fileName: string): UpToDateStatus | undefined; setLastStatus?(fileName: string, status: UpToDateStatus): void; @@ -2688,7 +2688,7 @@ declare namespace ts { resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[], containingFile: string): ResolvedTypeReferenceDirective[]; getEnvironmentVariable?(name: string): string | undefined; createHash?(data: string): string; - getModifiedTime?(fileName: string): Date; + getModifiedTime?(fileName: string): Date | undefined; setModifiedTime?(fileName: string, date: Date): void; deleteFile?(fileName: string): void; } @@ -3025,7 +3025,7 @@ declare namespace ts { getCurrentDirectory(): string; getDirectories(path: string): string[]; readDirectory(path: string, extensions?: ReadonlyArray, exclude?: ReadonlyArray, include?: ReadonlyArray, depth?: number): string[]; - getModifiedTime?(path: string): Date; + getModifiedTime?(path: string): Date | undefined; setModifiedTime?(path: string, time: Date): void; deleteFile?(path: string): void; /** diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index bf75c37782b..488f7c85a69 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2584,7 +2584,7 @@ declare namespace ts { } interface UpToDateHost { fileExists(fileName: string): boolean; - getModifiedTime(fileName: string): Date; + getModifiedTime(fileName: string): Date | undefined; getUnchangedTime?(fileName: string): Date | undefined; getLastStatus?(fileName: string): UpToDateStatus | undefined; setLastStatus?(fileName: string, status: UpToDateStatus): void; @@ -2688,7 +2688,7 @@ declare namespace ts { resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[], containingFile: string): ResolvedTypeReferenceDirective[]; getEnvironmentVariable?(name: string): string | undefined; createHash?(data: string): string; - getModifiedTime?(fileName: string): Date; + getModifiedTime?(fileName: string): Date | undefined; setModifiedTime?(fileName: string, date: Date): void; deleteFile?(fileName: string): void; } @@ -3025,7 +3025,7 @@ declare namespace ts { getCurrentDirectory(): string; getDirectories(path: string): string[]; readDirectory(path: string, extensions?: ReadonlyArray, exclude?: ReadonlyArray, include?: ReadonlyArray, depth?: number): string[]; - getModifiedTime?(path: string): Date; + getModifiedTime?(path: string): Date | undefined; setModifiedTime?(path: string, time: Date): void; deleteFile?(path: string): void; /**