mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-15 12:51:30 -05:00
Move the changes to sys.write to server.ts
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user