2016-05-31 4 views
2

Я пытался играть с модулями babel, , babel-traverse. Когда я попытался заменить узел, программа разбилась на Maximum call stack size exceeded. Вот мой кодВавилон, максимальный размер стека вызовов превышен при использовании path.replaceWith

import * as babylon from 'babylon' 
import traverse from 'babel-traverse' 
import generate from 'babel-generator' 
import * as t from 'babel-types' 


const code = ` 
import a from 'b' 
n === 3 
` 
const ast = babylon.parse(code, { 
    sourceType: 'module' 
}) 

const visitor = { 
    BinaryExpression(path) { 
    console.log((path.node)) 
    path.replaceWith(t.binaryExpression('**', t.numericLiteral(3), t.numericLiteral(4))) 
    } 
} 

traverse(ast, visitor) 

let generated = generate(ast, null, code) 
console.log(generated.code) 

И я использую ниже зависимостей babel, любую идею?

"dependencies": { 
"babel-generator": "^6.9.0", 
"babel-preset-es2015": "^6.9.0", 
"babel-traverse": "^6.9.0", 
"babel-types": "^6.9.1", 
"babylon": "^6.8.0" 
} 
+0

Я удивлен, что никто не придумал решение. –

ответ

1

Причина вы получаете ошибку стеки, потому что ваша бинарная замена выражения генерирует другое двоичное выражение. Ваше замещающее двоичное выражение подается в посетителя снова и снова, до бесконечности.

Чтобы разбить бесконечный цикл, вам необходимо проверить, произошла ли ваша замена, возможно, игнорируя шаг replaceWith всякий раз, когда вы видите, что оператор **.

Смежные вопросы