Bug报告
如果在发送 open
请求之前发送了 configure
请求,那么 projectLoadingStart
事件不会在项目加载完成之前到达。
🕗 版本与回归信息
这种行为存在于 4.5.4 和 HEAD(编写本文时)。
💻 代码
这是一个最小的 tsserver 客户端,它演示了这个问题。如果你跟踪 tsserver.log
,你会看到 projectLoadingStart
在正确的时间被发送。如果我删除 configure
请求,projectLoadingStart
会立即到达。
import { fork } from "child_process";
const tsserver = "/home/icholy/src/github.com/microsoft/TypeScript/bin/tsserver";
const args = [
"--logFile", "tsserver.log",
"--logVerbosity", "verbose",
];
const proc = fork(tsserver, args, { silent: true });
proc.once("exit", () => {
console.error("tsserver exited");
process.exit();
});
const { stdin, stdout } = proc;
if (!stdin || !stdout) {
throw new Error("failed to get stdin/stdout");
}
stdout.on("data", (data) => {
console.log(data.toString());
});
const configure = {
command: "configure",
seq: 1,
type: "request",
arguments: {
preferences: {}
}
};
const open = {
command: "open",
seq: 2,
type: "request",
arguments: {
file: "/home/icholy/src/example/main.ts",
},
};
const msg = JSON.stringify(configure) + "\n" + JSON.stringify(open) + "\n";
stdin.write(msg);
🙁 实际行为
projectLoadingStart
事件与 projectLoadingFinish
同时到达。
🙂 预期行为
projectLoadingStart
在发送 open
请求后立即到达。
详情
首先发送 configure
响应并设置 canWrite = false
。然后将 projectLoadingStart
事件放入 pending
数组中。我假设项目加载/分析正在饿死事件循环,这阻止了 setCanWriteFlagAndWriteMessageIfNecessary
被调用。
TypeScript/src/tsserver/nodeServer.ts
第 321 行到第 336 行 in c71ff4d
| | functionwriteMessage(buf: Buffer){ |
| | if(!canWrite){ |
| | pending.push(buf); |
| | } |
| | else{ |
| | canWrite=false; |
| | process.stdout.write(buf,setCanWriteFlagAndWriteMessageIfNecessary); |
| | } |
| | } |
| | |
| | functionsetCanWriteFlagAndWriteMessageIfNecessary(){ |
| | canWrite=true; |
| | if(pending.length){ |
| | writeMessage(pending.shift()!); |
| | } |
| | } |
似乎分析/加载需要一些抢占点,以便事件循环能够处理待处理的任务。
1条答案
按热度按时间bvhaajcl1#
对于遇到此问题的其他人,解决方案是在发送
open
请求之前等待configure
响应。