我正在执行 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);
如何在其中加入BlockStatement
和return
?这是正确的方法吗 codemod ?
答案 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
答案 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
});
Putout
将 from
转换为 AST
,搜索相似的部分并将它们替换为 to
AST
。所有这些东西都可以在不需要从消费者那里接触 AST
本身的情况下工作。