From 0664ccff98e551b2bc6dfc829a3fabed99bccd4c Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 9 Oct 2014 14:03:19 +1100 Subject: [PATCH] add support for member expression super classes - closes #22 --- lib/6to5/transformers/classes.js | 17 ++++++++++-- .../super-class-member-expression/actual.js | 7 +++++ .../super-class-member-expression/expected.js | 27 +++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/classes/super-class-member-expression/actual.js create mode 100644 test/fixtures/classes/super-class-member-expression/expected.js diff --git a/lib/6to5/transformers/classes.js b/lib/6to5/transformers/classes.js index 32e2011cfc..dc78cbe2e7 100644 --- a/lib/6to5/transformers/classes.js +++ b/lib/6to5/transformers/classes.js @@ -13,10 +13,23 @@ exports.ClassExpression = function (node) { return buildClass(node); }; +var getMemberExpressionObject = function (node) { + while (node.type === "MemberExpression") { + node = node.object; + } + return node; +}; + var buildClass = function (node) { var superName = node.superClass; var className = node.id; + var superClassReference = node.superClass; + + if (superName && superName.type === "MemberExpression") { + superClassReference = getMemberExpressionObject(superName); + } + var container = util.template("class", { CLASS_NAME: className }); @@ -32,8 +45,8 @@ var buildClass = function (node) { CLASS_NAME: className }, true)); - container.arguments.push(superName); - container.callee.params.push(superName); + container.arguments.push(superClassReference); + container.callee.params.push(superClassReference); } buildClassBody(body, className, superName, node); diff --git a/test/fixtures/classes/super-class-member-expression/actual.js b/test/fixtures/classes/super-class-member-expression/actual.js new file mode 100644 index 0000000000..e245d3a69b --- /dev/null +++ b/test/fixtures/classes/super-class-member-expression/actual.js @@ -0,0 +1,7 @@ +class BaseController extends Chaplin.Controller { + +} + +class BaseController2 extends Chaplin.Controller.Another { + +} diff --git a/test/fixtures/classes/super-class-member-expression/expected.js b/test/fixtures/classes/super-class-member-expression/expected.js new file mode 100644 index 0000000000..6df3e37aee --- /dev/null +++ b/test/fixtures/classes/super-class-member-expression/expected.js @@ -0,0 +1,27 @@ +var BaseController = function (Chaplin) { + function BaseController() { + } + BaseController.prototype = Object.create(Chaplin.Controller.prototype, { + constructor: { + value: BaseController, + enumerable: false, + writable: true, + configurable: true + } + }); + return BaseController; +}(Chaplin); + +var BaseController2 = function (Chaplin) { + function BaseController2() { + } + BaseController2.prototype = Object.create(Chaplin.Controller.Another.prototype, { + constructor: { + value: BaseController2, + enumerable: false, + writable: true, + configurable: true + } + }); + return BaseController2; +}(Chaplin);