我可以防止Babel遍历插件插入的代码吗?

马特·泽纳特(Matt Zeunert):

我正在构建一个插件,该插件可以enterFunction()通过调用插入到每个现有函数调用的前面path.insertBefore所以我的代码是从:

myFunction();

至:

enterFunction();
myFunction();

问题是,当我插入节点时,Babel再次遍历插入的节点。这是日志记录输出:

'CallExpression','myFunction''CallExpression
','enterFunction'

如何防止Babel输入enterFunction调用表达式及其子级?

这是我当前用于Babel插件的代码:

function(babel) {
    return {
        visitor: {
            CallExpression: function(path) {
                console.log("CallExpression", path.node.callee.name)
                if (path.node.ignore) {
                    return;
                }
                path.node.ignore = true

                var enterCall = babel.types.callExpression(
                    babel.types.identifier("enterFunction"), []
                )
                enterCall.ignore = true;
                path.insertBefore(enterCall)
            }
        }
    }
}
masterluk:

通天塔手册》提到以下部分:

如果您的插件不需要在特定情况下运行,那么最简单的方法就是写一个提前归还。

BinaryExpression(path) {
  if (path.node.operator !== '**') return;
}

如果要在顶级路径中进行子遍历,则可以使用2种提供的API方法:

path.skip()跳过遍历当前路径的子级。path.stop()完全停止遍历。

outerPath.traverse({
  Function(innerPath) {
    innerPath.skip(); // if checking the children is irrelevant
  },
  ReferencedIdentifier(innerPath, state) {
    state.iife = true;
    innerPath.stop(); // if you want to save some state and then stop traversal, or deopt
  }
});

简而言之,用于path.skip()跳过当前路径的子代。此代码段使用Visitors,CallExpression和skip()演示了此方法的一种应用

export default function (babel) {
  const { types: t } = babel;

  return {
    name: "ast-transform", // not required
    visitor: {
      CallExpression(path) {
        path.replaceWith(t.blockStatement([
          t.expressionStatement(t.yieldExpression(path.node))
        ]));
        path.skip();
      }
    }
  };
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以防止将Leaflet地图平移到世界边缘吗?

我可以防止Fabric提示我输入sudo密码吗?

JSF标准验证可以防止代码注入吗?

我可以防止对象被std :: memcpy复制吗?

我可以防止JDialog在退出/输入时关闭吗?

我可以防止无效的minidump文件名吗

当值设置为空时,我可以防止TStringlist删除键值对吗?

我可以防止类被非抽象对象继承吗?

我可以防止自动将字符串强制转换为XName吗?

我可以防止扩展导出到Objective-C的Swift标头吗?

我可以防止sarima.for密谋吗?

Babel const可以防止突变?

我可以防止我的构造函数参数与VBA实例冲突吗?

您可以防止在pgsql中的after触发器中插入吗?

我可以让Flow使用任意Babel插件(或其他代码转换小部件)吗?

在vim中,当我退出编辑模式时,是否可以防止插入符号移回?

我可以修改液晶显示器以防止其进入睡眠状态吗?

我可以防止生成App.gics吗?

我可以防止Rails将实例变量从控制器传递到视图吗?

Mysqli登录-使用此代码可以防止SQL注入吗?

我可以防止创建具有特定名称的文件夹吗?

LESS可以防止样式重复吗?

我可以防止将“ def”替换为“ val”吗?

我可以防止嵌套的不赞成使用的方法调用引发警告吗?

我可以防止tilda隐藏吗?

我可以防止Java引发某些异常吗?

我可以防止样式规则被继承吗?

具有丰富内容的 iOS 推送通知 - 我可以防止通知被点击吗?

select() 可以防止 read() 被中断吗?