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

Use function rather than var to compile private methods #12990

Merged
merged 3 commits into from Mar 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
53 changes: 22 additions & 31 deletions packages/babel-helper-create-class-features-plugin/src/fields.js
Expand Up @@ -625,46 +625,34 @@ function buildPrivateMethodDeclaration(
static: isStatic,
} = privateName;
const { params, body, generator, async } = prop.node;
const methodValue = t.functionExpression(
methodId,
params,
body,
generator,
async,
);
const isGetter = getId && !getterDeclared && params.length === 0;
const isSetter = setId && !setterDeclared && params.length > 0;

let declId = methodId;

if (isGetter) {
privateNamesMap.set(prop.node.key.id.name, {
...privateName,
getterDeclared: true,
});
return t.variableDeclaration("var", [
t.variableDeclarator(getId, methodValue),
]);
}
if (isSetter) {
declId = getId;
} else if (isSetter) {
privateNamesMap.set(prop.node.key.id.name, {
...privateName,
setterDeclared: true,
});
return t.variableDeclaration("var", [
t.variableDeclarator(setId, methodValue),
]);
}
if (isStatic && !privateFieldsAsProperties) {
return t.variableDeclaration("var", [
t.variableDeclarator(
t.cloneNode(id),
t.functionExpression(id, params, body, generator, async),
),
]);
declId = setId;
} else if (isStatic && !privateFieldsAsProperties) {
declId = id;
}

return t.variableDeclaration("var", [
t.variableDeclarator(t.cloneNode(methodId), methodValue),
]);
return t.functionDeclaration(
t.cloneNode(declId),
params,
body,
generator,
async,
);
}

