delay this assignment when referencing this inside an arrow function pre-bare super in derived class constructors - fixes #1920
This commit is contained in:
parent
cda2bfce38
commit
1fd0b1f741
@ -52,8 +52,21 @@ var verifyConstructorVisitor = {
|
|||||||
|
|
||||||
ThisExpression(node, parent, scope, state) {
|
ThisExpression(node, parent, scope, state) {
|
||||||
if (state.isDerived && !state.hasBareSuper) {
|
if (state.isDerived && !state.hasBareSuper) {
|
||||||
|
if (this.inShadow()) {
|
||||||
|
var thisAlias = state.constructorPath.getData("this");
|
||||||
|
|
||||||
|
if (!thisAlias) {
|
||||||
|
thisAlias = state.constructorPath.setData(
|
||||||
|
"this",
|
||||||
|
state.constructorPath.scope.generateUidIdentifier("this")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return thisAlias;
|
||||||
|
} else {
|
||||||
throw this.errorWithNode("'this' is not allowed before super()");
|
throw this.errorWithNode("'this' is not allowed before super()");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Super(node, parent, scope, state) {
|
Super(node, parent, scope, state) {
|
||||||
@ -429,13 +442,21 @@ export default class ClassTransformer {
|
|||||||
|
|
||||||
verifyConstructor(path: NodePath) {
|
verifyConstructor(path: NodePath) {
|
||||||
var state = {
|
var state = {
|
||||||
|
constructorPath: path.get("value"),
|
||||||
hasBareSuper: false,
|
hasBareSuper: false,
|
||||||
bareSuper: null,
|
bareSuper: null,
|
||||||
isDerived: this.isDerived,
|
isDerived: this.isDerived,
|
||||||
file: this.file
|
file: this.file,
|
||||||
};
|
};
|
||||||
|
|
||||||
path.get("value").traverse(verifyConstructorVisitor, state);
|
state.constructorPath.traverse(verifyConstructorVisitor, state);
|
||||||
|
|
||||||
|
var thisAlias = state.constructorPath.getData("this");
|
||||||
|
if (thisAlias && state.bareSuper) {
|
||||||
|
state.bareSuper.insertAfter(t.variableDeclaration("var", [
|
||||||
|
t.variableDeclarator(thisAlias, t.thisExpression())
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
this.bareSuper = state.bareSuper;
|
this.bareSuper = state.bareSuper;
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,8 @@ export var metadata = {
|
|||||||
|
|
||||||
function remap(path, key, create) {
|
function remap(path, key, create) {
|
||||||
// ensure that we're shadowed
|
// ensure that we're shadowed
|
||||||
if (!path.inShadow()) return;
|
var shadowPath = path.inShadow();
|
||||||
|
if (!shadowPath || shadowPath.isArrowFunctionExpression()) return;
|
||||||
|
|
||||||
var shadowFunction = path.node._shadowedFunctionLiteral;
|
var shadowFunction = path.node._shadowedFunctionLiteral;
|
||||||
var currentFunction;
|
var currentFunction;
|
||||||
|
|||||||
@ -178,7 +178,7 @@ export function inShadow() {
|
|||||||
var path = this;
|
var path = this;
|
||||||
while (path) {
|
while (path) {
|
||||||
if (path.isFunction()) {
|
if (path.isFunction()) {
|
||||||
if (path.node.shadow) {
|
if (path.node.shadow || path.isArrowFunctionExpression()) {
|
||||||
return path;
|
return path;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -0,0 +1,7 @@
|
|||||||
|
class Foo extends Bar {
|
||||||
|
constructor() {
|
||||||
|
super(() => {
|
||||||
|
this.test;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Foo = (function (_Bar) {
|
||||||
|
function Foo() {
|
||||||
|
babelHelpers.classCallCheck(this, Foo);
|
||||||
|
|
||||||
|
babelHelpers.get(Object.getPrototypeOf(Foo.prototype), "constructor", this).call(this, function () {
|
||||||
|
_this.test;
|
||||||
|
});
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
babelHelpers.inherits(Foo, _Bar);
|
||||||
|
return Foo;
|
||||||
|
})(Bar);
|
||||||
Loading…
x
Reference in New Issue
Block a user