2016-05-31 9 views
2

바벨 모듈을 가지고 놀려고했는데, babylon, 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 단계를 무시하십시오).