【问题标题】:Can I change the SourceFile of a Node using the Typescript Compiler API?我可以使用 Typescript Compiler API 更改节点的 SourceFile 吗?
【发布时间】:2020-09-18 08:35:23
【问题描述】:

我目前正在尝试使用 Typescript 的编译器 API 修改 FunctionDeclaration 的主体。我正在创建一些新的变量声明,并且正在使用从 SourceFile A 派生的表达式设置“初始化程序”字段。

然后,我尝试将这些新的 VariableDeclarations 添加到 SourceFile B 的 FunctionDeclaration 的主体中,但是当使用 SourceFile A 作为 printer.printFile(...) 中的源文件时,这些新创建的 VariableDeclarations 的右侧无法正确打印。分号和运算符似乎可以打印,但没有标识符或文字。

问题似乎是不同的 SourceFiles,即使两个 SourceFiles 中使用的标识符完全相同。

有没有办法为那些新创建的 VariableDeclarations 设置 SourceFile(或者实际上,为导致问题的“初始化程序”表达式)?如果没有,我还能做些什么来获取在一个 SourceFile 中找到的表达式并在另一个 SourceFile 中使用它?

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

    您不能将节点移动到不同的源文件,因为基本上节点当前是作为源文件文本的片段(跨度)实现的。

    你所做的就是克隆它。

    TypeScript Compiler API 方式是实现一个转换。基本上它遍历 AST 并确定要替换的节点,并返回一个新节点而不是原始节点。转换会生成一个新的 sourceFile,然后您可以使用 ts.createPrinter 进行打印。这些是一些工作示例(单击运行按钮,右侧的代码将被转换)

    简单的转换: https://typescript-api-playground.glitch.me/#example=Simple%20Transformation

    还有几个: https://typescript-api-playground.glitch.me/#example=Transformation%202

    这个其他使用 ts.createMutableClone() 所以你只需克隆一个节点并只编辑你需要的内容: https://typescript-api-playground.glitch.me/#example=Transformation%203

    (这是我制作的游乐场,您可以编辑并再次运行)

    话虽如此,我建议您查看这个库,它可能可以让您定义表达式并将它们插入几乎任何地方: https://github.com/dsherret/ts-morph

    此外,如果您使用的是 ts.create*,则此项目可能对自动转换这些表达式中的代码有很大帮助: https://ts-creator.js.org/

    祝你好运

    【讨论】:

      【解决方案2】:

      如果有人遇到类似的问题,那么最终解决这个问题的方法是使用ts.createIdentifier(expression)(本质上是将Expressions 与不同的SourceFiles 混合,导致无法正常打印)。这可能不适用于所有类似情况,但在这种情况下,我只需要相关Expressions 的字符串表示形式在不同SourceFile 的上下文中正确打印。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2021-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        相关资源
        最近更新 更多