2016-05-31 131 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(無論何時您看到操作員爲**)。

相關問題