Вызов path.insertBefore, кажется, останавливает обход

Я пытаюсь написать плагин Babel, который вставляет код перед каждым BlockStatement, Я могу заставить посетителя посетить каждый блок, но когда я пытаюсь вставить свой код, используя path.insertBefore он останавливает обход и даже не посещает вложенные блоки.

Вот упрощенный пример плагина, который я пишу.

const transform = require('babel-core').transform

plugin =({types: t}) => {
  return {
    visitor: {
      BlockStatement(path, state) {
        console.log(`Visiting Block @ line ${path.node.loc.start.line}`)
        const expr = t.expressionStatement(t.stringLiteral("LOOK AT ME"))
        path.insertBefore(expr)
      },
    },
  }
}


const javascript = `
  while(true) {
    while(false) {
      console.log('inside')
    }
  }
`

const output = transform(javascript, {plugins: [plugin]}).code


console.log(output)

Выход

Visiting Block @ line 2
while (true) {
  'LOOK AT ME';
  {
    while (false) {
      console.log('inside');
    }
  }
}

Вы можете видеть, "LOOK AT ME" вставлен перед первым BlockStatement но не вложенное внутреннее утверждение. Почему это?

0 ответов

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