codemod / transform包括BlockStatement

时间:2015-10-17 19:32:44

标签: javascript abstract-syntax-tree jstransform jscodeshift

我正在执行 codemod / 转换以更改代码中的if / return语句。

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

如何为此进行转换?

我有什么:

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

我想要的是什么:

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

到目前为止,我已设法替换node.consequent并直接使用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);

如何在其中加入BlockStatementreturn?这是正确的方法吗 codemod

实例here

2 个答案:

答案 0 :(得分:1)

好的,做到了!真是个不错的工具!

  

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

所以,我所缺少的是{}语句中的阻止语句if,而return内的阻止语句var ret = j.returnStatement(fnCall); var block = j.blockStatement([ret]); _if.node.consequent = block;

所以我补充道:

class product():
self.shops = [ {'name': None, 'price': None}, ... ]
...

p = product()

# shops is a list of shops
for i, shop in enumerate(shops[0:5]):
    p.shops[i]['name'] = shop.name 
    p.shops[i]['price'] = shop.price

结果在此处:http://astexplorer.net/#/84e8ZqEAwQ/1

答案 1 :(得分: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
});

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

Putout Editor