From 4502aee9884820a76019c5e4ab498c9b0d5824f3 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 18:37:30 +1100 Subject: [PATCH] add support for call expression abstract references and more versatile tests --- .../templates/abstract-expression-call.js | 1 + .../transformers/es7-abstract-references.js | 35 +++++++++++++++---- .../es7-abstract-references/call/actual.js | 2 ++ .../es7-abstract-references/call/expected.js | 4 +++ .../es7-abstract-references/delete/actual.js | 2 ++ .../delete/expected.js | 2 ++ .../es7-abstract-references/options.json | 3 ++ .../es7-abstract-references/set/actual.js | 1 + .../es7-abstract-references/set/expected.js | 1 + 9 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 lib/6to5/templates/abstract-expression-call.js create mode 100644 test/fixtures/transformation/es7-abstract-references/call/actual.js create mode 100644 test/fixtures/transformation/es7-abstract-references/call/expected.js create mode 100644 test/fixtures/transformation/es7-abstract-references/options.json diff --git a/lib/6to5/templates/abstract-expression-call.js b/lib/6to5/templates/abstract-expression-call.js new file mode 100644 index 0000000000..622b0588aa --- /dev/null +++ b/lib/6to5/templates/abstract-expression-call.js @@ -0,0 +1 @@ +PROPERTY[Symbol.referenceGet](OBJECT).call(OBJECT) diff --git a/lib/6to5/transformation/transformers/es7-abstract-references.js b/lib/6to5/transformation/transformers/es7-abstract-references.js index 2f5134ca59..a8cd071237 100644 --- a/lib/6to5/transformation/transformers/es7-abstract-references.js +++ b/lib/6to5/transformation/transformers/es7-abstract-references.js @@ -3,30 +3,53 @@ var util = require("../../util"); var t = require("../../types"); +var container = function (parent, call, ret) { + if (t.isExpressionStatement(parent)) { + // we don't need to worry about return values + return call; + } else { + return t.sequenceExpression([call, ret]); + } +}; + exports.AssignmentExpression = function (node, parent) { var left = node.left; if (!t.isVirtualPropertyExpression(left)) return; - return util.template("abstract-expression-set", { + var right = node.right; + + var call = util.template("abstract-expression-set", { PROPERTY: left.property, OBJECT: left.object, - VALUE: node.right + VALUE: right }); + + return container(parent, call, right); }; exports.UnaryExpression = function (node, parent) { - if (!t.isVirtualPropertyExpression(node.argument)) return; + var arg = node.argument; + if (!t.isVirtualPropertyExpression(arg)) return; if (node.operator !== "delete") return; - return util.template("abstract-expression-delete", { - PROPERTY: node.property, - OBJECT: node.object + var call = util.template("abstract-expression-delete", { + PROPERTY: arg.property, + OBJECT: arg.object }); + + return container(parent, call, t.literal(true)); }; exports.CallExpression = function (node, parent) { var callee = node.callee; if (!t.isVirtualPropertyExpression(callee)) return; + + var call = util.template("abstract-expression-call", { + PROPERTY: callee.property, + OBJECT: callee.object + }); + call.arguments = call.arguments.concat(node.arguments); + return call; }; exports.VirtualPropertyExpression = function (node) { diff --git a/test/fixtures/transformation/es7-abstract-references/call/actual.js b/test/fixtures/transformation/es7-abstract-references/call/actual.js new file mode 100644 index 0000000000..ced7e8054a --- /dev/null +++ b/test/fixtures/transformation/es7-abstract-references/call/actual.js @@ -0,0 +1,2 @@ +foo::bar(); +foo::bar("arg"); diff --git a/test/fixtures/transformation/es7-abstract-references/call/expected.js b/test/fixtures/transformation/es7-abstract-references/call/expected.js new file mode 100644 index 0000000000..9906be863c --- /dev/null +++ b/test/fixtures/transformation/es7-abstract-references/call/expected.js @@ -0,0 +1,4 @@ +"use strict"; + +bar[Symbol.referenceGet](foo).call(foo); +bar[Symbol.referenceGet](foo).call(foo, "arg"); diff --git a/test/fixtures/transformation/es7-abstract-references/delete/actual.js b/test/fixtures/transformation/es7-abstract-references/delete/actual.js index c6e232ad4c..47c17e0269 100644 --- a/test/fixtures/transformation/es7-abstract-references/delete/actual.js +++ b/test/fixtures/transformation/es7-abstract-references/delete/actual.js @@ -1 +1,3 @@ delete foo::bar; + +if (delete foo::bar); diff --git a/test/fixtures/transformation/es7-abstract-references/delete/expected.js b/test/fixtures/transformation/es7-abstract-references/delete/expected.js index f49850f41d..38b7e10af1 100644 --- a/test/fixtures/transformation/es7-abstract-references/delete/expected.js +++ b/test/fixtures/transformation/es7-abstract-references/delete/expected.js @@ -1,3 +1,5 @@ "use strict"; bar[Symbol.referenceDelete](foo); + +if ((bar[Symbol.referenceDelete](foo), true)) ; diff --git a/test/fixtures/transformation/es7-abstract-references/options.json b/test/fixtures/transformation/es7-abstract-references/options.json new file mode 100644 index 0000000000..252f473a73 --- /dev/null +++ b/test/fixtures/transformation/es7-abstract-references/options.json @@ -0,0 +1,3 @@ +{ + "experimental": true +} diff --git a/test/fixtures/transformation/es7-abstract-references/set/actual.js b/test/fixtures/transformation/es7-abstract-references/set/actual.js index 0edb7d4dd8..3f18c6b93b 100644 --- a/test/fixtures/transformation/es7-abstract-references/set/actual.js +++ b/test/fixtures/transformation/es7-abstract-references/set/actual.js @@ -1 +1,2 @@ foo::bar = baz; +if (foo::bar = baz); diff --git a/test/fixtures/transformation/es7-abstract-references/set/expected.js b/test/fixtures/transformation/es7-abstract-references/set/expected.js index 03749174eb..fd1b67fb34 100644 --- a/test/fixtures/transformation/es7-abstract-references/set/expected.js +++ b/test/fixtures/transformation/es7-abstract-references/set/expected.js @@ -1,3 +1,4 @@ "use strict"; bar[Symbol.referenceSet](foo, baz); +if ((bar[Symbol.referenceSet](foo, baz), baz)) ;