codemod/transform включает BlockStatement
Я делаю codemod/transform, чтобы изменить 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
внутри него? это правильный способ сделать этот кодмод?
живой пример здесь
2 ответа
Хорошо, сделал это! Какой хороший инструмент!
пожалуйста, прокомментируйте или отправьте новый ответ, если есть лучший способ сделать это!
Итак, то, что я пропустил, было как блок-оператор {}
в if
заявление, а внутри него return
,
И я добавил:
var ret = j.returnStatement(fnCall);
var block = j.blockStatement([ret]);
_if.node.consequent = block;
результат здесь: http://astexplorer.net/
Вот как это может выглядеть при использовании преобразователя кода вывода :
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
в, ищет похожие части и заменяет их на
to
. Все это работает без необходимости трогать
AST
сам от потребителя.