From f40ea0a3bf78b74a846f13271c6c2dc5e2195aca Mon Sep 17 00:00:00 2001 From: Kenza Houmani Date: Wed, 23 Oct 2019 22:43:03 +0100 Subject: [PATCH 1/3] Closes #9851 Fix parentheses on replaceWithMultiple for JSX --- .../babel-traverse/src/path/modification.js | 4 +++- packages/babel-traverse/test/replacement.js | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/modification.js b/packages/babel-traverse/src/path/modification.js index 6039a94c6090..1f6d2a0b32db 100644 --- a/packages/babel-traverse/src/path/modification.js +++ b/packages/babel-traverse/src/path/modification.js @@ -115,7 +115,9 @@ export function insertAfter(nodes) { }), ); } else if ( - (this.isNodeType("Expression") && !this.isJSXElement()) || + (this.isNodeType("Expression") && + !this.isJSXElement() && + !parentPath.isJSXElement()) || (parentPath.isForStatement() && this.key === "init") ) { if (this.node) { diff --git a/packages/babel-traverse/test/replacement.js b/packages/babel-traverse/test/replacement.js index 3454937fe506..87ecd479a994 100644 --- a/packages/babel-traverse/test/replacement.js +++ b/packages/babel-traverse/test/replacement.js @@ -1,7 +1,12 @@ import traverse from "../lib"; import { parse } from "@babel/parser"; +import generate from "@babel/generator"; import * as t from "@babel/types"; +function generateCode(path) { + return generate(path.parentPath.node).code; +} + describe("path/replacement", function() { describe("replaceWith", function() { it("replaces declaration in ExportDefaultDeclaration node", function() { @@ -97,4 +102,23 @@ describe("path/replacement", function() { ); }); }); + describe("replaceWithMultiple", () => { + it("ReplaceWithMultiple for a JSXElement with a JSXElement parent", () => { + const ast = parse(`

`, { + plugins: ["jsx"], + }); + let path; + traverse(ast, { + Program: _path => { + path = _path.get("body.0"); + }, + JSXElement: path => { + if (path.node.openingElement.name.name === "span") { + path.replaceWithMultiple(path.node.children.filter(t.isJSXElement)); + } + }, + }); + expect(generateCode(path)).toBe("

;"); + }); + }); }); From 5e7c2aee1d31b8bbbe79f9fc6816ebff1da72656 Mon Sep 17 00:00:00 2001 From: Kenza Houmani Date: Sat, 9 Nov 2019 16:44:56 +0000 Subject: [PATCH 2/3] Rename test --- packages/babel-traverse/test/replacement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/test/replacement.js b/packages/babel-traverse/test/replacement.js index 87ecd479a994..f71c82e6ceca 100644 --- a/packages/babel-traverse/test/replacement.js +++ b/packages/babel-traverse/test/replacement.js @@ -103,7 +103,7 @@ describe("path/replacement", function() { }); }); describe("replaceWithMultiple", () => { - it("ReplaceWithMultiple for a JSXElement with a JSXElement parent", () => { + it("does not add extra parentheses for a JSXElement with a JSXElement parent", () => { const ast = parse(`

`, { plugins: ["jsx"], }); From 1daebb09376a51e89adadae9e5eef9add4eb675e Mon Sep 17 00:00:00 2001 From: Kenza Houmani Date: Sat, 9 Nov 2019 16:46:53 +0000 Subject: [PATCH 3/3] Use generate(ast) directly --- packages/babel-traverse/test/replacement.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/babel-traverse/test/replacement.js b/packages/babel-traverse/test/replacement.js index f71c82e6ceca..6d54972611f2 100644 --- a/packages/babel-traverse/test/replacement.js +++ b/packages/babel-traverse/test/replacement.js @@ -3,10 +3,6 @@ import { parse } from "@babel/parser"; import generate from "@babel/generator"; import * as t from "@babel/types"; -function generateCode(path) { - return generate(path.parentPath.node).code; -} - describe("path/replacement", function() { describe("replaceWith", function() { it("replaces declaration in ExportDefaultDeclaration node", function() { @@ -107,18 +103,14 @@ describe("path/replacement", function() { const ast = parse(`

`, { plugins: ["jsx"], }); - let path; traverse(ast, { - Program: _path => { - path = _path.get("body.0"); - }, JSXElement: path => { if (path.node.openingElement.name.name === "span") { path.replaceWithMultiple(path.node.children.filter(t.isJSXElement)); } }, }); - expect(generateCode(path)).toBe("

;"); + expect(generate(ast).code).toBe("

;"); }); }); });