From 35522c2ef329c159d912d862e908c6d32440ee99 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sat, 11 Oct 2014 08:58:54 +1100 Subject: [PATCH] static method class super references - fixes #40 --- lib/6to5/transformers/classes.js | 11 ++++++----- test/fixtures/classes/accessing-super-class/actual.js | 4 ++++ .../classes/accessing-super-class/expected.js | 3 +++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/6to5/transformers/classes.js b/lib/6to5/transformers/classes.js index 84334d031e..765f030cef 100644 --- a/lib/6to5/transformers/classes.js +++ b/lib/6to5/transformers/classes.js @@ -81,7 +81,7 @@ var buildClassBody = function (body, className, superName, node) { var methodName = node.key.name; var method = node.value; - replaceInstanceSuperReferences(superName, method, methodName); + replaceInstanceSuperReferences(superName, method, node, methodName); if (methodName === "constructor") { if (node.kind === "") { @@ -126,7 +126,7 @@ var buildClassBody = function (body, className, superName, node) { } }; -var superIdentifier = function (superName, methodName, node, parent) { +var superIdentifier = function (superName, methodNode, methodName, node, parent) { if (parent.property === node) return; node.name = superName.name || superName.value; @@ -138,7 +138,8 @@ var superIdentifier = function (superName, methodName, node, parent) { node.name += ".call"; } else { // foo() { super(); } - node.name += ".prototype." + methodName + ".call"; + if (!methodNode.static) node.name += ".prototype"; + node.name += "." + methodName + ".call"; } parent.arguments.unshift(b.thisExpression()); @@ -148,12 +149,12 @@ var superIdentifier = function (superName, methodName, node, parent) { } }; -var replaceInstanceSuperReferences = function (superName, method, methodName) { +var replaceInstanceSuperReferences = function (superName, method, methodNode, methodName) { superName = superName || b.literal("Function"); traverse(method, function (node, parent) { if (node.type === "Identifier" && node.name === "super") { - superIdentifier(superName, methodName, node, parent); + superIdentifier(superName, methodNode, methodName, node, parent); } else if (node.type === "CallExpression") { var callee = node.callee; if (callee.type !== "MemberExpression") return; diff --git a/test/fixtures/classes/accessing-super-class/actual.js b/test/fixtures/classes/accessing-super-class/actual.js index 88c57722af..b6c04c4c61 100644 --- a/test/fixtures/classes/accessing-super-class/actual.js +++ b/test/fixtures/classes/accessing-super-class/actual.js @@ -9,4 +9,8 @@ class Test extends Foo { test() { super(); } + + static foo() { + super(); + } } diff --git a/test/fixtures/classes/accessing-super-class/expected.js b/test/fixtures/classes/accessing-super-class/expected.js index 859d18e34e..9aeb053d55 100644 --- a/test/fixtures/classes/accessing-super-class/expected.js +++ b/test/fixtures/classes/accessing-super-class/expected.js @@ -17,5 +17,8 @@ var Test = function (Foo) { Test.prototype.test = function () { Foo.prototype.test.call(this); }; + Test.foo = function () { + Foo.foo.call(this); + }; return Test; }(Foo);