Move the changes to sys.write to server.ts

This commit is contained in:
zhengbli
2015-10-21 16:09:16 -07:00
parent 214e21d05b
commit 172ff54475
2 changed files with 59 additions and 16 deletions

View File

@@ -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,

View File

@@ -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");