diff --git a/lib/6to5/transformers/classes.js b/lib/6to5/transformers/classes.js index 9ac9aa3ced..0bb447bb12 100644 --- a/lib/6to5/transformers/classes.js +++ b/lib/6to5/transformers/classes.js @@ -3,14 +3,14 @@ var util = require("../util"); var b = require("ast-types").builders; var _ = require("lodash"); -exports.ClassDeclaration = function (node) { +exports.ClassDeclaration = function (node, parent, opts, generateUid) { return b.variableDeclaration("var", [ - b.variableDeclarator(node.id, buildClass(node)) + b.variableDeclarator(node.id, buildClass(node, generateUid)) ]); }; -exports.ClassExpression = function (node) { - return buildClass(node); +exports.ClassExpression = function (node, parent, opts, generateUid) { + return buildClass(node, generateUid); }; var getMemberExpressionObject = function (node) { @@ -20,14 +20,20 @@ var getMemberExpressionObject = function (node) { return node; }; -var buildClass = function (node) { +var buildClass = function (node, generateUid) { var superName = node.superClass; var className = node.id || b.identifier("Anonymous"); - var superClassReference = node.superClass; + var superClassArgument = node.superClass; + var superClassCallee = node.superClass; - if (superName && superName.type === "MemberExpression") { - superClassReference = getMemberExpressionObject(superName); + if (superName) { + if (superName.type === "MemberExpression") { + superClassArgument = superClassCallee = getMemberExpressionObject(superName); + } else if (superName.type !== "Identifier") { + superClassArgument = superName; + superClassCallee = superName = b.identifier(generateUid("ref")); + } } var container = util.template("class", { @@ -45,8 +51,8 @@ var buildClass = function (node) { CLASS_NAME: className }, true)); - container.arguments.push(superClassReference); - container.callee.params.push(superClassReference); + container.arguments.push(superClassArgument); + container.callee.params.push(superClassCallee); } buildClassBody(body, className, superName, node); diff --git a/package.json b/package.json index 3084236f01..4cd0152638 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "6to5", "description": "Turn ES6 code into vanilla ES5 with source maps and no runtime", - "version": "1.7.0", + "version": "1.7.1", "author": "Sebastian McKenzie ", "homepage": "https://github.com/sebmck/6to5", "repository": { diff --git a/test/fixtures/classes/super-class-non-identifiers/actual.js b/test/fixtures/classes/super-class-non-identifiers/actual.js new file mode 100644 index 0000000000..61658914b7 --- /dev/null +++ b/test/fixtures/classes/super-class-non-identifiers/actual.js @@ -0,0 +1,3 @@ +class Q extends function() {} { + +} diff --git a/test/fixtures/classes/super-class-non-identifiers/expected.js b/test/fixtures/classes/super-class-non-identifiers/expected.js new file mode 100644 index 0000000000..87b186465f --- /dev/null +++ b/test/fixtures/classes/super-class-non-identifiers/expected.js @@ -0,0 +1,14 @@ +var Q = function(_ref) { + function Q() {} + + Q.prototype = Object.create(_ref.prototype, { + constructor: { + value: Q, + enumerable: false, + writable: true, + configurable: true + } + }); + + return Q; +}(function() {});