fix error when constructor default arg refers to own static property or self (#4666)
(closes #4253) (closes #4442)
This commit is contained in:
parent
6cfd3d91b2
commit
33eb56ab09
@ -24,10 +24,16 @@ function hasDefaults(node) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isSafeBinding(scope, node) {
|
||||||
|
if (!scope.hasOwnBinding(node.name)) return true;
|
||||||
|
const { kind } = scope.getOwnBinding(node.name);
|
||||||
|
return kind === "param" || kind === "local";
|
||||||
|
}
|
||||||
|
|
||||||
let iifeVisitor = {
|
let iifeVisitor = {
|
||||||
ReferencedIdentifier(path, state) {
|
ReferencedIdentifier(path, state) {
|
||||||
let name = path.node.name;
|
const { scope, node } = path;
|
||||||
if (name === "eval" || (path.scope.hasOwnBinding(name) && path.scope.getOwnBinding(name).kind !== "param")) {
|
if (node.name === "eval" || !isSafeBinding(scope, node)) {
|
||||||
state.iife = true;
|
state.iife = true;
|
||||||
path.stop();
|
path.stop();
|
||||||
}
|
}
|
||||||
@ -100,7 +106,7 @@ export let visitor = {
|
|||||||
|
|
||||||
//
|
//
|
||||||
if (!state.iife) {
|
if (!state.iife) {
|
||||||
if (right.isIdentifier() && scope.hasOwnBinding(right.node.name) && scope.getOwnBinding(right.node.name).kind !== "param") {
|
if (right.isIdentifier() && !isSafeBinding(scope, right.node)) {
|
||||||
// the right hand side references a parameter
|
// the right hand side references a parameter
|
||||||
state.iife = true;
|
state.iife = true;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
class Ref {
|
||||||
|
constructor(id = ++Ref.nextID) {
|
||||||
|
this.id = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ref.nextID = 0
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
class Ref {
|
||||||
|
static nextId = 0
|
||||||
|
constructor(id = ++Ref.nextId, n = id) {
|
||||||
|
this.id = n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.equal(1, new Ref().id)
|
||||||
|
assert.equal(2, new Ref().id)
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
var Ref = function Ref() {
|
||||||
|
var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ++Ref.nextID;
|
||||||
|
babelHelpers.classCallCheck(this, Ref);
|
||||||
|
|
||||||
|
this.id = id;
|
||||||
|
};
|
||||||
|
|
||||||
|
Ref.nextID = 0;
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
class Ref {
|
||||||
|
constructor(ref = Ref) {
|
||||||
|
this.ref = ref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class X {
|
||||||
|
constructor(x = foo) {
|
||||||
|
this.x = x
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
class Ref {
|
||||||
|
constructor(ref = Ref) {
|
||||||
|
this.ref = ref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.equal(Ref, new Ref().ref)
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
var Ref = function Ref() {
|
||||||
|
var ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Ref;
|
||||||
|
babelHelpers.classCallCheck(this, Ref);
|
||||||
|
|
||||||
|
this.ref = ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
var X = function X() {
|
||||||
|
var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : foo;
|
||||||
|
babelHelpers.classCallCheck(this, X);
|
||||||
|
|
||||||
|
this.x = x;
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user