From 28ae47a174f67a8ae6f4527e0a66e88896814170 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Tue, 18 Jul 2017 13:24:07 -0400 Subject: [PATCH] Stop mutating nodes (#5963) * Stop mutating nodes * Update tests * linting --- .../src/transformation/file/index.js | 1 - .../src/generators/expressions.js | 25 +-------- .../src/index.js | 5 -- .../babel-helper-function-name/src/index.js | 1 - .../babel-helper-replace-supers/src/index.js | 6 +- .../src/index.js | 6 +- .../src/vanilla.js | 1 - .../test/fixtures/regression/2775/expected.js | 14 +---- .../src/index.js | 1 - .../src/index.js | 7 ++- .../react/arrow-functions/expected.js | 2 +- .../expected.js | 16 +----- .../expected.js | 8 +-- .../expected.js | 17 ++---- .../honor-custom-jsx-comment/expected.js | 17 ++---- .../expected.js | 17 ++---- .../jsx-with-retainlines-option/expected.js | 2 +- .../expected.js | 6 +- .../expected.js | 2 +- .../should-allow-js-namespacing/expected.js | 2 +- .../expected.js | 24 ++------ .../should-convert-simple-tags/expected.js | 2 +- .../should-convert-simple-text/expected.js | 6 +- .../should-escape-xhtml-jsxtext/expected.js | 55 +++---------------- .../expected.js | 13 +---- .../expected.js | 6 +- .../expected.js | 18 +----- .../expected.js | 10 +--- .../should-quote-jsx-attributes/expected.js | 10 +--- .../expected.js | 2 +- packages/babel-template/src/index.js | 45 +++++++-------- .../babel-traverse/src/path/lib/hoister.js | 4 -- packages/babel-traverse/src/scope/index.js | 1 - packages/babel-types/src/index.js | 6 +- 34 files changed, 83 insertions(+), 275 deletions(-) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 77fabcb11f..3461647bc9 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -236,7 +236,6 @@ export default class File extends Store { if (t.isFunctionExpression(ref) && !ref.id) { ref.body._compact = true; - ref._generated = true; ref.id = uid; ref.type = "FunctionDeclaration"; this.path.unshiftContainer("body", ref); diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index a6b2a4ff90..b7e55a395f 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -91,13 +91,6 @@ export function Decorator(node: Object) { this.newline(); } -function commaSeparatorNewline() { - this.token(","); - this.newline(); - - if (!this.endsWith("\n")) this.space(); -} - export function CallExpression(node: Object) { this.print(node.callee, node); @@ -105,23 +98,7 @@ export function CallExpression(node: Object) { this.token("?."); } this.token("("); - - const isPrettyCall = node._prettyCall; - - let separator; - if (isPrettyCall) { - separator = commaSeparatorNewline; - this.newline(); - this.indent(); - } - - this.printList(node.arguments, node, { separator }); - - if (isPrettyCall) { - this.newline(); - this.dedent(); - } - + this.printList(node.arguments, node); this.token(")"); } diff --git a/packages/babel-helper-builder-react-jsx/src/index.js b/packages/babel-helper-builder-react-jsx/src/index.js index 01e8fe54c1..65cc0fc6ee 100644 --- a/packages/babel-helper-builder-react-jsx/src/index.js +++ b/packages/babel-helper-builder-react-jsx/src/index.js @@ -24,11 +24,6 @@ export default function(opts) { const callExpr = buildElementCall(path.get("openingElement"), file); callExpr.arguments = callExpr.arguments.concat(path.node.children); - - if (callExpr.arguments.length >= 3) { - callExpr._prettyCall = true; - } - path.replaceWith(t.inherits(callExpr, path.node)); }, }; diff --git a/packages/babel-helper-function-name/src/index.js b/packages/babel-helper-function-name/src/index.js index e0420de933..b849e42124 100644 --- a/packages/babel-helper-function-name/src/index.js +++ b/packages/babel-helper-function-name/src/index.js @@ -64,7 +64,6 @@ function wrap(state, method, id, scope) { FUNCTION_ID: id, FUNCTION_KEY: scope.generateUidIdentifier(id.name), }).expression; - template.callee._skipModulesRemap = true; // shim in dummy params to retain function arity, if you try to read the // source then you'll get the original since it's proxied so it's all good diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 26ffe4d75a..6af12830dc 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -4,7 +4,7 @@ import * as messages from "babel-messages"; import * as t from "babel-types"; // ✌️ -const HARDCORE_THIS_REF = Symbol(); +const HARDCORE_THIS_REF = new WeakSet(); function isIllegalBareSuper(node, parent) { if (!t.isSuper(node)) return false; @@ -57,7 +57,7 @@ const visitor = { }, ThisExpression(path, state) { - if (!path.node[HARDCORE_THIS_REF]) { + if (!HARDCORE_THIS_REF.has(path.node)) { state.thises.push(path); } }, @@ -309,7 +309,7 @@ export default class ReplaceSupers { optimiseCall(callee, args) { const thisNode = t.thisExpression(); - thisNode[HARDCORE_THIS_REF] = true; + HARDCORE_THIS_REF.add(thisNode); return optimiseCall(callee, thisNode, args); } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js index c21b661b9d..a5a1d45cd4 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js @@ -8,6 +8,8 @@ import values from "lodash/values"; import extend from "lodash/extend"; import template from "babel-template"; +const DONE = new WeakSet(); + export default function() { return { visitor: { @@ -340,8 +342,8 @@ class BlockScoping { run() { const block = this.block; - if (block._letDone) return; - block._letDone = true; + if (DONE.has(block)) return; + DONE.add(block); const needsClosure = this.getLetReferences(); diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index 70e83a340a..442dc2e37c 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -565,7 +565,6 @@ export default class ClassTransformer { t.inheritsComments(construct, method); - construct._ignoreUserWhitespace = true; construct.params = method.params; t.inherits(construct.body, method.body); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js index 1b4e6432cb..ad0abccf46 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2775/expected.js @@ -20,17 +20,9 @@ var RandomComponent = function (_Component) { babelHelpers.createClass(RandomComponent, [{ key: "render", value: function render() { - return _react2.default.createElement( - "div", - { - className: "sui-RandomComponent" - }, - _react2.default.createElement( - "h2", - null, - "Hi there!" - ) - ); + return _react2.default.createElement("div", { + className: "sui-RandomComponent" + }, _react2.default.createElement("h2", null, "Hi there!")); } }]); return RandomComponent; diff --git a/packages/babel-plugin-transform-jscript/src/index.js b/packages/babel-plugin-transform-jscript/src/index.js index 205791fc54..6592761bb0 100644 --- a/packages/babel-plugin-transform-jscript/src/index.js +++ b/packages/babel-plugin-transform-jscript/src/index.js @@ -5,7 +5,6 @@ export default function({ types: t }) { exit(path) { const { node } = path; if (!node.id) return; - node._ignoreUserWhitespace = true; path.replaceWith( t.callExpression( diff --git a/packages/babel-plugin-transform-react-constant-elements/src/index.js b/packages/babel-plugin-transform-react-constant-elements/src/index.js index 92a839a2e1..dea8e97e7b 100644 --- a/packages/babel-plugin-transform-react-constant-elements/src/index.js +++ b/packages/babel-plugin-transform-react-constant-elements/src/index.js @@ -1,4 +1,6 @@ export default function({ types: t }) { + const HOISTED = new WeakSet(); + const immutabilityVisitor = { enter(path, state) { const stop = () => { @@ -59,15 +61,14 @@ export default function({ types: t }) { return { visitor: { JSXElement(path) { - if (path.node._hoisted) return; + if (HOISTED.has(path.node)) return; + HOISTED.add(path.node); const state = { isImmutable: true }; path.traverse(immutabilityVisitor, state); if (state.isImmutable) { path.hoist(); - } else { - path.node._hoisted = true; } }, }, diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/arrow-functions/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/arrow-functions/expected.js index dc9fe71161..ad60be9dc4 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/arrow-functions/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/arrow-functions/expected.js @@ -12,4 +12,4 @@ var bar = function () { return function () { return React.createElement(_this2.foo, null); }; -}; +}; \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/concatenates-adjacent-string-literals/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/concatenates-adjacent-string-literals/expected.js index 60968f6a6f..db00f0c966 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/concatenates-adjacent-string-literals/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/concatenates-adjacent-string-literals/expected.js @@ -1,15 +1 @@ -var x = React.createElement( - "div", - null, - "foo", - "bar", - "baz", - React.createElement( - "div", - null, - "buz bang" - ), - "qux", - null, - "quack" -); +var x = React.createElement("div", null, "foo", "bar", "baz", React.createElement("div", null, "buz bang"), "qux", null, "quack"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/dont-coerce-expression-containers/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/dont-coerce-expression-containers/expected.js index 354d19997c..94cb58c96b 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/dont-coerce-expression-containers/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/dont-coerce-expression-containers/expected.js @@ -1,7 +1 @@ -React.createElement( - Text, - null, - "To get started, edit index.ios.js!!!", - "\n", - "Press Cmd+R to reload" -); +React.createElement(Text, null, "To get started, edit index.ios.js!!!", "\n", "Press Cmd+R to reload"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js index 9b12a39539..82679a5ba4 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment-if-jsx-pragma-option-set/expected.js @@ -1,15 +1,6 @@ /** @jsx dom */ dom(Foo, null); -var profile = dom( - "div", - null, - dom("img", { - src: "avatar.png", - className: "profile" - }), - dom( - "h3", - null, - [user.firstName, user.lastName].join(" ") - ) -); \ No newline at end of file +var profile = dom("div", null, dom("img", { + src: "avatar.png", + className: "profile" +}), dom("h3", null, [user.firstName, user.lastName].join(" "))); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment/expected.js index 9b12a39539..82679a5ba4 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-comment/expected.js @@ -1,15 +1,6 @@ /** @jsx dom */ dom(Foo, null); -var profile = dom( - "div", - null, - dom("img", { - src: "avatar.png", - className: "profile" - }), - dom( - "h3", - null, - [user.firstName, user.lastName].join(" ") - ) -); \ No newline at end of file +var profile = dom("div", null, dom("img", { + src: "avatar.png", + className: "profile" +}), dom("h3", null, [user.firstName, user.lastName].join(" "))); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-pragma-option/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-pragma-option/expected.js index 0594096239..afe5b606e4 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-pragma-option/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/honor-custom-jsx-pragma-option/expected.js @@ -1,14 +1,5 @@ dom(Foo, null); -var profile = dom( - "div", - null, - dom("img", { - src: "avatar.png", - className: "profile" - }), - dom( - "h3", - null, - [user.firstName, user.lastName].join(" ") - ) -); \ No newline at end of file +var profile = dom("div", null, dom("img", { + src: "avatar.png", + className: "profile" +}), dom("h3", null, [user.firstName, user.lastName].join(" "))); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-with-retainlines-option/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-with-retainlines-option/expected.js index f3210cb915..a7ec0eda1a 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-with-retainlines-option/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-with-retainlines-option/expected.js @@ -1 +1 @@ -var div = React.createElement("div", null, "test"); +var div = React.createElement("div", null, "test"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-without-retainlines-option/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-without-retainlines-option/expected.js index 9a82f14c77..a7ec0eda1a 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-without-retainlines-option/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/jsx-without-retainlines-option/expected.js @@ -1,5 +1 @@ -var div = React.createElement( - "div", - null, - "test" -); +var div = React.createElement("div", null, "test"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-deeper-js-namespacing/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-deeper-js-namespacing/expected.js index 8dc54f904a..34a72e0c31 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-deeper-js-namespacing/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-deeper-js-namespacing/expected.js @@ -1 +1 @@ -React.createElement(Namespace.DeepNamespace.Component, null); +React.createElement(Namespace.DeepNamespace.Component, null); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-js-namespacing/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-js-namespacing/expected.js index 980df45724..dc9e415c30 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-js-namespacing/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-allow-js-namespacing/expected.js @@ -1 +1 @@ -React.createElement(Namespace.Component, null); +React.createElement(Namespace.Component, null); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js index 2d30e69403..6f456870a2 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-avoid-wrapping-in-extra-parens-if-not-needed/expected.js @@ -1,20 +1,4 @@ -var x = React.createElement( - "div", - null, - React.createElement(Component, null) -); -var x = React.createElement( - "div", - null, - props.children -); -var x = React.createElement( - Composite, - null, - props.children -); -var x = React.createElement( - Composite, - null, - React.createElement(Composite2, null) -); \ No newline at end of file +var x = React.createElement("div", null, React.createElement(Component, null)); +var x = React.createElement("div", null, props.children); +var x = React.createElement(Composite, null, props.children); +var x = React.createElement(Composite, null, React.createElement(Composite2, null)); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-tags/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-tags/expected.js index 73d0a3e9d5..b55b05f895 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-tags/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-tags/expected.js @@ -1 +1 @@ -var x = React.createElement("div", null); +var x = React.createElement("div", null); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-text/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-text/expected.js index 0d70340e65..fd963d2cc0 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-text/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-convert-simple-text/expected.js @@ -1,5 +1 @@ -var x = React.createElement( - "div", - null, - "text" -); +var x = React.createElement("div", null, "text"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-escape-xhtml-jsxtext/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-escape-xhtml-jsxtext/expected.js index fabae52e7b..a6bbd2a964 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-escape-xhtml-jsxtext/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-escape-xhtml-jsxtext/expected.js @@ -1,46 +1,9 @@ -React.createElement( - "div", - null, - "wow" -); -React.createElement( - "div", - null, - "w\xF4w" -); -React.createElement( - "div", - null, - "w & w" -); -React.createElement( - "div", - null, - "w & w" -); -React.createElement( - "div", - null, - "w \xA0 w" -); -React.createElement( - "div", - null, - "this should not parse as unicode: \\u00a0" -); -React.createElement( - "div", - null, - "this should parse as nbsp: \xA0 " -); -React.createElement( - "div", - null, - "this should parse as unicode: ", - '\u00a0 ' -); -React.createElement( - "div", - null, - "w < w" -); \ No newline at end of file +React.createElement("div", null, "wow"); +React.createElement("div", null, "w\xF4w"); +React.createElement("div", null, "w & w"); +React.createElement("div", null, "w & w"); +React.createElement("div", null, "w \xA0 w"); +React.createElement("div", null, "this should not parse as unicode: \\u00a0"); +React.createElement("div", null, "this should parse as nbsp: \xA0 "); +React.createElement("div", null, "this should parse as unicode: ", '\u00a0 '); +React.createElement("div", null, "w < w"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-attributed-elements/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-attributed-elements/expected.js index da4d287f92..9aaabb2de9 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-attributed-elements/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-attributed-elements/expected.js @@ -1,18 +1,9 @@ var HelloMessage = React.createClass({ displayName: "HelloMessage", render: function () { - return React.createElement( - "div", - null, - "Hello ", - this.props.name - ); + return React.createElement("div", null, "Hello ", this.props.name); } }); React.render(React.createElement(HelloMessage, { - name: React.createElement( - "span", - null, - "Sebastian" - ) + name: React.createElement("span", null, "Sebastian") }), mountNode); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-has-own-property-correctly/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-has-own-property-correctly/expected.js index 550edebb36..af37ac40d7 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-has-own-property-correctly/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-handle-has-own-property-correctly/expected.js @@ -1,5 +1 @@ -React.createElement( - "hasOwnProperty", - null, - "testing" -); +React.createElement("hasOwnProperty", null, "testing"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-have-correct-comma-in-nested-children/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-have-correct-comma-in-nested-children/expected.js index 5197540321..678ed7f04b 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-have-correct-comma-in-nested-children/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-have-correct-comma-in-nested-children/expected.js @@ -1,17 +1 @@ -var x = React.createElement( - "div", - null, - React.createElement( - "div", - null, - React.createElement("br", null) - ), - React.createElement( - Component, - null, - foo, - React.createElement("br", null), - bar - ), - React.createElement("br", null) -); +var x = React.createElement("div", null, React.createElement("div", null, React.createElement("br", null)), React.createElement(Component, null, foo, React.createElement("br", null), bar), React.createElement("br", null)); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-not-mangle-expressioncontainer-attribute-values/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-not-mangle-expressioncontainer-attribute-values/expected.js index 7bb8866b96..fd1406e534 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-not-mangle-expressioncontainer-attribute-values/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-not-mangle-expressioncontainer-attribute-values/expected.js @@ -1,7 +1,3 @@ -React.createElement( - "button", - { - "data-value": "a value\n with\nnewlines\n and spaces" - }, - "Button" -); \ No newline at end of file +React.createElement("button", { + "data-value": "a value\n with\nnewlines\n and spaces" +}, "Button"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-quote-jsx-attributes/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-quote-jsx-attributes/expected.js index e468dbe866..86f802fc77 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-quote-jsx-attributes/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-quote-jsx-attributes/expected.js @@ -1,7 +1,3 @@ -React.createElement( - "button", - { - "data-value": "a value" - }, - "Button" -); \ No newline at end of file +React.createElement("button", { + "data-value": "a value" +}, "Button"); \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-transform-known-hyphenated-tags/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-transform-known-hyphenated-tags/expected.js index 140f5b1b8c..72e7ad43dc 100644 --- a/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-transform-known-hyphenated-tags/expected.js +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/react/should-transform-known-hyphenated-tags/expected.js @@ -1 +1 @@ -React.createElement("font-face", null); +React.createElement("font-face", null); \ No newline at end of file diff --git a/packages/babel-template/src/index.js b/packages/babel-template/src/index.js index 183e391fda..d54470ab39 100644 --- a/packages/babel-template/src/index.js +++ b/packages/babel-template/src/index.js @@ -2,10 +2,8 @@ import cloneDeep from "lodash/cloneDeep"; import has from "lodash/has"; import traverse from "babel-traverse"; import * as babylon from "babylon"; -import * as t from "babel-types"; -const FROM_TEMPLATE = "_fromTemplate"; //Symbol(); // todo: probably wont get copied over -const TEMPLATE_SKIP = Symbol(); +const FROM_TEMPLATE = new Set(); export default function(code: string, opts?: Object): Function { // since we lazy parse the template, we get the current stack so we have the @@ -40,10 +38,6 @@ export default function(code: string, opts?: Object): Function { ast = traverse.removeProperties(ast, { preserveComments: opts.preserveComments, }); - - traverse.cheap(ast, function(node) { - node[FROM_TEMPLATE] = true; - }); } catch (err) { err.stack = `${err.stack}from\n${stack}`; throw err; @@ -66,7 +60,13 @@ function useTemplate(ast, nodes?: Array) { const { program } = ast; if (nodes.length) { + traverse.cheap(ast, function(node) { + FROM_TEMPLATE.add(node); + }); + traverse(ast, templateVisitor, null, nodes); + + FROM_TEMPLATE.clear(); } if (program.body.length > 1) { @@ -80,32 +80,27 @@ const templateVisitor = { // 360 noScope: true, - enter(path, args) { - let { node } = path; - if (node[TEMPLATE_SKIP]) return path.skip(); - - if (t.isExpressionStatement(node)) { - node = node.expression; - } + Identifier(path, args) { + const { node, parentPath } = path; + if (!FROM_TEMPLATE.has(node)) return path.skip(); let replacement; + if (has(args[0], node.name)) { + replacement = args[0][node.name]; + } else if (node.name[0] === "$") { + const i = +node.name.slice(1); + if (args[i]) replacement = args[i]; + } - if (t.isIdentifier(node) && node[FROM_TEMPLATE]) { - if (has(args[0], node.name)) { - replacement = args[0][node.name]; - } else if (node.name[0] === "$") { - const i = +node.name.slice(1); - if (args[i]) replacement = args[i]; - } + if (parentPath.isExpressionStatement()) { + path = parentPath; } if (replacement === null) { path.remove(); - } - - if (replacement) { - replacement[TEMPLATE_SKIP] = true; + } else if (replacement) { path.replaceInline(replacement); + path.skip(); } }, diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js index afc0c3f238..ab0d4a35d2 100644 --- a/packages/babel-traverse/src/path/lib/hoister.js +++ b/packages/babel-traverse/src/path/lib/hoister.js @@ -199,10 +199,6 @@ export default class PathHoister { } run() { - const node = this.path.node; - if (node._hoisted) return; - node._hoisted = true; - this.path.traverse(referenceVisitor, this); this.getCompatibleScopes(); diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 6cf0918564..fd5089caef 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -803,7 +803,6 @@ export default class Scope { if (!declarPath) { const declar = t.variableDeclaration(kind, []); - declar._generated = true; declar._blockHoist = blockHoist; [declarPath] = path.unshiftContainer("body", [declar]); diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index 9b138da49e..2e5fa0797d 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -304,7 +304,7 @@ export function clone(node: Object): Object { export function cloneWithoutLoc(node: Object): Object { const newNode = clone(node); - delete newNode.loc; + newNode.loc = null; return newNode; } @@ -405,7 +405,7 @@ export function buildMatchMemberExpression( export function removeComments(node: Object): Object { for (const key of t.COMMENT_KEYS) { - delete node[key]; + node[key] = null; } return node; } @@ -455,7 +455,7 @@ export function inherits(child: Object, parent: Object): Object { // force inherit "private" properties for (const key in parent) { - if (key[0] === "_") child[key] = parent[key]; + if (key[0] === "_" && key !== "__clone") child[key] = parent[key]; } // force inherit select properties