TypeScript TSServer在项目加载完成之前不会发送projectLoadingStart,

h9a6wy2h  于 5个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(44)

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()!); |
| | } |
| | } |
似乎分析/加载需要一些抢占点,以便事件循环能够处理待处理的任务。

bvhaajcl

bvhaajcl1#

对于遇到此问题的其他人,解决方案是在发送 open 请求之前等待 configure 响应。

相关问题