Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(class-properties): replace new.target in static properties with undefined #13560

Merged
merged 7 commits into from Jul 16, 2021
21 changes: 21 additions & 0 deletions packages/babel-helper-create-class-features-plugin/src/fields.ts
@@ -1,4 +1,5 @@
import { template, traverse, types as t } from "@babel/core";
import type { NodePath } from "@babel/traverse";
import ReplaceSupers, {
environmentVisitor,
} from "@babel/helper-replace-supers";
Expand Down Expand Up @@ -770,6 +771,26 @@ export function buildFieldsInitNodes(
needsClassRef = needsClassRef || replaced;
}

// if there are `new.target` in static filed
colinaaa marked this conversation as resolved.
Show resolved Hide resolved
// we should replace it with `undefined`
if (isStatic && isField) {
// fix issue #12737
prop.traverse({
MetaProperty(path: NodePath<t.MetaProperty>) {
const meta = path.get("meta");
const property = path.get("property");
const { scope } = path;

if (
meta.isIdentifier({ name: "new" }) &&
property.isIdentifier({ name: "target" })
) {
path.replaceWith(scope.buildUndefinedNode());
}
},
});
}

switch (true) {
case isStaticBlock:
staticNodes.push(
Expand Down
@@ -0,0 +1,9 @@
class Foo {
constructor() {
this.Bar = class {
static p = new.target
}
}
}

expect((new Foo).Bar.p).toBeUndefined()
@@ -1,4 +1,14 @@
class Foo {
constructor() {
this.Bar = class {
static p = new.target
static p1 = class { constructor() { new.target } } // should not replace
static p2 = new function () { new.target } // should not replace
static p3 = () => { new.target } // should replace
q = new.target // should not replace
}
}

test = function() {
new.target;
};
Expand Down
Expand Up @@ -2,6 +2,6 @@
"plugins": [
"transform-new-target",
"transform-arrow-functions",
["proposal-class-properties", { "loose": true }]
["proposal-class-properties", { "loose": false }]
colinaaa marked this conversation as resolved.
Show resolved Hide resolved
]
}
@@ -1,14 +1,31 @@
class Foo {
constructor() {
var _newtarget = this.constructor;
var _newtarget = this.constructor,
_class,
_temp;

this.test = function _target() {
babelHelpers.defineProperty(this, "test", function _target() {
this instanceof _target ? this.constructor : void 0;
};

this.test2 = function () {
});
babelHelpers.defineProperty(this, "test2", function () {
_newtarget;
};
});
this.Bar = (_temp = _class = class _target2 {
constructor() {
babelHelpers.defineProperty(this, "q", this.constructor);
} // should not replace


}, babelHelpers.defineProperty(_class, "p", void 0), babelHelpers.defineProperty(_class, "p1", class {
constructor() {
void 0;
}

}), babelHelpers.defineProperty(_class, "p2", new function () {
void 0;
}()), babelHelpers.defineProperty(_class, "p3", function () {
void 0;
}), _temp);
}

}