Merge branch 'master' of https://github.com/ShyykoSerhiy/TypeScript into ShyykoSerhiy-master

Conflicts:
	src/compiler/sys.ts
	src/compiler/tsc.ts
This commit is contained in:
Mohamed Hegazy 2015-09-30 16:30:49 -07:00
commit 2b6d2a9f71
3 changed files with 29 additions and 18 deletions

View file

@ -8,7 +8,7 @@ namespace ts {
write(s: string): void; write(s: string): void;
readFile(path: string, encoding?: string): string; readFile(path: string, encoding?: string): string;
writeFile(path: string, data: string, writeByteOrderMark?: boolean): void; writeFile(path: string, data: string, writeByteOrderMark?: boolean): void;
watchFile?(path: string, callback: (path: string) => void): FileWatcher; watchFile?(path: string, callback: (path: string, removed: boolean) => void): FileWatcher;
resolvePath(path: string): string; resolvePath(path: string): string;
fileExists(path: string): boolean; fileExists(path: string): boolean;
directoryExists(path: string): boolean; directoryExists(path: string): boolean;
@ -292,11 +292,16 @@ namespace ts {
}; };
function fileChanged(curr: any, prev: any) { function fileChanged(curr: any, prev: any) {
// mtime.getTime() equals 0 if file was removed
if (curr.mtime.getTime() === 0) {
callback(fileName, /* removed */ true);
return;
}
if (+curr.mtime <= +prev.mtime) { if (+curr.mtime <= +prev.mtime) {
return; return;
} }
callback(fileName); callback(fileName, /* removed */ false);
} }
}, },
resolvePath: function (path: string): string { resolvePath: function (path: string): string {

View file

@ -103,7 +103,7 @@ namespace ts {
function reportWatchDiagnostic(diagnostic: Diagnostic) { function reportWatchDiagnostic(diagnostic: Diagnostic) {
let output = new Date().toLocaleTimeString() + " - "; let output = new Date().toLocaleTimeString() + " - ";
if (diagnostic.file) { if (diagnostic.file) {
let loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); let loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
output += `${ diagnostic.file.fileName }(${ loc.line + 1 },${ loc.character + 1 }): `; output += `${ diagnostic.file.fileName }(${ loc.line + 1 },${ loc.character + 1 }): `;
@ -113,7 +113,7 @@ namespace ts {
sys.write(output); sys.write(output);
} }
function padLeft(s: string, length: number) { function padLeft(s: string, length: number) {
while (s.length < length) { while (s.length < length) {
s = " " + s; s = " " + s;
@ -275,7 +275,7 @@ namespace ts {
let sourceFile = hostGetSourceFile(fileName, languageVersion, onError); let sourceFile = hostGetSourceFile(fileName, languageVersion, onError);
if (sourceFile && compilerOptions.watch) { if (sourceFile && compilerOptions.watch) {
// Attach a file watcher // Attach a file watcher
sourceFile.fileWatcher = sys.watchFile(sourceFile.fileName, () => sourceFileChanged(sourceFile)); sourceFile.fileWatcher = sys.watchFile(sourceFile.fileName, (fileName, removed) => sourceFileChanged(sourceFile, removed));
} }
return sourceFile; return sourceFile;
} }
@ -297,9 +297,15 @@ namespace ts {
} }
// If a source file changes, mark it as unwatched and start the recompilation timer // If a source file changes, mark it as unwatched and start the recompilation timer
function sourceFileChanged(sourceFile: SourceFile) { function sourceFileChanged(sourceFile: SourceFile, removed: boolean) {
sourceFile.fileWatcher.close(); sourceFile.fileWatcher.close();
sourceFile.fileWatcher = undefined; sourceFile.fileWatcher = undefined;
if (removed) {
var index = rootFileNames.indexOf(sourceFile.fileName);
if (index >= 0) {
rootFileNames.splice(index, 1);
}
}
startTimer(); startTimer();
} }
@ -531,8 +537,8 @@ namespace ts {
return; return;
function serializeCompilerOptions(options: CompilerOptions): Map<string|number|boolean> { function serializeCompilerOptions(options: CompilerOptions): Map<string | number | boolean> {
let result: Map<string|number|boolean> = {}; let result: Map<string | number | boolean> = {};
let optionsNameMap = getOptionNameMap().optionNameMap; let optionsNameMap = getOptionNameMap().optionNameMap;
for (let name in options) { for (let name in options) {

View file

@ -11,7 +11,7 @@ namespace ts.server {
input: process.stdin, input: process.stdin,
output: process.stdout, output: process.stdout,
terminal: false, terminal: false,
}); });
class Logger implements ts.server.Logger { class Logger implements ts.server.Logger {
fd = -1; fd = -1;
@ -58,7 +58,7 @@ namespace ts.server {
isVerbose() { isVerbose() {
return this.loggingEnabled() && (this.level == "verbose"); return this.loggingEnabled() && (this.level == "verbose");
} }
msg(s: string, type = "Err") { msg(s: string, type = "Err") {
if (this.fd < 0) { if (this.fd < 0) {
@ -85,7 +85,7 @@ namespace ts.server {
interface WatchedFile { interface WatchedFile {
fileName: string; fileName: string;
callback: (fileName: string) => void; callback: (fileName: string, removed: boolean) => void;
mtime: Date; mtime: Date;
} }
@ -121,11 +121,11 @@ namespace ts.server {
fs.stat(watchedFile.fileName,(err, stats) => { fs.stat(watchedFile.fileName,(err, stats) => {
if (err) { if (err) {
watchedFile.callback(watchedFile.fileName); watchedFile.callback(watchedFile.fileName, /* removed */ false);
} }
else if (watchedFile.mtime.getTime() !== stats.mtime.getTime()) { else if (watchedFile.mtime.getTime() !== stats.mtime.getTime()) {
watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName); watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName);
watchedFile.callback(watchedFile.fileName); watchedFile.callback(watchedFile.fileName, watchedFile.mtime.getTime() === 0);
} }
}); });
} }
@ -153,7 +153,7 @@ namespace ts.server {
}, this.interval); }, this.interval);
} }
addFile(fileName: string, callback: (fileName: string) => void ): WatchedFile { addFile(fileName: string, callback: (fileName: string, removed: boolean) => void ): WatchedFile {
var file: WatchedFile = { var file: WatchedFile = {
fileName, fileName,
callback, callback,
@ -170,7 +170,7 @@ namespace ts.server {
removeFile(file: WatchedFile) { removeFile(file: WatchedFile) {
this.watchedFiles = WatchedFileSet.copyListRemovingItem(file, this.watchedFiles); this.watchedFiles = WatchedFileSet.copyListRemovingItem(file, this.watchedFiles);
} }
} }
class IOSession extends Session { class IOSession extends Session {
constructor(host: ServerHost, logger: ts.server.Logger) { constructor(host: ServerHost, logger: ts.server.Logger) {
@ -243,11 +243,11 @@ namespace ts.server {
// TODO: check that this location is writable // TODO: check that this location is writable
var logger = createLoggerFromEnv(); var logger = createLoggerFromEnv();
// REVIEW: for now this implementation uses polling. // REVIEW: for now this implementation uses polling.
// The advantage of polling is that it works reliably // The advantage of polling is that it works reliably
// on all os and with network mounted files. // on all os and with network mounted files.
// For 90 referenced files, the average time to detect // For 90 referenced files, the average time to detect
// changes is 2*msInterval (by default 5 seconds). // changes is 2*msInterval (by default 5 seconds).
// The overhead of this is .04 percent (1/2500) with // The overhead of this is .04 percent (1/2500) with
// average pause of < 1 millisecond (and max // average pause of < 1 millisecond (and max
@ -271,4 +271,4 @@ namespace ts.server {
}); });
// Start listening // Start listening
ioSession.listen(); ioSession.listen();
} }