Don't insert the same node into the AST multiple times (fixes babel/babili#556) (#6054)

This commit is contained in:
Teddy Katz 2017-08-04 16:00:29 -07:00 committed by Henry Zhu
parent 47a9ba3440
commit 13d931c417
2 changed files with 24 additions and 1 deletions

View File

@ -73,7 +73,11 @@ export default function() {
),
);
} else {
path.replaceWith(remap);
path.replaceWith(
// Clone the node before inserting it to ensure that different nodes in the AST are represented
// by different objects.
t.cloneWithoutLoc(remap),
);
}
this.requeueInParent(path);
},

View File

@ -0,0 +1,19 @@
const assert = require("assert");
const babel = require("babel-core");
test("Doesn't use the same object for two different nodes in the AST", function() {
const code = 'import Foo from "bar"; Foo; Foo;';
const ast = babel.transform(code, {
plugins: [[require("../"), { loose: true }]],
}).ast;
assert.equal(ast.program.body[3].expression.type, "MemberExpression");
assert.equal(ast.program.body[4].expression.type, "MemberExpression");
assert.notEqual(
ast.program.body[3].expression,
ast.program.body[4].expression,
"Expected different nodes in the AST to not be the same object",
);
});