4

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

// some ts file
export function yell(output: string) {
  alert(output + "!!");
}

会创建这样的东西:

{
  symbols: [
    { type: "comment", text: "// some ts file" },
    "\n",
    { type: "module", text: "export" },
    " ",
    { type: "function", symbols: [
      { type: "name", text: "yell" },
      ... it goes on
    ]}
  ]
}

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

但是我通读了有关初始化(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/

4

1 回答 1

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)。

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

于 2019-07-10T02:14:57.467 回答