Skip to content

Commit

Permalink
Use function rather than var to compile private methods (#12990)
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolo-ribaudo committed Mar 11, 2021
1 parent b3e2bcd commit 8ad6b75
Show file tree
Hide file tree
Showing 128 changed files with 417 additions and 300 deletions.
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;
}();
};

0 comments on commit 8ad6b75

Please sign in to comment.