From 7741ec09999af8c387116a80069f09766c28a240 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Mon, 5 Oct 2015 14:07:51 -0700 Subject: [PATCH] Use fs.watch for all directory watchers and some bug fixes --- src/compiler/sys.ts | 37 +++++++++++++----------------------- src/server/editorServices.ts | 2 +- src/server/session.ts | 1 + 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 840e8de8271..55235e3eda0 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -410,30 +410,19 @@ namespace ts { watchDirectory: (path, callback, recursive) => { // Node 4.0 `fs.watch` function supports the "recursive" option on both OSX and Windows // (ref: https://github.com/nodejs/node/pull/2649 and https://github.com/Microsoft/TypeScript/issues/4643) - // therefore if the current node.js version is newer than 4, use `fs.watch` instead. - - // In watchDirectory we only care about adding and removing files (when event name is - // "rename"); changes made within files are handled by corresponding fileWatchers (when - // event name is "change") - - if (isNode4OrLater()) { - return _fs.watch( - path, - { persisten: true, recursive: !!recursive }, - (eventName: string, relativeFileName: string) => { - if (eventName == "rename") { - // when deleting a file, the passed baseFileName is null - callback(relativeFileName == null ? null : normalizePath(ts.combinePaths(path, relativeFileName))) - }; - } - ); - } - - // If Node version is older than 4.0, the "recursive" parameter will be ignored - var watchedFile = watchedFileSet.addFile(path, callback); - return { - close: () => watchedFileSet.removeFile(watchedFile) - } + return _fs.watch( + path, + { persisten: true, recursive: !!recursive }, + (eventName: string, relativeFileName: string) => { + // In watchDirectory we only care about adding and removing files (when event name is + // "rename"); changes made within files are handled by corresponding fileWatchers (when + // event name is "change") + if (eventName == "rename") { + // When deleting a file, the passed baseFileName is null + callback(relativeFileName == null ? null : normalizePath(ts.combinePaths(path, relativeFileName))) + }; + } + ); }, resolvePath: function (path: string): string { return _path.resolve(path); diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 80cebe665ae..49ddd3a1a4c 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -927,7 +927,7 @@ namespace ts.server { var rootedProject = rootFile.defaultProject; var referencingProjects = this.findReferencingProjects(rootFile, rootedProject); - if (rootFile.defaultProject.isConfiguredProject()) { + if (rootFile.defaultProject && rootFile.defaultProject.isConfiguredProject()) { // If the root file has already been added into a configured project, // meaning the original inferred project is gone already. if (!rootedProject.isConfiguredProject()) { diff --git a/src/server/session.ts b/src/server/session.ts index da044e7b4c6..edc79838c92 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -779,6 +779,7 @@ namespace ts.server { } private closeClientFile(fileName: string) { + if (!fileName) { return; } var file = ts.normalizePath(fileName); this.projectService.closeClientFile(file); }