support for non-Identifier/MemberExpression class super

This commit is contained in:
Sebastian McKenzie 2014-10-10 10:57:35 +11:00
parent f82909f4ca
commit 9c5262baab
4 changed files with 34 additions and 11 deletions

View File

@ -3,14 +3,14 @@ var util = require("../util");
var b = require("ast-types").builders; var b = require("ast-types").builders;
var _ = require("lodash"); var _ = require("lodash");
exports.ClassDeclaration = function (node) { exports.ClassDeclaration = function (node, parent, opts, generateUid) {
return b.variableDeclaration("var", [ return b.variableDeclaration("var", [
b.variableDeclarator(node.id, buildClass(node)) b.variableDeclarator(node.id, buildClass(node, generateUid))
]); ]);
}; };
exports.ClassExpression = function (node) { exports.ClassExpression = function (node, parent, opts, generateUid) {
return buildClass(node); return buildClass(node, generateUid);
}; };
var getMemberExpressionObject = function (node) { var getMemberExpressionObject = function (node) {
@ -20,14 +20,20 @@ var getMemberExpressionObject = function (node) {
return node; return node;
}; };
var buildClass = function (node) { var buildClass = function (node, generateUid) {
var superName = node.superClass; var superName = node.superClass;
var className = node.id || b.identifier("Anonymous"); var className = node.id || b.identifier("Anonymous");
var superClassReference = node.superClass; var superClassArgument = node.superClass;
var superClassCallee = node.superClass;
if (superName && superName.type === "MemberExpression") { if (superName) {
superClassReference = getMemberExpressionObject(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", { var container = util.template("class", {
@ -45,8 +51,8 @@ var buildClass = function (node) {
CLASS_NAME: className CLASS_NAME: className
}, true)); }, true));
container.arguments.push(superClassReference); container.arguments.push(superClassArgument);
container.callee.params.push(superClassReference); container.callee.params.push(superClassCallee);
} }
buildClassBody(body, className, superName, node); buildClassBody(body, className, superName, node);

View File

@ -1,7 +1,7 @@
{ {
"name": "6to5", "name": "6to5",
"description": "Turn ES6 code into vanilla ES5 with source maps and no runtime", "description": "Turn ES6 code into vanilla ES5 with source maps and no runtime",
"version": "1.7.0", "version": "1.7.1",
"author": "Sebastian McKenzie <sebmck@gmail.com>", "author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://github.com/sebmck/6to5", "homepage": "https://github.com/sebmck/6to5",
"repository": { "repository": {

View File

@ -0,0 +1,3 @@
class Q extends function() {} {
}

View File

@ -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() {});