替换babel上不同种类的函数节点

Replacing different kinds of function nodes on babel

几天前我已经在 babel slack 频道上问过这个问题,但我一直没有得到答案。 我创建了一个插件来将函数转换为柯里化函数 (npm)。尽管我成功地构建了插件,但我还是找到了一些解决方法的问题,但我更愿意简化我的逻辑,从而使其更加健壮和可靠。

我的第一个方法是为 FunctionDeclaration 构建一个访问者。这个非常简单:将每个参数扩展为 ArrowFunctionExpression,然后用 returns 这些函数的新 FunctionDeclaration 替换当前节点。

当您要处理 FunctionExpression 时,问题就来了。您可能知道,FunctionExpression 可以出现在 AST 的多个位置:

所有这些都是有效的 FunctionExpressions,这引入了一个问题:我正在用 functionDeclaration 替换当前节点,但似乎 babel 拒绝用 functionDeclaration 替换任何节点。这迫使我通过重新创建来替换整个父节点。 到目前为止,这对包含 functionExpression 的赋值表达式和变量声明有效,但我必须准确地重新创建它们,以免破坏任何代码。当您想支持更多场景时,这会变得更难。

对我来说,理想的情况是只替换当前节点,根本不用担心它在哪里,但正如我所说,当当前节点在变量声明中时,babel 拒绝替换它。

可以看到代码here。注意:我不确定我是否也应该post这里的代码,似乎不需要

此致

终于找到解决办法了。 我的第一次尝试失败了,因为我试图用 FunctionDeclaration 替换 FunctionExpression,babel 拒绝了它,因为它似乎不兼容,即使输出代码完全相同。 在替换函数表达式时使用函数表达式构造函数构建新的主体函数使我可以只创建 node.replaceWith 而不是用新节点替换整个父节点。

这似乎是因为AssignmentExpression and VariableDeclarator expect an Expression as parameter. FunctionDeclaration is not part of that group (as you can see on its aliases list), but FunctionExpression is。因此,即使输出代码相同,在 AST 术语中它们也不同。