const thisContextVisitor = traverse.visitors.merge([
Expand Down Expand Up @@ -710,9 +698,11 @@ export function buildFieldsInitNodes(
privateFieldsAsProperties,
constantSuper,
) {
let needsClassRef = false;
const staticNodes = [];
const instanceNodes = [];
let needsClassRef = false;
// These nodes are pure and can be moved to the closest statement position
const pureStaticNodes = [];

for (const prop of props) {
ts.assertFieldTransformed(prop);
Expand Down Expand Up @@ -780,7 +770,7 @@ export function buildFieldsInitNodes(
privateNamesMap,
),
);
staticNodes.push(
pureStaticNodes.push(
buildPrivateMethodDeclaration(
prop,
privateNamesMap,
Expand All @@ -796,7 +786,7 @@ export function buildFieldsInitNodes(
privateNamesMap,
),
);
staticNodes.push(
pureStaticNodes.push(
buildPrivateMethodDeclaration(
prop,
privateNamesMap,
Expand All @@ -809,7 +799,7 @@ export function buildFieldsInitNodes(
staticNodes.unshift(
buildPrivateStaticFieldInitSpec(prop, privateNamesMap),
);
staticNodes.unshift(
pureStaticNodes.push(
buildPrivateMethodDeclaration(
prop,
privateNamesMap,
Expand All @@ -827,7 +817,7 @@ export function buildFieldsInitNodes(
privateNamesMap,
),
);
staticNodes.unshift(
pureStaticNodes.push(
buildPrivateMethodDeclaration(
prop,
privateNamesMap,
Expand All @@ -851,6 +841,7 @@ export function buildFieldsInitNodes(
return {
staticNodes: staticNodes.filter(Boolean),
instanceNodes: instanceNodes.filter(Boolean),
pureStaticNodes: pureStaticNodes.filter(Boolean),
wrapClass(path) {
for (const prop of props) {
prop.remove();
Expand Down
20 changes: 16 additions & 4 deletions packages/babel-helper-create-class-features-plugin/src/index.js
Expand Up @@ -198,10 +198,10 @@ export function createClassFeaturePlugin({
state,
);

let keysNodes, staticNodes, instanceNodes, wrapClass;
let keysNodes, staticNodes, pureStaticNodes, instanceNodes, wrapClass;

if (isDecorated) {
staticNodes = keysNodes = [];
staticNodes = pureStaticNodes = keysNodes = [];
({ instanceNodes, wrapClass } = buildDecoratedClass(
ref,
path,
Expand All @@ -210,7 +210,12 @@ export function createClassFeaturePlugin({
));
} else {
keysNodes = extractComputedKeys(ref, path, computedPaths, this.file);
({ staticNodes, instanceNodes, wrapClass } = buildFieldsInitNodes(
({
staticNodes,
pureStaticNodes,
instanceNodes,
wrapClass,
} = buildFieldsInitNodes(
ref,
path.node.superClass,
props,
Expand Down Expand Up @@ -239,7 +244,14 @@ export function createClassFeaturePlugin({

path = wrapClass(path);
path.insertBefore([...privateNamesNodes, ...keysNodes]);
path.insertAfter(staticNodes);
if (staticNodes.length > 0) {
path.insertAfter(staticNodes);
}
if (pureStaticNodes.length > 0) {
path
.find(parent => parent.isStatement() || parent.isDeclaration())
.insertAfter(pureStaticNodes);
}
},

PrivateName(path) {
Expand Down
Expand Up @@ -7,6 +7,6 @@ class X {

}

var _privateMethod2 = function _privateMethod2() {
function _privateMethod2() {
return 42;
};
}
Expand Up @@ -9,6 +9,6 @@ class X {

}

var _privateMethod2 = function _privateMethod2() {
function _privateMethod2() {
return 42;
};
}
Expand Up @@ -9,8 +9,8 @@ class A extends B {

}

var _foo2 = function _foo2() {
function _foo2() {
let _A;

babelHelpers.get(babelHelpers.getPrototypeOf(A.prototype), "x", this);
};
}
Expand Up @@ -7,7 +7,7 @@ class C {

}

var _g2 = function _g2() {
function _g2() {
var _this = this;

return babelHelpers.wrapAsyncGenerator(function* () {
Expand All @@ -16,4 +16,4 @@ var _g2 = function _g2() {
yield 2;
return 3;
})();
};
}
@@ -1,18 +1,18 @@
var _class, _descriptor, _descriptor2, _temp;
var _class, _descriptor, _descriptor2;

function dec() {} // Create a local function binding so babel has to change the name of the helper


function _defineProperty() {}

let A = (_class = (_temp = function A() {
let A = (_class = function A() {
"use strict";

babelHelpers.classCallCheck(this, A);
babelHelpers.initializerDefineProperty(this, "a", _descriptor, this);
babelHelpers.initializerDefineProperty(this, "b", _descriptor2, this);
babelHelpers.defineProperty(this, "c", 456);
}, _temp), (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
}, (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
configurable: true,
enumerable: true,
writable: true,
Expand Down
@@ -1,15 +1,15 @@
var _class, _descriptor, _descriptor2, _temp;
var _class, _descriptor, _descriptor2;

function dec() {}

let A = (_class = (_temp = function A() {
let A = (_class = function A() {
"use strict";

babelHelpers.classCallCheck(this, A);
babelHelpers.initializerDefineProperty(this, "a", _descriptor, this);
babelHelpers.initializerDefineProperty(this, "b", _descriptor2, this);
this.c = 456;
}, _temp), (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
}, (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
configurable: true,
enumerable: true,
writable: true,
Expand Down
@@ -1,15 +1,15 @@
var _class, _descriptor, _descriptor2, _temp;
var _class, _descriptor, _descriptor2;

function dec() {}

let A = (_class = (_temp = function A() {
let A = (_class = function A() {
"use strict";

babelHelpers.classCallCheck(this, A);
babelHelpers.initializerDefineProperty(this, "a", _descriptor, this);
babelHelpers.initializerDefineProperty(this, "b", _descriptor2, this);
babelHelpers.defineProperty(this, "c", 456);
}, _temp), (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
}, (_descriptor = babelHelpers.applyDecoratedDescriptor(_class.prototype, "a", [dec], {
configurable: true,
enumerable: true,
writable: true,
Expand Down
Expand Up @@ -14,7 +14,7 @@ var Foo = /*#__PURE__*/function () {
babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _foo3, _temp;
var _foo3;

var _babelHelpers$classPr;

Expand All @@ -38,7 +38,7 @@ var Foo = /*#__PURE__*/function () {
}

return Nested;
}((_temp = (_foo3 = babelHelpers.classPrivateFieldLooseKey("foo"), _babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo3)[_foo3], /*#__PURE__*/function () {
}((_foo3 = babelHelpers.classPrivateFieldLooseKey("foo"), _babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo3)[_foo3], /*#__PURE__*/function () {
function _class2() {
babelHelpers.classCallCheck(this, _class2);
Object.defineProperty(this, _foo3, {
Expand All @@ -49,7 +49,7 @@ var Foo = /*#__PURE__*/function () {
}

return _class2;
}()), _temp));
}()));
}
}]);
return Foo;
Expand Down
Expand Up @@ -14,8 +14,6 @@ var Foo = /*#__PURE__*/function () {
babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _temp;

var _babelHelpers$classPr;

var _foo2 = babelHelpers.classPrivateFieldLooseKey("foo");
Expand All @@ -38,14 +36,14 @@ var Foo = /*#__PURE__*/function () {
}

return Nested;
}((_temp = (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo], /*#__PURE__*/function () {
}((_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo], /*#__PURE__*/function () {
function _class2() {
babelHelpers.classCallCheck(this, _class2);
this[_babelHelpers$classPr] = 2;
}

return _class2;
}()), _temp));
}()));
}
}]);
return Foo;
Expand Down
Expand Up @@ -15,7 +15,7 @@ var Foo = /*#__PURE__*/function () {
babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _foo3, _temp;
var _foo3;

var _babelHelpers$classPr;

Expand All @@ -41,7 +41,7 @@ var Foo = /*#__PURE__*/function () {
}

return Nested;
}((_temp = (_foo3 = new WeakMap(), _babelHelpers$classPr = babelHelpers.classPrivateFieldGet(this, _foo3), /*#__PURE__*/function () {
}((_foo3 = new WeakMap(), _babelHelpers$classPr = babelHelpers.classPrivateFieldGet(this, _foo3), /*#__PURE__*/function () {
function _class2() {
babelHelpers.classCallCheck(this, _class2);

Expand All @@ -54,7 +54,7 @@ var Foo = /*#__PURE__*/function () {
}

return _class2;
}()), _temp));
}()));
}
}]);
return Foo;
Expand Down
Expand Up @@ -15,8 +15,6 @@ var Foo = /*#__PURE__*/function () {
babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _temp;

var _babelHelpers$classPr;

var _foo2 = new WeakMap();
Expand All @@ -41,14 +39,14 @@ var Foo = /*#__PURE__*/function () {
}

return Nested;
}((_temp = (_babelHelpers$classPr = babelHelpers.classPrivateFieldGet(this, _foo), /*#__PURE__*/function () {
}((_babelHelpers$classPr = babelHelpers.classPrivateFieldGet(this, _foo), /*#__PURE__*/function () {
function _class2() {
babelHelpers.classCallCheck(this, _class2);
babelHelpers.defineProperty(this, _babelHelpers$classPr, 2);
}

return _class2;
}()), _temp));
}()));
}
}]);
return Foo;
Expand Down
@@ -1,9 +1,7 @@
var createClass = k => {
var _temp;

var _k;

return _temp = (_k = k(), /*#__PURE__*/function () {
return _k = k(), /*#__PURE__*/function () {
"use strict";

function _class2() {
Expand All @@ -12,5 +10,5 @@ var createClass = k => {
}

return _class2;
}()), _temp;
}();
};