From de2791a696380183502c830165467bd36b31bfd9 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Sat, 20 Aug 2016 18:21:17 +0200 Subject: [PATCH] ensure consistent expression value for post-assignment unary expressions (#3650) --- .../src/index.js | 16 ++++++++++++++++ .../test/fixtures/regression/options.json | 3 --- .../hoisting-bindings}/actual.js | 3 +++ .../hoisting-bindings}/expected.js | 6 ++++++ .../test/fixtures/systemjs/remap/expected.js | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) delete mode 100644 packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/options.json rename packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/{regression/T6973 => systemjs/hoisting-bindings}/actual.js (72%) rename packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/{regression/T6973 => systemjs/hoisting-bindings}/expected.js (72%) diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js b/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js index ee868a2e9198..5b1619d245b2 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js @@ -43,10 +43,26 @@ export default function ({ types: t }) { let node = path.node; + // if it is a non-prefix update expression (x++ etc) + // then we must replace with the expression (_export('x', x + 1), x++) + // in order to ensure the same update expression value + let isPostUpdateExpression = path.isUpdateExpression() && !node.prefix; + if (isPostUpdateExpression) { + if (node.operator === "++") + node = t.binaryExpression("+", node.argument, t.numericLiteral(1)); + else if (node.operator === "--") + node = t.binaryExpression("-", node.argument, t.numericLiteral(1)); + else + isPostUpdateExpression = false; + } + for (let exportedName of exportedNames) { node = this.buildCall(exportedName, node).expression; } + if (isPostUpdateExpression) + node = t.sequenceExpression([node, path.node]); + path.replaceWith(node); } }; diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/options.json b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/options.json deleted file mode 100644 index 576c2a257caf..000000000000 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["external-helpers", "transform-es2015-modules-systemjs"] -} diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/actual.js b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/actual.js similarity index 72% rename from packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/actual.js rename to packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/actual.js index 9d1ab87d80f2..e8ab2a516e24 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/actual.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/actual.js @@ -1,7 +1,10 @@ export function a() { alert("a"); + c++; } +export var c = 5; + function b() { a(); } diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/expected.js b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/expected.js similarity index 72% rename from packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/expected.js rename to packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/expected.js index c146273d8142..bc39479420f9 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/regression/T6973/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/hoisting-bindings/expected.js @@ -1,8 +1,10 @@ System.register([], function (_export, _context) { "use strict"; + var c; function a() { alert("a"); + _export("c", c + 1), c++; } _export("a", a); @@ -14,6 +16,10 @@ System.register([], function (_export, _context) { return { setters: [], execute: function () { + _export("c", c = 5); + + _export("c", c); + b(); } }; diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/remap/expected.js b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/remap/expected.js index 1522b5bfef0b..8859d20bf93d 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/remap/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/remap/expected.js @@ -10,7 +10,7 @@ System.register([], function (_export, _context) { _export("test", test); _export("test", test = 5); - _export("test", test++); + _export("test", test + 1), test++; (function () { var test = 2;