From bf567b8a40aaf1b78e24b09a010d937a43b27523 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Mon, 16 Jul 2018 11:10:09 +0300 Subject: [PATCH 1/3] Change getModifiedTime type --- src/compiler/program.ts | 3 ++- src/compiler/sys.ts | 2 +- src/compiler/tsbuild.ts | 20 ++++++++++++++------ src/compiler/types.ts | 4 ++-- src/tsserver/server.ts | 2 +- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 857ac30656a..eb1a515f24d 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -63,7 +63,7 @@ namespace ts { interface OutputFingerprint { hash: string; byteOrderMark: boolean; - mtime: Date; + mtime: Date | undefined; } export function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost { @@ -128,6 +128,7 @@ namespace ts { if (fingerprint && fingerprint.byteOrderMark === writeByteOrderMark && fingerprint.hash === hash && + fingerprint.mtime !== undefined && fingerprint.mtime.getTime() === mtimeBefore.getTime()) { return; } 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..d98a161113b 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -848,9 +848,14 @@ namespace ts { const outputs = getAllProjectOutputs(proj); let priorNewestUpdateTime = minimumDate; for (const file of outputs) { + if (isDeclarationFile(file)) { - priorNewestUpdateTime = newer(priorNewestUpdateTime, compilerHost.getModifiedTime!(file)); + const fileModifiedTime = compilerHost.getModifiedTime!(file); + if (fileModifiedTime !== undefined) { + priorNewestUpdateTime = newer(priorNewestUpdateTime, fileModifiedTime); + } } + compilerHost.setModifiedTime!(file, now); } @@ -1058,7 +1063,7 @@ namespace ts { } const inputTime = host.getModifiedTime(inputFile); - if (inputTime > newestInputFileTime) { + if (inputTime !== undefined && inputTime > newestInputFileTime) { newestInputFileName = inputFile; newestInputFileTime = inputTime; } @@ -1090,19 +1095,19 @@ namespace ts { } const outputTime = host.getModifiedTime(output); - if (outputTime < oldestOutputFileTime) { + if (outputTime !== undefined && outputTime < oldestOutputFileTime) { oldestOutputFileTime = outputTime; oldestOutputFileName = output; } // If an output is older than the newest input, we can stop checking // Don't immediately return because we can still be upstream-blocked, which is a higher-priority status - if (outputTime < newestInputFileTime) { + if (outputTime !== undefined && outputTime < newestInputFileTime) { isOutOfDateWithInputs = true; break; } - if (outputTime > newestOutputFileTime) { + if (outputTime !== undefined && outputTime > newestOutputFileTime) { newestOutputFileTime = outputTime; newestOutputFileName = output; } @@ -1117,7 +1122,10 @@ namespace ts { newestDeclarationFileContentChangedTime = newer(unchangedTime, newestDeclarationFileContentChangedTime); } else { - newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, host.getModifiedTime(output)); + const outputModifiedTime = host.getModifiedTime(output); + if (outputModifiedTime !== undefined) { + newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, outputModifiedTime); + } } } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index eb8a0c061d5..d0a5add280e 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -4682,7 +4682,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; @@ -4820,7 +4820,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/src/tsserver/server.ts b/src/tsserver/server.ts index 17f38c3c7ce..741d3c2f8a1 100644 --- a/src/tsserver/server.ts +++ b/src/tsserver/server.ts @@ -676,7 +676,7 @@ namespace ts.server { fs.stat(watchedFile.fileName, (err, stats) => { if (err) { if (err.code === "ENOENT") { - if (watchedFile.mtime.getTime() !== 0) { + if (watchedFile.mtime !== undefined && watchedFile.mtime.getTime() !== 0) { watchedFile.mtime = missingFileModifiedTime; watchedFile.callback(watchedFile.fileName, FileWatcherEventKind.Deleted); } From 37add88b18787c57a0904722946d07b7e0a2db48 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Mon, 16 Jul 2018 11:10:32 +0300 Subject: [PATCH 2/3] Update tests baselines --- src/compiler/program.ts | 5 ++-- src/compiler/tsbuild.ts | 24 +++++++++---------- src/tsserver/server.ts | 2 +- .../reference/api/tsserverlibrary.d.ts | 6 ++--- tests/baselines/reference/api/typescript.d.ts | 6 ++--- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index eb1a515f24d..6935851a439 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -63,7 +63,7 @@ namespace ts { interface OutputFingerprint { hash: string; byteOrderMark: boolean; - mtime: Date | undefined; + mtime: Date; } export function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost { @@ -128,7 +128,6 @@ namespace ts { if (fingerprint && fingerprint.byteOrderMark === writeByteOrderMark && fingerprint.hash === hash && - fingerprint.mtime !== undefined && fingerprint.mtime.getTime() === mtimeBefore.getTime()) { return; } @@ -136,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/tsbuild.ts b/src/compiler/tsbuild.ts index d98a161113b..7215cbc3a05 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -843,12 +843,14 @@ 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)) { const fileModifiedTime = compilerHost.getModifiedTime!(file); if (fileModifiedTime !== undefined) { @@ -1062,8 +1064,8 @@ namespace ts { }; } - const inputTime = host.getModifiedTime(inputFile); - if (inputTime !== undefined && inputTime > newestInputFileTime) { + const inputTime = host.getModifiedTime(inputFile) || missingFileModifiedTime; + if (inputTime > newestInputFileTime) { newestInputFileName = inputFile; newestInputFileTime = inputTime; } @@ -1094,20 +1096,20 @@ namespace ts { break; } - const outputTime = host.getModifiedTime(output); - if (outputTime !== undefined && outputTime < oldestOutputFileTime) { + const outputTime = host.getModifiedTime(output) || missingFileModifiedTime; + if (outputTime < oldestOutputFileTime) { oldestOutputFileTime = outputTime; oldestOutputFileName = output; } // If an output is older than the newest input, we can stop checking // Don't immediately return because we can still be upstream-blocked, which is a higher-priority status - if (outputTime !== undefined && outputTime < newestInputFileTime) { + if (outputTime < newestInputFileTime) { isOutOfDateWithInputs = true; break; } - if (outputTime !== undefined && outputTime > newestOutputFileTime) { + if (outputTime > newestOutputFileTime) { newestOutputFileTime = outputTime; newestOutputFileName = output; } @@ -1122,10 +1124,8 @@ namespace ts { newestDeclarationFileContentChangedTime = newer(unchangedTime, newestDeclarationFileContentChangedTime); } else { - const outputModifiedTime = host.getModifiedTime(output); - if (outputModifiedTime !== undefined) { - newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, outputModifiedTime); - } + const outputModifiedTime = host.getModifiedTime(output) || missingFileModifiedTime; + newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, outputModifiedTime); } } } diff --git a/src/tsserver/server.ts b/src/tsserver/server.ts index 741d3c2f8a1..17f38c3c7ce 100644 --- a/src/tsserver/server.ts +++ b/src/tsserver/server.ts @@ -676,7 +676,7 @@ namespace ts.server { fs.stat(watchedFile.fileName, (err, stats) => { if (err) { if (err.code === "ENOENT") { - if (watchedFile.mtime !== undefined && watchedFile.mtime.getTime() !== 0) { + if (watchedFile.mtime.getTime() !== 0) { watchedFile.mtime = missingFileModifiedTime; watchedFile.callback(watchedFile.fileName, FileWatcherEventKind.Deleted); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 57deee2ab98..601e18578d1 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2581,7 +2581,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; @@ -2685,7 +2685,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; } @@ -3022,7 +3022,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 4a792a34763..b7602798515 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2581,7 +2581,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; @@ -2685,7 +2685,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; } @@ -3022,7 +3022,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; /** From 8c7a1fad2553897e8e78f45ac960537d9e57c93f Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 20 Jul 2018 21:30:10 +0300 Subject: [PATCH 3/3] use missingFileModifiedTime instead check on undefined --- src/compiler/tsbuild.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index 7215cbc3a05..205e7cd8940 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -852,10 +852,7 @@ namespace ts { let priorNewestUpdateTime = minimumDate; for (const file of outputs) { if (isDeclarationFile(file)) { - const fileModifiedTime = compilerHost.getModifiedTime!(file); - if (fileModifiedTime !== undefined) { - priorNewestUpdateTime = newer(priorNewestUpdateTime, fileModifiedTime); - } + priorNewestUpdateTime = newer(priorNewestUpdateTime, compilerHost.getModifiedTime!(file) || missingFileModifiedTime); } compilerHost.setModifiedTime!(file, now);