Skip to content

Commit 172ff54

Browse files
committed
Move the changes to sys.write to server.ts
1 parent 214e21d commit 172ff54

File tree

2 files changed

+59
-16
lines changed

2 files changed

+59
-16
lines changed

src/compiler/sys.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -370,23 +370,20 @@ namespace ts {
370370
}
371371
}
372372

373-
function write(buffer: any, offset = 0) {
374-
let toWrite = buffer.length - offset;
375-
_fs.write(1, buffer, offset, toWrite, function(err: any, written: number, buffer: any){
376-
offset += written;
377-
if (toWrite > written) {
378-
write(buffer, offset);
379-
}
380-
})
381-
}
382-
383373
return {
384374
args: process.argv.slice(2),
385375
newLine: _os.EOL,
386376
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
387377
write(s: string): void {
388378
const buffer = new Buffer(s, "utf8");
389-
write(buffer);
379+
let offset = 0;
380+
let toWrite: number = buffer.length;
381+
let written = 0;
382+
// 1 is a standard descriptor for stdout
383+
while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) {
384+
offset += written;
385+
toWrite -= written;
386+
}
390387
},
391388
readFile,
392389
writeFile,

src/server/server.ts

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ts.server {
1111
input: process.stdin,
1212
output: process.stdout,
1313
terminal: false,
14-
});
14+
});
1515

1616
class Logger implements ts.server.Logger {
1717
fd = -1;
@@ -58,7 +58,7 @@ namespace ts.server {
5858
isVerbose() {
5959
return this.loggingEnabled() && (this.level == "verbose");
6060
}
61-
61+
6262

6363
msg(s: string, type = "Err") {
6464
if (this.fd < 0) {
@@ -89,18 +89,18 @@ namespace ts.server {
8989
}
9090

9191
exit() {
92-
this.projectService.log("Exiting...","Info");
92+
this.projectService.log("Exiting...", "Info");
9393
this.projectService.closeLog();
9494
process.exit(0);
9595
}
9696

9797
listen() {
98-
rl.on('line',(input: string) => {
98+
rl.on('line', (input: string) => {
9999
var message = input.trim();
100100
this.onMessage(message);
101101
});
102102

103-
rl.on('close',() => {
103+
rl.on('close', () => {
104104
this.exit();
105105
});
106106
}
@@ -155,6 +155,52 @@ namespace ts.server {
155155

156156
var logger = createLoggerFromEnv();
157157

158+
var messagesToWrite: string[] = [];
159+
function addMessage(message: string) {
160+
messagesToWrite.push(message);
161+
// If the current message list has more than 1 messages, that means
162+
// the current writing is not ended yet, so don't start new writeNext
163+
// as it may interfere with ongoing writing sessions.
164+
if (messagesToWrite.length === 1) {
165+
startWrite();
166+
}
167+
}
168+
169+
function startWrite() {
170+
if (messagesToWrite.length === 0) {
171+
return;
172+
}
173+
174+
let messageToWrite = messagesToWrite[0];
175+
let buffer = new Buffer(messageToWrite, "utf8");
176+
write(buffer);
177+
}
178+
179+
function writeNext() {
180+
if (messagesToWrite.length > 0) {
181+
messagesToWrite = copyListRemovingItem(messagesToWrite[0], messagesToWrite);
182+
}
183+
startWrite();
184+
}
185+
186+
function write(buffer: any, offset = 0) {
187+
let toWrite = buffer.length - offset;
188+
fs.write(1, buffer, offset, toWrite, /*position*/undefined, function(err: any, written: number, buffer: any) {
189+
offset += written;
190+
if (toWrite > written) {
191+
// there are some content left that still need to be written
192+
write(buffer, offset);
193+
}
194+
else {
195+
// ready to write the next string
196+
writeNext();
197+
}
198+
})
199+
}
200+
201+
// Override sys.write because fs.writeSync is not reliable on Node 4
202+
ts.sys.write = (s: string) => addMessage(s);
203+
158204
var ioSession = new IOSession(ts.sys, logger);
159205
process.on('uncaughtException', function(err: Error) {
160206
ioSession.logError(err, "unknown");

0 commit comments

Comments
 (0)