Вызов 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
но не вложенное внутреннее утверждение. Почему это?