2016-05-31 86 views
2

我正在尝试使用babel模块,babylonbabel-traverse。当我试图更换一个节点时,程序崩溃Maximum call stack size exceeded。这是我的代码Babel,使用path.replace时超出最大调用堆栈大小

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(无论何时您看到操作员为**)。

相关问题