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 сам от потребителя.

Другие вопросы по тегам