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:
commit
2b6d2a9f71
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue