From fc63612b424e51cb4a636b228085cbbc3bd656cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Tue, 24 Nov 2020 13:53:28 -0500 Subject: [PATCH] test: add replaceWith test to traverse --- packages/babel-traverse/test/replacement.js | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/babel-traverse/test/replacement.js b/packages/babel-traverse/test/replacement.js index 0109e8cf04c2..91f826d5dc1a 100644 --- a/packages/babel-traverse/test/replacement.js +++ b/packages/babel-traverse/test/replacement.js @@ -112,6 +112,33 @@ describe("path/replacement", function () { }); expect(visitCounter).toBe(1); }); + + // https://github.com/babel/babel/issues/12386 + it("updates pathCache with the replaced node", () => { + const ast = parse(`() => (a?.b)?.c`, { + createParenthesizedExpressions: true, + }); + traverse(ast, { + OptionalMemberExpression(path) { + path.node.type = "MemberExpression"; + path.replaceWith(path.node.__clone()); + path.parentPath.ensureBlock(); + + const aQuestionDotB = path.get("object").get("expression"); + const aQuestionDotBNode = aQuestionDotB.node; + aQuestionDotBNode.type = "MemberExpression"; + aQuestionDotB.replaceWith(aQuestionDotBNode.__clone()); + }, + ParenthesizedExpression(path) { + path.replaceWith(path.node.expression); + }, + }); + expect(generate(ast).code).toMatchInlineSnapshot(` + "() => { + return a.b.c; + };" + `); + }); }); describe("replaceWithMultiple", () => { it("does not add extra parentheses for a JSXElement with a JSXElement parent", () => {