From fcc4734a1f4b92953725554053ffd78057d1cfd3 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sun, 23 Nov 2014 16:47:13 +1100 Subject: [PATCH] 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"] }