如何使用语言服务器协议将 TS 解析为符号?

Sep*_*eed 4 typescript language-server-protocol

我是这个主题的新手,所以很有可能我弄错了一些关键术语。我想将打字稿文件解析为其组件符号。举一个我想象出来的非常粗略的例子,见下文:

// some ts file
export function yell(output: string) {
  alert(output + "!!");
}
Run Code Online (Sandbox Code Playgroud)

会创建这样的东西:

{
  symbols: [
    { type: "comment", text: "// some ts file" },
    "\n",
    { type: "module", text: "export" },
    " ",
    { type: "function", symbols: [
      { type: "name", text: "yell" },
      ... it goes on
    ]}
  ]
}
Run Code Online (Sandbox Code Playgroud)

我很确定这个符号化/标记化是语言服务器初始化阶段的一部分,试图从这个问题中收集信息(https://github.com/Microsoft/language-server-protocol/issues/33)。

但是我通读了有关 initialize ( https://microsoft.github.io/language-server-protocol/specification#initialize )的文档,但找不到 (ctrl-f) 任何有关返回的符号或令牌的信息。

不久前,我在摩纳哥工作,我知道语言服务器的重点主要是标准化代码的标记化和链接/导航,所以我很确定这是适合它的工具。但是文档非常密集,似乎更侧重于代码交互而不是代码解析。

如何使用语言服务器协议将 TS 解析为符号?

编辑:值得一提的是,如果这本身就是一个项目:我不是在寻找这个或任何东西的完整代码。只是对发生的事情的某种粗略概述,也许还有一些相关文档的链接/摘录。

编辑 2:我在这里发现了一个非常相似的问题(TypeScript: get syntax tree),但它没有提到语言服务器,而且似乎是在它们之前的时间出现的。

编辑 3:看来我正在寻找的正确术语是 AST。在网上找到了一个非常酷的 TypeScript 工具(https://ts-ast-viewer.com/

Sep*_*eed 5

事实证明,语言服务器不公开 AST(抽象语法树)。

我发现了这个问题,引用如下:

我可以看到 AST 如何在这里提供帮助,但目前没有计划通过 LSP 公开 AST。LSP 的整个想法是不这样做,因为它使跨语言和工具的标准化变得非常困难

https://github.com/Microsoft/language-server-protocol/issues/258

幸运的是,打字稿确实提供了一些方法来做到这一点(https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API#using-the-type-checker)。

一旦我想出这种替代方法,我会更新。