我可以使用 Typescript Compiler API 更改节点的 SourceFile 吗?

2024-03-15

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

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

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

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


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

你所做的就是克隆它。

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

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

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

另一个使用 ts.createMutableClone(),因此您只需克隆一个节点并仅编辑您需要的内容:https://typescript-api-playground.glitch.me/#example=Transformation%203 https://typescript-api-playground.glitch.me/#example=Transformation%203

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

话虽这么说,我建议您查看这个库,它可能会让您定义表达式并将它们插入到几乎任何位置:https://github.com/dsherret/ts-morph https://github.com/dsherret/ts-morph

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

祝你好运

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 Typescript Compiler API 更改节点的 SourceFile 吗? 的相关文章

随机推荐

  • C 中的快速 2D 卷积

    我正在尝试用 Python 实现卷积神经网络 最初 我使用 scipy signal 的 convolve2d 函数来进行卷积 但它有很多开销 而且用 C 实现我自己的算法并从 python 调用它会更快 因为我知道我的输入是什么样的 我实
  • 由于Android 6.0监听PhoneStateListener.LISTEN_DATA_CONNECTION_STATE的变化似乎不再需要READ_PHONE_STATE权限

    我正在将 Android 6 0 运行时权限应用到一个应用程序中 该应用程序侦听运营商数据连接状态更改 我首先尝试从清单中删除 READ PHONE STATE 以检查应用程序需要权限的位置 令我惊讶的是 该应用程序根本没有崩溃 此后 我在
  • OAuth 授权码何时到期?

    我知道 在 OAuth 中使用授权代码 授权代码 时 访问令牌的生命周期应该很短 但刷新令牌的生命周期可以很长 所以我为我的项目决定 访问令牌生命周期 1 天 刷新令牌生命周期 30 天 但授权码的典型生命周期是多长 我认为它应该非常非常短
  • go中如何连接Oracle

    我认为有两种方法可以在 Go 中连接到 Oracle DB 在 Windows 上 github com tgulacsi goracle github com mattn go oci8 但对于我这个水平的人 开源 golang的初学者
  • Liferay DLFileEntryLocalServiceUtil.addFileEntry 不创建 AssetEntry 记录

    我有一个自定义 portlet 它提供了一个用户可以上传文件的表单 上传的文件应存储在文档和媒体 Portlet 中 我正在使用创建文件条目DLFileEntryLocalServiceUtil addFileEntry 文件上传成功 记录
  • NSTask、命令行工具和 root

    我正在开发一个需要使用 dd 的应用程序 我使用应用程序包中的 shell 脚本来执行此操作 该脚本从应用程序本身收集参数 进行一些检查 然后启动 dd 为了进行此操作 我需要使用 root 调用 dd 并且我已经在 StackOverfl
  • iPhone 中社交网络与 OAuth 的集成

    我是 iPhone 编程新手 有人可以解释一下什么是 OAuth 以及它如何在社交网络集成中使用吗 有多少社交网站提供 API Use ShareKit http getsharekit com
  • 如果行包含重复数据,如何突出显示?

    我有以下数据 id number colour 1766 53 red 1767 3 green 1768 202 green 1769 52 blue
  • 查找最深子树节点的级别

    我有树节点 我想找到树节点中最深的子节点 如果有 2 个子节点level 11 level 13分别然后我需要函数返回值13 我怎样才能做到这一点 public int FindLevel TreeNode oParentNode coun
  • 获取 std::function 的名称

    在下面的玩具示例中 我想获取函数的名称 该函数本身被给出为std function争论 在C 中是否可以获取a的名称std function object void printName std function
  • 重新分配变体

    只是为了定位上下文 它是关于一个字符串池 意味着一个带有字符串键的哈希表 实际上是知道其长度的特殊字符串 但我想这个细节在这里无关紧要 重点是当池需要增长时调整列表数组 用作表桶 的大小 但是 这是核心细节 包含字符串的单元格实际上位于单元
  • 如何在代码中向 ActionBar 操作添加子菜单项?

    通过 xml 我可以将子菜单项添加到我的操作中ActionBar main menu xml menu menu
  • BizTalk 2009 上的意外绑定重置

    我在 BizTalk 2009 上使用了许多应用程序 我多次注意到 在随机应用程序中添加资源 dll 后 精确应用程序的所有绑定 自定义管道 都会完全重置为之前的早期状态 我真的很好奇为什么会发生这种情况 但我还需要一个解决方案来阻止该行为
  • 使用 Powershell 将字符串转换为特定时区的 DateTime 对象

    由于我对 Powershell 的了解有限 我试图将当前的字符串转换为 2020 01 23 10 06 07 时区中的日期时间对象Eastern Standard Time 最终我希望能够使用与 UTC 的正确偏移量格式化为 ISO860
  • 算法 - 二叉搜索树每两个节点之间的距离总和,时间复杂度为 O(n)?

    问题是在给定每个父子对间隔单位距离的情况下 找出 BinarySearchTree 中每两个节点之间的距离之和 每次插入后都要计算它 ex gt first node is inserted root total sum 0 gt left
  • gcc 11:“选项已启用”消失

    gcc x86 64 直至版本 10 x 生成了一个 选项已启用 列表 v或作为评论 s汇编文件与 fverbose asm 参见例如使用 gcc Q v 启用选项 和 通过选项 之间有什么区别 https stackoverflow co
  • Cordova JQuery 错误 VS2015:异常:无法调用未定义的方法“concat”

    当我使用 jquery mobile 加载 html 时 我在 VS 中收到此错误 异常 无法调用未定义的方法 concat jquery mobile 1 4 5js 我按照这个教程进行操作 https wordpress org sup
  • 当 Edgecolor = 'none' 时,Matplotlib 标记消失

    我正在尝试绘制一些 PCA 数据的散点图 我做了一些非常典型的代码 plt plot pca 0 pca 1 ms 3 markerfacecolor self colors k markeredgecolor none 我希望它只显示标记
  • 当用户滚动到不同的页面时,如何在“UICollectionView”的不同背景颜色之间淡入淡出?

    我正在尝试在其 iOS 应用程序上复制 eBay 的列表菜单 用户可以在其中滚动浏览列表的不同图像 我注意到背景颜色是纯色 复制每个图像中背景的周围颜色 当我滚动浏览具有不同环绕背景的不同图像 不同页面 时 实际背景UICollection
  • 我可以使用 Typescript Compiler API 更改节点的 SourceFile 吗?

    我目前正在尝试使用 Typescript 的编译器 API 修改 FunctionDeclaration 的主体 我正在创建一些新的 VariableDeclarations 并且使用从 SourceFile A 派生的表达式来设置 初始化