3

我正在做一个codemod /转换来更改我的代码中的if/return语句。

我有很多,if(err) do something我需要重构这种行为。

我怎样才能为此进行转换?

我有的:

if (err) {
  return connection.rollback(function() {
    throw err;
  });
}

我想要的是:

if (err){
    return rollback(connection, err);
}

到目前为止,我设法替换node.consequent并直接使用 a callExpression

root.find(j.IfStatement).replaceWith(function (_if) {
  var fnCall = j.callExpression(j.identifier('rollback'), [
    j.identifier('connection'), 
    j.identifier('err')
  ]);

  _if.node.consequent = fnCall; 
  return _if.node;
});

...导致:

if (err)
  rollback(connection, err);

如何在里面也包含 theBlockStatement和 areturn呢?这是执行此codemod的正确方法吗?

活的例子在这里

4

2 回答 2

2

好的,成功了!多么好的工具啊!

如果有更好的方法,请发表评论或发布新答案!

所以,我缺少的是语句{}中的一个块语句if,以及它里面的一个return.

所以我补充说:

var ret = j.returnStatement(fnCall);
var block = j.blockStatement([ret]);
_if.node.consequent = block;

结果在这里:http ://astexplorer.net/#/84e8ZqEAwQ/1

于 2015-10-17T20:12:29.967 回答
0

下面是使用putout代码转换器的样子:

const from = `
    if (err) {
      return connection.rollback(function() {
        throw err;
      });
    }
`;

const to = `
    if (err){
        return rollback(connection, err);
    }
`;

export const replace = () => ({
    [from]: to
});

Putout转换fromAST,搜索相似的部分并将它们替换为to AST. 所有这些东西都可以在不需要AST消费者接触的情况下工作。

输出编辑器

于 2021-08-11T13:16:46.293 回答