From 172ff544753e4dc969a8e8740898cfbea64a03ea Mon Sep 17 00:00:00 2001 From: zhengbli Date: Wed, 21 Oct 2015 16:09:16 -0700 Subject: [PATCH] Move the changes to sys.write to server.ts --- src/compiler/sys.ts | 19 +++++++-------- src/server/server.ts | 56 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index edf7fa13187..3eeb126c065 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -370,23 +370,20 @@ namespace ts { } } - function write(buffer: any, offset = 0) { - let toWrite = buffer.length - offset; - _fs.write(1, buffer, offset, toWrite, function(err: any, written: number, buffer: any){ - offset += written; - if (toWrite > written) { - write(buffer, offset); - } - }) - } - return { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, write(s: string): void { const buffer = new Buffer(s, "utf8"); - write(buffer); + let offset = 0; + let toWrite: number = buffer.length; + let written = 0; + // 1 is a standard descriptor for stdout + while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) { + offset += written; + toWrite -= written; + } }, readFile, writeFile, diff --git a/src/server/server.ts b/src/server/server.ts index 39864fc8477..5f181511783 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -11,7 +11,7 @@ namespace ts.server { input: process.stdin, output: process.stdout, terminal: false, - }); + }); class Logger implements ts.server.Logger { fd = -1; @@ -58,7 +58,7 @@ namespace ts.server { isVerbose() { return this.loggingEnabled() && (this.level == "verbose"); } - + msg(s: string, type = "Err") { if (this.fd < 0) { @@ -89,18 +89,18 @@ namespace ts.server { } exit() { - this.projectService.log("Exiting...","Info"); + this.projectService.log("Exiting...", "Info"); this.projectService.closeLog(); process.exit(0); } listen() { - rl.on('line',(input: string) => { + rl.on('line', (input: string) => { var message = input.trim(); this.onMessage(message); }); - rl.on('close',() => { + rl.on('close', () => { this.exit(); }); } @@ -155,6 +155,52 @@ namespace ts.server { var logger = createLoggerFromEnv(); + var messagesToWrite: string[] = []; + function addMessage(message: string) { + messagesToWrite.push(message); + // If the current message list has more than 1 messages, that means + // the current writing is not ended yet, so don't start new writeNext + // as it may interfere with ongoing writing sessions. + if (messagesToWrite.length === 1) { + startWrite(); + } + } + + function startWrite() { + if (messagesToWrite.length === 0) { + return; + } + + let messageToWrite = messagesToWrite[0]; + let buffer = new Buffer(messageToWrite, "utf8"); + write(buffer); + } + + function writeNext() { + if (messagesToWrite.length > 0) { + messagesToWrite = copyListRemovingItem(messagesToWrite[0], messagesToWrite); + } + startWrite(); + } + + function write(buffer: any, offset = 0) { + let toWrite = buffer.length - offset; + fs.write(1, buffer, offset, toWrite, /*position*/undefined, function(err: any, written: number, buffer: any) { + offset += written; + if (toWrite > written) { + // there are some content left that still need to be written + write(buffer, offset); + } + else { + // ready to write the next string + writeNext(); + } + }) + } + + // Override sys.write because fs.writeSync is not reliable on Node 4 + ts.sys.write = (s: string) => addMessage(s); + var ioSession = new IOSession(ts.sys, logger); process.on('uncaughtException', function(err: Error) { ioSession.logError(err, "unknown");