Skip to content

Commit 8cc2936

Browse files
committed
Move watchFile and watchDirectory to WatchCompilerHost
1 parent e694b9e commit 8cc2936

6 files changed

Lines changed: 43 additions & 17 deletions

File tree

src/compiler/watch.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ namespace ts {
216216

217217
/** If provided, used to resolve the module names, otherwise typescript's default module resolution */
218218
resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames?: string[]): ResolvedModule[];
219+
220+
/** Used to watch changes in source files, missing files needed to update the program or config file */
221+
watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
222+
/** Used to watch resolved module's failed lookup locations, config file specs, type roots where auto type reference directives are added */
223+
watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
219224
}
220225

221226
/**
@@ -310,6 +315,8 @@ namespace ts {
310315
getDirectories: getBoundFunction(system.getDirectories, system),
311316
readDirectory: getBoundFunction(system.readDirectory, system),
312317
realpath: getBoundFunction(system.realpath, system),
318+
watchFile: getBoundFunction(system.watchFile, system),
319+
watchDirectory: getBoundFunction(system.watchDirectory, system),
313320
system,
314321
afterProgramCreate: createProgramCompilerWithBuilderState(system, reportDiagnostic)
315322
};
@@ -424,7 +431,7 @@ namespace ts {
424431
const watchDirectoryWorker = compilerOptions.extendedDiagnostics ? ts.addDirectoryWatcherWithLogging : ts.addDirectoryWatcher;
425432

426433
if (configFileName) {
427-
watchFile(system, configFileName, scheduleProgramReload, writeLog);
434+
watchFile(host, configFileName, scheduleProgramReload, writeLog);
428435
}
429436

430437
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
@@ -581,7 +588,7 @@ namespace ts {
581588
hostSourceFile.sourceFile = sourceFile;
582589
sourceFile.version = hostSourceFile.version.toString();
583590
if (!hostSourceFile.fileWatcher) {
584-
hostSourceFile.fileWatcher = watchFilePath(system, fileName, onSourceFileChange, path, writeLog);
591+
hostSourceFile.fileWatcher = watchFilePath(host, fileName, onSourceFileChange, path, writeLog);
585592
}
586593
}
587594
else {
@@ -594,7 +601,7 @@ namespace ts {
594601
let fileWatcher: FileWatcher;
595602
if (sourceFile) {
596603
sourceFile.version = "1";
597-
fileWatcher = watchFilePath(system, fileName, onSourceFileChange, path, writeLog);
604+
fileWatcher = watchFilePath(host, fileName, onSourceFileChange, path, writeLog);
598605
sourceFilesCache.set(path, { sourceFile, version: 1, fileWatcher });
599606
}
600607
else {
@@ -773,11 +780,11 @@ namespace ts {
773780
}
774781

775782
function watchDirectory(directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags) {
776-
return watchDirectoryWorker(system, directory, cb, flags, writeLog);
783+
return watchDirectoryWorker(host, directory, cb, flags, writeLog);
777784
}
778785

779786
function watchMissingFilePath(missingFilePath: Path) {
780-
return watchFilePath(system, missingFilePath, onMissingFileChange, missingFilePath, writeLog);
787+
return watchFilePath(host, missingFilePath, onMissingFileChange, missingFilePath, writeLog);
781788
}
782789

783790
function onMissingFileChange(fileName: string, eventKind: FileWatcherEventKind, missingFilePath: Path) {

src/compiler/watchUtilities.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -323,53 +323,61 @@ namespace ts {
323323
}
324324
}
325325

326-
export function addFileWatcher(host: System, file: string, cb: FileWatcherCallback): FileWatcher {
326+
export interface WatchFileHost {
327+
watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
328+
}
329+
330+
export function addFileWatcher(host: WatchFileHost, file: string, cb: FileWatcherCallback): FileWatcher {
327331
return host.watchFile(file, cb);
328332
}
329333

330-
export function addFileWatcherWithLogging(host: System, file: string, cb: FileWatcherCallback, log: (s: string) => void): FileWatcher {
334+
export function addFileWatcherWithLogging(host: WatchFileHost, file: string, cb: FileWatcherCallback, log: (s: string) => void): FileWatcher {
331335
const watcherCaption = `FileWatcher:: `;
332336
return createWatcherWithLogging(addFileWatcher, watcherCaption, log, /*logOnlyTrigger*/ false, host, file, cb);
333337
}
334338

335-
export function addFileWatcherWithOnlyTriggerLogging(host: System, file: string, cb: FileWatcherCallback, log: (s: string) => void): FileWatcher {
339+
export function addFileWatcherWithOnlyTriggerLogging(host: WatchFileHost, file: string, cb: FileWatcherCallback, log: (s: string) => void): FileWatcher {
336340
const watcherCaption = `FileWatcher:: `;
337341
return createWatcherWithLogging(addFileWatcher, watcherCaption, log, /*logOnlyTrigger*/ true, host, file, cb);
338342
}
339343

340344
export type FilePathWatcherCallback = (fileName: string, eventKind: FileWatcherEventKind, filePath: Path) => void;
341-
export function addFilePathWatcher(host: System, file: string, cb: FilePathWatcherCallback, path: Path): FileWatcher {
345+
export function addFilePathWatcher(host: WatchFileHost, file: string, cb: FilePathWatcherCallback, path: Path): FileWatcher {
342346
return host.watchFile(file, (fileName, eventKind) => cb(fileName, eventKind, path));
343347
}
344348

345-
export function addFilePathWatcherWithLogging(host: System, file: string, cb: FilePathWatcherCallback, path: Path, log: (s: string) => void): FileWatcher {
349+
export function addFilePathWatcherWithLogging(host: WatchFileHost, file: string, cb: FilePathWatcherCallback, path: Path, log: (s: string) => void): FileWatcher {
346350
const watcherCaption = `FileWatcher:: `;
347351
return createWatcherWithLogging(addFileWatcher, watcherCaption, log, /*logOnlyTrigger*/ false, host, file, cb, path);
348352
}
349353

350-
export function addFilePathWatcherWithOnlyTriggerLogging(host: System, file: string, cb: FilePathWatcherCallback, path: Path, log: (s: string) => void): FileWatcher {
354+
export function addFilePathWatcherWithOnlyTriggerLogging(host: WatchFileHost, file: string, cb: FilePathWatcherCallback, path: Path, log: (s: string) => void): FileWatcher {
351355
const watcherCaption = `FileWatcher:: `;
352356
return createWatcherWithLogging(addFileWatcher, watcherCaption, log, /*logOnlyTrigger*/ true, host, file, cb, path);
353357
}
354358

355-
export function addDirectoryWatcher(host: System, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags): FileWatcher {
359+
export interface WatchDirectoryHost {
360+
watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
361+
}
362+
363+
export function addDirectoryWatcher(host: WatchDirectoryHost, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags): FileWatcher {
356364
const recursive = (flags & WatchDirectoryFlags.Recursive) !== 0;
357365
return host.watchDirectory(directory, cb, recursive);
358366
}
359367

360-
export function addDirectoryWatcherWithLogging(host: System, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags, log: (s: string) => void): FileWatcher {
368+
export function addDirectoryWatcherWithLogging(host: WatchDirectoryHost, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags, log: (s: string) => void): FileWatcher {
361369
const watcherCaption = `DirectoryWatcher ${(flags & WatchDirectoryFlags.Recursive) !== 0 ? "recursive" : ""}:: `;
362370
return createWatcherWithLogging(addDirectoryWatcher, watcherCaption, log, /*logOnlyTrigger*/ false, host, directory, cb, flags);
363371
}
364372

365-
export function addDirectoryWatcherWithOnlyTriggerLogging(host: System, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags, log: (s: string) => void): FileWatcher {
373+
export function addDirectoryWatcherWithOnlyTriggerLogging(host: WatchDirectoryHost, directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags, log: (s: string) => void): FileWatcher {
366374
const watcherCaption = `DirectoryWatcher ${(flags & WatchDirectoryFlags.Recursive) !== 0 ? "recursive" : ""}:: `;
367375
return createWatcherWithLogging(addDirectoryWatcher, watcherCaption, log, /*logOnlyTrigger*/ true, host, directory, cb, flags);
368376
}
369377

370378
type WatchCallback<T, U> = (fileName: string, cbOptional1?: T, optional?: U) => void;
371-
type AddWatch<T, U> = (host: System, file: string, cb: WatchCallback<T, U>, optional?: U) => FileWatcher;
372-
function createWatcherWithLogging<T, U>(addWatch: AddWatch<T, U>, watcherCaption: string, log: (s: string) => void, logOnlyTrigger: boolean, host: System, file: string, cb: WatchCallback<T, U>, optional?: U): FileWatcher {
379+
type AddWatch<H, T, U> = (host: H, file: string, cb: WatchCallback<T, U>, optional?: U) => FileWatcher;
380+
function createWatcherWithLogging<H, T, U>(addWatch: AddWatch<H, T, U>, watcherCaption: string, log: (s: string) => void, logOnlyTrigger: boolean, host: H, file: string, cb: WatchCallback<T, U>, optional?: U): FileWatcher {
373381
const info = `PathInfo: ${file}`;
374382
if (!logOnlyTrigger) {
375383
log(`${watcherCaption}Added: ${info}`);

src/harness/unittests/session.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace ts.server {
44
let lastWrittenToHost: string;
5+
const noopFileWatcher: FileWatcher = { close: noop };
56
const mockHost: ServerHost = {
67
args: [],
78
newLine: "\n",
@@ -24,6 +25,8 @@ namespace ts.server {
2425
setImmediate: () => 0,
2526
clearImmediate: noop,
2627
createHash: Harness.mockHash,
28+
watchFile: () => noopFileWatcher,
29+
watchDirectory: () => noopFileWatcher
2730
};
2831

2932
class TestSession extends Session {

src/server/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ declare namespace ts.server {
1111

1212
type RequireResult = { module: {}, error: undefined } | { module: undefined, error: { stack?: string, message?: string } };
1313
export interface ServerHost extends System {
14+
watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
15+
watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
1416
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
1517
clearTimeout(timeoutId: any): void;
1618
setImmediate(callback: (...args: any[]) => void, ...args: any[]): any;
@@ -129,4 +131,4 @@ declare namespace ts.server {
129131
createDirectory(path: string): void;
130132
watchFile?(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
131133
}
132-
}
134+
}

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4747,6 +4747,8 @@ declare namespace ts.server {
47474747
};
47484748
};
47494749
interface ServerHost extends System {
4750+
watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
4751+
watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
47504752
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
47514753
clearTimeout(timeoutId: any): void;
47524754
setImmediate(callback: (...args: any[]) => void, ...args: any[]): any;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3844,6 +3844,10 @@ declare namespace ts {
38443844
realpath?(path: string): string;
38453845
/** If provided, used to resolve the module names, otherwise typescript's default module resolution */
38463846
resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames?: string[]): ResolvedModule[];
3847+
/** Used to watch changes in source files, missing files needed to update the program or config file */
3848+
watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number): FileWatcher;
3849+
/** Used to watch resolved module's failed lookup locations, config file specs, type roots where auto type reference directives are added */
3850+
watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
38473851
}
38483852
/**
38493853
* Host to create watch with root files and options

0 commit comments

Comments
 (0)