From 6d1a6dfc94d9a77ab332c2ef7d74e2c0d7e7b618 Mon Sep 17 00:00:00 2001 From: claudiopro Date: Tue, 17 Nov 2015 22:32:44 +0100 Subject: [PATCH 1/4] Fixes @jsx pragma detection + tests --- packages/babel-plugin-transform-react-jsx/src/index.js | 2 +- .../actual.js | 10 ++++++++++ .../options.json | 3 +++ .../actual.js | 8 ++++++++ .../options.json | 3 +++ .../actual.js | 8 ++++++++ .../options.json | 3 +++ .../actual.js | 8 ++++++++ .../options.json | 3 +++ 9 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/actual.js create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/options.json create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/actual.js create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/options.json create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/actual.js create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/options.json create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/actual.js create mode 100644 packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/options.json diff --git a/packages/babel-plugin-transform-react-jsx/src/index.js b/packages/babel-plugin-transform-react-jsx/src/index.js index 2bc882b013..d19e07a8a5 100644 --- a/packages/babel-plugin-transform-react-jsx/src/index.js +++ b/packages/babel-plugin-transform-react-jsx/src/index.js @@ -1,5 +1,5 @@ export default function ({ types: t }) { - let JSX_ANNOTATION_REGEX = /^\*\s*@jsx\s+([^\s]+)/; + let JSX_ANNOTATION_REGEX = /\*?\s*@jsx\s+([^\s]+)/; let visitor = require("babel-helper-builder-react-jsx")({ pre(state) { diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/actual.js new file mode 100644 index 0000000000..d8d5e03b67 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/actual.js @@ -0,0 +1,10 @@ +/** + * @jsx React.DOM + */ + +; + +var profile =
+ +

{[user.firstName, user.lastName].join(" ")}

+
; diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/options.json new file mode 100644 index 0000000000..ce93ded1fe --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-multiline/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The @jsx React.DOM pragma has been deprecated as of React 0.12" +} diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/actual.js new file mode 100644 index 0000000000..7454c292d6 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/actual.js @@ -0,0 +1,8 @@ +/* @jsx React.DOM */ + +; + +var profile =
+ +

{[user.firstName, user.lastName].join(" ")}

+
; diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/options.json new file mode 100644 index 0000000000..ce93ded1fe --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-simple/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The @jsx React.DOM pragma has been deprecated as of React 0.12" +} diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/actual.js new file mode 100644 index 0000000000..1d050d5f12 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/actual.js @@ -0,0 +1,8 @@ +// @jsx React.DOM + +; + +var profile =
+ +

{[user.firstName, user.lastName].join(" ")}

+
; diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/options.json new file mode 100644 index 0000000000..ce93ded1fe --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom-singleline/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The @jsx React.DOM pragma has been deprecated as of React 0.12" +} diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/actual.js new file mode 100644 index 0000000000..ca21da88e2 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/actual.js @@ -0,0 +1,8 @@ +/** @jsx React.DOM */ + +; + +var profile =
+ +

{[user.firstName, user.lastName].join(" ")}

+
; diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/options.json new file mode 100644 index 0000000000..ce93ded1fe --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/throw-if-custom-jsx-comment-sets-react-dom/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The @jsx React.DOM pragma has been deprecated as of React 0.12" +} From 507557c48e598a1a53560a4706861e2c73f27dc7 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 17 Nov 2015 18:45:35 -0800 Subject: [PATCH 2/4] Add failing test --- .../plugins/nested-if-alternate/exec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js diff --git a/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js b/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js new file mode 100644 index 0000000000..8c38fbbb5b --- /dev/null +++ b/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js @@ -0,0 +1,18 @@ +var res = transform('', { + plugins: function (b) { + var t = b.types; + return { + visitor: { + Program: function(path) { + if (this.done) return; + var inner = t.ifStatement(t.booleanLiteral(true), t.expressionStatement(t.numericLiteral(42)), null); + var outer = t.ifStatement(t.booleanLiteral(false), inner, t.expressionStatement(t.numericLiteral(23))); + path.replaceWith(t.program([outer])); + this.done = true; + } + } + } + } +}); + +assert.equal(eval(res.code), 23); From 35e575cf932e9ef4ea80328d82668c6c4f7ce782 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 17 Nov 2015 19:07:20 -0800 Subject: [PATCH 3/4] Print a block when encountering consequents that are if statements --- .../fixtures/plugins/nested-if-alternate/exec.js | 1 + .../babel-generator/src/generators/statements.js | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js b/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js index 8c38fbbb5b..c9dae86ffa 100644 --- a/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js +++ b/packages/babel-core/test/fixtures/plugins/nested-if-alternate/exec.js @@ -5,6 +5,7 @@ var res = transform('', { visitor: { Program: function(path) { if (this.done) return; + // if (false) { if (true) 42; } else 23; var inner = t.ifStatement(t.booleanLiteral(true), t.expressionStatement(t.numericLiteral(42)), null); var outer = t.ifStatement(t.booleanLiteral(false), inner, t.expressionStatement(t.numericLiteral(23))); path.replaceWith(t.program([outer])); diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 744ff256d5..f42ee49fcd 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -16,8 +16,21 @@ export function IfStatement(node: Object) { this.push(")"); this.space(); + let consequentIsIf = t.isIfStatement(node.consequent); + if (consequentIsIf) { + this.push("{"); + this.newline(); + this.indent(); + } + this.printAndIndentOnComments(node.consequent, node); + if (consequentIsIf) { + this.dedent(); + this.newline(); + this.push("}"); + } + if (node.alternate) { if (this.isLast("}")) this.space(); this.push("else "); From 1612c70c106689bd933d07bf192f045cb597058c Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Tue, 17 Nov 2015 19:16:19 -0800 Subject: [PATCH 4/4] Take the alternate existence into account --- packages/babel-generator/src/generators/statements.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index f42ee49fcd..4e1e62393a 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -16,8 +16,8 @@ export function IfStatement(node: Object) { this.push(")"); this.space(); - let consequentIsIf = t.isIfStatement(node.consequent); - if (consequentIsIf) { + let needsBlock = node.alternate && t.isIfStatement(node.consequent); + if (needsBlock) { this.push("{"); this.newline(); this.indent(); @@ -25,7 +25,7 @@ export function IfStatement(node: Object) { this.printAndIndentOnComments(node.consequent, node); - if (consequentIsIf) { + if (needsBlock) { this.dedent(); this.newline(); this.push("}");