From 02c42b94f56c453a0b296e364879d5a3c5cee053 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 16:04:25 +1100 Subject: [PATCH 1/8] Add abstract references base #205 --- doc/caveats.md | 13 ++------- doc/differences.md | 1 + doc/features.md | 8 +++++ doc/index.md | 1 + lib/6to5/polyfill.js | 29 +++++++++++++++++++ lib/6to5/transformation/transform.js | 1 + .../transformers/abstract-references.js | 0 .../abstract-references/delete/actual.js | 1 + .../abstract-references/delete/expected.js | 3 ++ .../abstract-references/get/actual.js | 1 + .../abstract-references/get/expected.js | 3 ++ .../abstract-references/set/actual.js | 1 + .../abstract-references/set/expected.js | 3 ++ 13 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 lib/6to5/transformation/transformers/abstract-references.js create mode 100644 test/fixtures/transformation/abstract-references/delete/actual.js create mode 100644 test/fixtures/transformation/abstract-references/delete/expected.js create mode 100644 test/fixtures/transformation/abstract-references/get/actual.js create mode 100644 test/fixtures/transformation/abstract-references/get/expected.js create mode 100644 test/fixtures/transformation/abstract-references/set/actual.js create mode 100644 test/fixtures/transformation/abstract-references/set/expected.js diff --git a/doc/caveats.md b/doc/caveats.md index af8fb6b60f..3d70e833d0 100644 --- a/doc/caveats.md +++ b/doc/caveats.md @@ -6,9 +6,11 @@ satisfy **all** 6to5 feature requirements by using the included | Feature | Requirements | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| Abstract References | `Symbol` | | Array destructuring | `Array.isArray`, `Array.from` | | Async functions, Generators | [experimental option](usage.md#experimental), [regenerator runtime](https://github.com/facebook/regenerator/blob/master/runtime.js) | | Comprehensions | [experimental option](usage.md#experimental), `Array.isArray`, `Array.from` | +| For..Of | `Symbol`, `prototype[Symbol.iterator]` | | Spread | `Array.isArray`, `Array.from` | ## Classes @@ -36,14 +38,3 @@ class Bar extends Foo { } } ``` - -## Constructor spread - -Constructor spreads do not currently support built-ins. ie. -`new Array(...items)`. - -## For-of - -A polyfill is required for for-of functionality that implements `Symbol` and -adds `prototype[Symbol.iterator]` behaviour to built-ins. Using the polyfills -specified in [polyfill](polyfill.md) suffices. diff --git a/doc/differences.md b/doc/differences.md index 0a887a0ec0..81a07e0b27 100644 --- a/doc/differences.md +++ b/doc/differences.md @@ -69,6 +69,7 @@ better suited if you'd like a full ES6 environment with polyfills and all. | | 6to5 | Traceur | es6-transpiler | esnext | es6now | jstransform | | ---------------------------- | ----- | ------- | -------------- | ------ | ------ | ----------- | +| Abstract references | ✓ | | | | | | | Array comprehension | ✓ | ✓ | ✓ | | | | | Arrow functions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | Async functions | ✓ | ✓ | | ✓ | | | diff --git a/doc/features.md b/doc/features.md index 1d2732533d..1c0e42c215 100644 --- a/doc/features.md +++ b/doc/features.md @@ -1,5 +1,13 @@ # Features +## Abstract references ([experimental](usage.md#experimental)) + +```javascript +foo::bar; +foo::bar = baz; +delete foo::bar; +``` + ## Array comprehension ([experimental](usage.md#experimental)) ```javascript diff --git a/doc/index.md b/doc/index.md index 0e986d4869..45325bbfde 100644 --- a/doc/index.md +++ b/doc/index.md @@ -31,6 +31,7 @@ And it doesn't end here! To see all the ways you can use 6to5, check out the ## [Features](features.md) + - [Abstract references](features.md#abstract-references) ([experimental](usage.md#experimental)) - [Array comprehension](features.md#array-comprehension) ([experimental](usage.md#experimental)) - [Async functions](features.md#async-functions) ([experimental](usage.md#experimental)) - [Arrow functions](features.md#arrow-functions) diff --git a/lib/6to5/polyfill.js b/lib/6to5/polyfill.js index 343d5d3b18..332d317eee 100644 --- a/lib/6to5/polyfill.js +++ b/lib/6to5/polyfill.js @@ -1,6 +1,35 @@ +// + +var ensureSymbol = function (key) { + Symbol[key] = Symbol[key] || Symbol(); +}; + +var ensureProto = function (Constructor, key, val) { + var proto = Constructor.prototype; + proto[key] = proto[key] || val; +}; + +// + if (typeof Symbol === "undefined") { require("es6-symbol/implement"); } require("es6-shim"); require("./transformation/transformers/generators/runtime"); + +// Abstract references + +ensureSymbol("referenceGet"); +ensureSymbol("referenceSet"); +ensureSymbol("referenceDelete"); + +ensureProto(Function, Symbol.referenceGet, function () { return this }); + +ensureProto(Map, Symbol.referenceGet, Map.prototype.get); +ensureProto(Map, Symbol.referenceSet, Map.prototype.set); +ensureProto(Map, Symbol.referenceDelete, Map.prototype.delete); + +ensureProto(WeakMap, Symbol.referenceGet, WeakMap.prototype.get); +ensureProto(WeakMap, Symbol.referenceSet, WeakMap.prototype.set); +ensureProto(WeakMap, Symbol.referenceDelete, WeakMap.prototype.delete); diff --git a/lib/6to5/transformation/transform.js b/lib/6to5/transformation/transform.js index a0ba465c72..5a4b807f30 100644 --- a/lib/6to5/transformation/transform.js +++ b/lib/6to5/transformation/transform.js @@ -47,6 +47,7 @@ _.each({ forOf: require("./transformers/for-of"), unicodeRegex: require("./transformers/unicode-regex"), react: require("./transformers/react"), + abstractReferences: require("./transformers/abstract-references"), constants: require("./transformers/constants"), letScoping: require("./transformers/let-scoping"), diff --git a/lib/6to5/transformation/transformers/abstract-references.js b/lib/6to5/transformation/transformers/abstract-references.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/transformation/abstract-references/delete/actual.js b/test/fixtures/transformation/abstract-references/delete/actual.js new file mode 100644 index 0000000000..c6e232ad4c --- /dev/null +++ b/test/fixtures/transformation/abstract-references/delete/actual.js @@ -0,0 +1 @@ +delete foo::bar; diff --git a/test/fixtures/transformation/abstract-references/delete/expected.js b/test/fixtures/transformation/abstract-references/delete/expected.js new file mode 100644 index 0000000000..f49850f41d --- /dev/null +++ b/test/fixtures/transformation/abstract-references/delete/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +bar[Symbol.referenceDelete](foo); diff --git a/test/fixtures/transformation/abstract-references/get/actual.js b/test/fixtures/transformation/abstract-references/get/actual.js new file mode 100644 index 0000000000..d6a275fb29 --- /dev/null +++ b/test/fixtures/transformation/abstract-references/get/actual.js @@ -0,0 +1 @@ +foo::bar; diff --git a/test/fixtures/transformation/abstract-references/get/expected.js b/test/fixtures/transformation/abstract-references/get/expected.js new file mode 100644 index 0000000000..70419d5d74 --- /dev/null +++ b/test/fixtures/transformation/abstract-references/get/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +bar[Symbol.referenceGet](foo); diff --git a/test/fixtures/transformation/abstract-references/set/actual.js b/test/fixtures/transformation/abstract-references/set/actual.js new file mode 100644 index 0000000000..0edb7d4dd8 --- /dev/null +++ b/test/fixtures/transformation/abstract-references/set/actual.js @@ -0,0 +1 @@ +foo::bar = baz; diff --git a/test/fixtures/transformation/abstract-references/set/expected.js b/test/fixtures/transformation/abstract-references/set/expected.js new file mode 100644 index 0000000000..03749174eb --- /dev/null +++ b/test/fixtures/transformation/abstract-references/set/expected.js @@ -0,0 +1,3 @@ +"use strict"; + +bar[Symbol.referenceSet](foo, baz); From fad0be8a45b91392a00d81a4ea75a519a491bc6c Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 16:08:54 +1100 Subject: [PATCH 2/8] add spec references --- doc/features.md | 4 ++-- lib/6to5/transformation/transformers/abstract-references.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/features.md b/doc/features.md index 1c0e42c215..08f55b657f 100644 --- a/doc/features.md +++ b/doc/features.md @@ -1,6 +1,6 @@ # Features -## Abstract references ([experimental](usage.md#experimental)) +## Abstract references ([experimental](usage.md#experimental)) ([spec](https://github.com/zenparsing/es-abstract-refs)) ```javascript foo::bar; @@ -39,7 +39,7 @@ var bob = { }; ``` -## Async functions ([experimental](usage.md#experimental)) +## Async functions ([experimental](usage.md#experimental)) ([spec](https://github.com/lukehoban/ecmascript-asyncawait)) ```javascript async function chainAnimationsAsync(elem, animations) { diff --git a/lib/6to5/transformation/transformers/abstract-references.js b/lib/6to5/transformation/transformers/abstract-references.js index e69de29bb2..aa3011ed83 100644 --- a/lib/6to5/transformation/transformers/abstract-references.js +++ b/lib/6to5/transformation/transformers/abstract-references.js @@ -0,0 +1 @@ +// https://github.com/zenparsing/es-abstract-refs From fcc4734a1f4b92953725554053ffd78057d1cfd3 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 16:47:13 +1100 Subject: [PATCH 3/8] complete abstract references support - parser support left --- lib/6to5/generation/generators/types.js | 6 + .../templates/abstract-expression-delete.js | 1 + lib/6to5/templates/abstract-expression-get.js | 1 + lib/6to5/templates/abstract-expression-set.js | 1 + .../transformers/es7-abstract-references.js | 31 ++++ lib/6to5/types/visitor-keys.json | 149 +++++++++--------- 6 files changed, 115 insertions(+), 74 deletions(-) create mode 100644 lib/6to5/templates/abstract-expression-delete.js create mode 100644 lib/6to5/templates/abstract-expression-get.js create mode 100644 lib/6to5/templates/abstract-expression-set.js diff --git a/lib/6to5/generation/generators/types.js b/lib/6to5/generation/generators/types.js index 92b4b2509d..f9f79fcc2e 100644 --- a/lib/6to5/generation/generators/types.js +++ b/lib/6to5/generation/generators/types.js @@ -9,6 +9,12 @@ exports.SpreadElement = function (node, print) { print(node.argument); }; +exports.VirtualPropertyExpression = function (node, print) { + print(node.object); + this.push("::"); + print(node.property); +}; + exports.ObjectExpression = exports.ObjectPattern = function (node, print) { var props = node.properties; diff --git a/lib/6to5/templates/abstract-expression-delete.js b/lib/6to5/templates/abstract-expression-delete.js new file mode 100644 index 0000000000..a78f195e1f --- /dev/null +++ b/lib/6to5/templates/abstract-expression-delete.js @@ -0,0 +1 @@ +PROPERTY[Symbol.referenceDelete](OBJECT) diff --git a/lib/6to5/templates/abstract-expression-get.js b/lib/6to5/templates/abstract-expression-get.js new file mode 100644 index 0000000000..bc8a623e9c --- /dev/null +++ b/lib/6to5/templates/abstract-expression-get.js @@ -0,0 +1 @@ +PROPERTY[Symbol.referenceGet](OBJECT) diff --git a/lib/6to5/templates/abstract-expression-set.js b/lib/6to5/templates/abstract-expression-set.js new file mode 100644 index 0000000000..90a5edd887 --- /dev/null +++ b/lib/6to5/templates/abstract-expression-set.js @@ -0,0 +1 @@ +PROPERTY[Symbol.referenceSet](OBJECT, VALUE) diff --git a/lib/6to5/transformation/transformers/es7-abstract-references.js b/lib/6to5/transformation/transformers/es7-abstract-references.js index aa3011ed83..9f75d26134 100644 --- a/lib/6to5/transformation/transformers/es7-abstract-references.js +++ b/lib/6to5/transformation/transformers/es7-abstract-references.js @@ -1 +1,32 @@ // https://github.com/zenparsing/es-abstract-refs + +var util = require("../../util"); +var t = require("../../types"); + +exports.AssignmentExpression = function (node, parent) { + var left = node.left; + if (!t.isVirtualPropertyExpression(left)) return; + + return util.template("abstract-expression-set", { + PROPERTY: left.property, + OBJECT: left.object, + VALUE: node.right + }); +}; + +exports.UnaryExpression = function (node, parent) { + if (!t.isVirtualPropertyExpression(node.argument)) return; + if (node.operator !== "delete") return; + + return util.template("abstract-expression-delete", { + PROPERTY: node.property, + OBJECT: node.object + }); +}; + +exports.VirtualPropertyExpression = function (node) { + return util.template("abstract-expression-get", { + PROPERTY: node.property, + OBJECT: node.object + }); +}; diff --git a/lib/6to5/types/visitor-keys.json b/lib/6to5/types/visitor-keys.json index af3cf76b1d..44b32401de 100644 --- a/lib/6to5/types/visitor-keys.json +++ b/lib/6to5/types/visitor-keys.json @@ -1,76 +1,77 @@ { - "ArrayExpression": ["elements"], - "ArrayPattern": ["elements"], - "ArrowFunctionExpression": ["params", "defaults", "rest", "body"], - "AssignmentExpression": ["left", "right"], - "AwaitExpression": ["argument"], - "BinaryExpression": ["left", "right"], - "BlockStatement": ["body"], - "BreakStatement": ["label"], - "CallExpression": ["callee", "arguments"], - "CatchClause": ["param", "body"], - "ClassBody": ["body"], - "ClassDeclaration": ["id", "body", "superClass"], - "ClassExpression": ["id", "body", "superClass"], - "ComprehensionBlock": ["left", "right", "body"], - "ComprehensionExpression": ["filter", "blocks", "body"], - "ConditionalExpression": ["test", "consequent", "alternate"], - "ContinueStatement": ["label"], - "DebuggerStatement": [], - "DoWhileStatement": ["body", "test"], - "EmptyStatement": [], - "ExportBatchSpecifier": [], - "ExportDeclaration": ["declaration", "specifiers", "source"], - "ExportSpecifier": ["id", "name"], - "ExpressionStatement": ["expression"], - "File": ["program"], - "ForInStatement": ["left", "right", "body"], - "ForOfStatement": ["left", "right", "body"], - "ForStatement": ["init", "test", "update", "body"], - "FunctionDeclaration": ["id", "params", "defaults", "rest", "body"], - "FunctionExpression": ["id", "params", "defaults", "rest", "body"], - "Identifier": [], - "IfStatement": ["test", "consequent", "alternate"], - "ImportBatchSpecifier": ["id"], - "ImportDeclaration": ["specifiers", "source"], - "ImportSpecifier": ["id", "name"], - "LabeledStatement": ["label", "body"], - "Literal": [], - "LogicalExpression": ["left", "right"], - "MemberExpression": ["object", "property"], - "MethodDefinition": ["key", "value"], - "NewExpression": ["callee", "arguments"], - "ObjectExpression": ["properties"], - "ObjectPattern": ["properties"], - "ParenthesizedExpression": ["expression"], - "Program": ["body"], - "Property": ["key", "value"], - "ReturnStatement": ["argument"], - "SequenceExpression": ["expressions"], - "SpreadElement": ["argument"], - "SwitchCase": ["test", "consequent"], - "SwitchStatement": ["discriminant", "cases"], - "TaggedTemplateExpression": ["tag", "quasi"], - "TemplateElement": [], - "TemplateLiteral": ["quasis", "expressions"], - "ThisExpression": [], - "ThrowStatement": ["argument"], - "TryStatement": ["block", "handlers", "handler", "guardedHandlers", "finalizer"], - "UnaryExpression": ["argument"], - "UpdateExpression": ["argument"], - "VariableDeclaration": ["declarations"], - "VariableDeclarator": ["id", "init"], - "WhileStatement": ["test", "body"], - "WithStatement": ["object", "body"], - "XJSAttribute": ["name", "value"], - "XJSClosingElement": ["name"], - "XJSElement": ["openingElement", "closingElement", "children"], - "XJSEmptyExpression": [], - "XJSExpressionContainer": ["expression"], - "XJSIdentifier": [], - "XJSMemberExpression": ["object", "property"], - "XJSNamespacedName": ["namespace", "name"], - "XJSOpeningElement": ["name", "attributes"], - "XJSSpreadAttribute": ["argument"], - "YieldExpression": ["argument"] + "ArrayExpression": ["elements"], + "ArrayPattern": ["elements"], + "ArrowFunctionExpression": ["params", "defaults", "rest", "body"], + "AssignmentExpression": ["left", "right"], + "AwaitExpression": ["argument"], + "BinaryExpression": ["left", "right"], + "BlockStatement": ["body"], + "BreakStatement": ["label"], + "CallExpression": ["callee", "arguments"], + "CatchClause": ["param", "body"], + "ClassBody": ["body"], + "ClassDeclaration": ["id", "body", "superClass"], + "ClassExpression": ["id", "body", "superClass"], + "ComprehensionBlock": ["left", "right", "body"], + "ComprehensionExpression": ["filter", "blocks", "body"], + "ConditionalExpression": ["test", "consequent", "alternate"], + "ContinueStatement": ["label"], + "DebuggerStatement": [], + "DoWhileStatement": ["body", "test"], + "EmptyStatement": [], + "ExportBatchSpecifier": [], + "ExportDeclaration": ["declaration", "specifiers", "source"], + "ExportSpecifier": ["id", "name"], + "ExpressionStatement": ["expression"], + "File": ["program"], + "ForInStatement": ["left", "right", "body"], + "ForOfStatement": ["left", "right", "body"], + "ForStatement": ["init", "test", "update", "body"], + "FunctionDeclaration": ["id", "params", "defaults", "rest", "body"], + "FunctionExpression": ["id", "params", "defaults", "rest", "body"], + "Identifier": [], + "IfStatement": ["test", "consequent", "alternate"], + "ImportBatchSpecifier": ["id"], + "ImportDeclaration": ["specifiers", "source"], + "ImportSpecifier": ["id", "name"], + "LabeledStatement": ["label", "body"], + "Literal": [], + "LogicalExpression": ["left", "right"], + "MemberExpression": ["object", "property"], + "MethodDefinition": ["key", "value"], + "NewExpression": ["callee", "arguments"], + "ObjectExpression": ["properties"], + "ObjectPattern": ["properties"], + "ParenthesizedExpression": ["expression"], + "Program": ["body"], + "Property": ["key", "value"], + "ReturnStatement": ["argument"], + "SequenceExpression": ["expressions"], + "SpreadElement": ["argument"], + "SwitchCase": ["test", "consequent"], + "SwitchStatement": ["discriminant", "cases"], + "TaggedTemplateExpression": ["tag", "quasi"], + "TemplateElement": [], + "TemplateLiteral": ["quasis", "expressions"], + "ThisExpression": [], + "ThrowStatement": ["argument"], + "TryStatement": ["block", "handlers", "handler", "guardedHandlers", "finalizer"], + "UnaryExpression": ["argument"], + "UpdateExpression": ["argument"], + "VariableDeclaration": ["declarations"], + "VariableDeclarator": ["id", "init"], + "VirtualPropertyExpression": ["left", "right"], + "WhileStatement": ["test", "body"], + "WithStatement": ["object", "body"], + "XJSAttribute": ["name", "value"], + "XJSClosingElement": ["name"], + "XJSElement": ["openingElement", "closingElement", "children"], + "XJSEmptyExpression": [], + "XJSExpressionContainer": ["expression"], + "XJSIdentifier": [], + "XJSMemberExpression": ["object", "property"], + "XJSNamespacedName": ["namespace", "name"], + "XJSOpeningElement": ["name", "attributes"], + "XJSSpreadAttribute": ["argument"], + "YieldExpression": ["argument"] } From bf0ca10253f3474c9e5d418e005f1550f330110d Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 16:54:51 +1100 Subject: [PATCH 4/8] add abstract reference CallExpression base --- .../transformation/transformers/es7-abstract-references.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/6to5/transformation/transformers/es7-abstract-references.js b/lib/6to5/transformation/transformers/es7-abstract-references.js index 9f75d26134..2f5134ca59 100644 --- a/lib/6to5/transformation/transformers/es7-abstract-references.js +++ b/lib/6to5/transformation/transformers/es7-abstract-references.js @@ -24,6 +24,11 @@ exports.UnaryExpression = function (node, parent) { }); }; +exports.CallExpression = function (node, parent) { + var callee = node.callee; + if (!t.isVirtualPropertyExpression(callee)) return; +}; + exports.VirtualPropertyExpression = function (node) { return util.template("abstract-expression-get", { PROPERTY: node.property, From b9da4f988c48930a54285a5e6412753f52e29eb7 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 18:36:38 +1100 Subject: [PATCH 5/8] upgrade acorn-6to5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b75748aed5..ef64290cae 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "chokidar": "0.11.1", "source-map-support": "0.2.8", "esutils": "1.1.6", - "acorn-6to5": "0.9.1-4", + "acorn-6to5": "0.9.1-5", "estraverse": "1.8.0", "private": "0.1.6" }, From 55150853b463dbd08691e09e5c1c8ca16731498d Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 18:36:57 +1100 Subject: [PATCH 6/8] remove SequenceExpression user whitespace --- lib/6to5/generation/node/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/6to5/generation/node/index.js b/lib/6to5/generation/node/index.js index 847508fb55..9e8995889a 100644 --- a/lib/6to5/generation/node/index.js +++ b/lib/6to5/generation/node/index.js @@ -27,8 +27,7 @@ Node.prototype.isUserWhitespacable = function () { var parent = this.parent; var node = this.node; - if (t.isUserWhitespacable(node) || - t.isSequenceExpression(parent)) { + if (t.isUserWhitespacable(node)) { return true; } From 4502aee9884820a76019c5e4ab498c9b0d5824f3 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 18:37:30 +1100 Subject: [PATCH 7/8] 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)) ; From 0339d21c33ec83ae662412edc89db81b655adf25 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 18:37:43 +1100 Subject: [PATCH 8/8] add WeakMap existence check to symbol polyfilling --- lib/6to5/polyfill.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/6to5/polyfill.js b/lib/6to5/polyfill.js index 4934fdb59b..2cf4d1784d 100644 --- a/lib/6to5/polyfill.js +++ b/lib/6to5/polyfill.js @@ -30,6 +30,8 @@ ensureProto(Map, Symbol.referenceGet, Map.prototype.get); ensureProto(Map, Symbol.referenceSet, Map.prototype.set); ensureProto(Map, Symbol.referenceDelete, Map.prototype.delete); -ensureProto(WeakMap, Symbol.referenceGet, WeakMap.prototype.get); -ensureProto(WeakMap, Symbol.referenceSet, WeakMap.prototype.set); -ensureProto(WeakMap, Symbol.referenceDelete, WeakMap.prototype.delete); +if (global.WeakMap) { + ensureProto(WeakMap, Symbol.referenceGet, WeakMap.prototype.get); + ensureProto(WeakMap, Symbol.referenceSet, WeakMap.prototype.set); + ensureProto(WeakMap, Symbol.referenceDelete, WeakMap.prototype.delete); +}