Skip to content

Commit

Permalink
add (a?.#b)() support
Browse files Browse the repository at this point in the history
  • Loading branch information
JLHwung committed May 28, 2020
1 parent 792b5bd commit bd78255
Show file tree
Hide file tree
Showing 10 changed files with 250 additions and 0 deletions.
14 changes: 14 additions & 0 deletions packages/babel-helper-create-class-features-plugin/src/fields.js
Expand Up @@ -241,6 +241,13 @@ const privateNameHandlerSpec = {
]);
},

boundGet(member) {
return t.callExpression(
t.memberExpression(this.get(member), t.identifier("bind")),
[this.receiver(member)],
);
},

set(member, value) {
const { classRef, privateNamesMap, file } = this;
const { name } = member.node.property.id;
Expand Down Expand Up @@ -323,6 +330,13 @@ const privateNameHandlerLoose = {
});
},

boundGet(member) {
return t.callExpression(
t.memberExpression(this.get(member), t.identifier("bind")),
[member.node.object],
);
},

simpleSet(member) {
return this.get(member);
},
Expand Down
Expand Up @@ -167,13 +167,19 @@ const handle = {
const parentIsOptionalCall = parentPath.isOptionalCallExpression({
callee: node,
});
const isParenthesizedMemberCall =
parentPath.isCallExpression({ callee: node }) &&
node.extra?.parenthesized;
startingOptional.replaceWith(toNonOptional(startingOptional, baseRef));
if (parentIsOptionalCall) {
if (parent.optional) {
parentPath.replaceWith(this.optionalCall(member, parent.arguments));
} else {
parentPath.replaceWith(this.call(member, parent.arguments));
}
} else if (isParenthesizedMemberCall) {
// `(a?.#b)()` to `(a == null ? void 0 : a.#b.bind(a))()`
member.replaceWith(this.boundGet(member));
} else {
member.replaceWith(this.get(member));
}
Expand Down
@@ -0,0 +1,36 @@
class Foo {
static #x = 1;

static self = Foo;
static #m = function() { return this.#x; };
static getSelf() { return Foo }

test() {
const o = { Foo: Foo };

expect((Foo?.#m)()).toEqual(1);
expect((Foo?.#m)().toString).toEqual(1..toString);
expect((Foo?.#m)().toString()).toEqual('1');

expect((o?.Foo.#m)()).toEqual(1);
expect((o?.Foo.#m)().toString).toEqual(1..toString);
expect((o?.Foo.#m)().toString()).toEqual('1');

expect((((o.Foo?.self.getSelf)())?.#m)()).toEqual(1);
expect((((o.Foo.self?.getSelf)())?.#m)()).toEqual(1);
}

testNull() {
const o = null;

expect(() => { (o?.Foo.#m)() }).toThrow();
expect(() => { (o?.Foo.#m)().toString }).toThrow();
expect(() => { (o?.Foo.#m)().toString() }).toThrow();

expect(() => { (((o.Foo?.self.getSelf)())?.#m)() }).toThrow();
expect(() => { (((o.Foo.self?.getSelf)())?.#m)() }).toThrow();
}
}

(new Foo).test();
(new Foo).testNull();
@@ -0,0 +1,24 @@
class Foo {
static #x = 1;

static self = Foo;
static #m = function() { return this.#x; };
static getSelf() { return Foo }

test() {
const o = { Foo: Foo };

(Foo?.#m)();
(Foo?.#m)().toString;
(Foo?.#m)().toString();

(o?.Foo.#m)();
(o?.Foo.#m)().toString;
(o?.Foo.#m)().toString();

(((o.Foo?.self.getSelf)())?.#m)();
(((o.Foo.self?.getSelf)())?.#m)();
}
}

(new Foo).test();
@@ -0,0 +1,8 @@
{
"plugins": [
["external-helpers", { "helperVersion": "7.100.0" }],
["proposal-class-properties", { "loose": true }],
"transform-classes",
"transform-block-scoping"
]
}
@@ -0,0 +1,49 @@
var Foo = /*#__PURE__*/function () {
"use strict";

function Foo() {
babelHelpers.classCallCheck(this, Foo);
}

babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _o$Foo$self$getSelf, _o$Foo$self$getSelf2;

var o = {
Foo: Foo
};
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(Foo, _m)[_m].bind(Foo))();
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(Foo, _m)[_m].bind(Foo))().toString;
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(Foo, _m)[_m].bind(Foo))().toString();
(o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _m)[_m].bind(o.Foo))();
(o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _m)[_m].bind(o.Foo))().toString;
(o === null || o === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(o.Foo, _m)[_m].bind(o.Foo))().toString();
((_o$Foo$self$getSelf = (o.Foo?.self.getSelf)()) === null || _o$Foo$self$getSelf === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_o$Foo$self$getSelf, _m)[_m].bind(_o$Foo$self$getSelf))();
((_o$Foo$self$getSelf2 = (o.Foo.self?.getSelf)()) === null || _o$Foo$self$getSelf2 === void 0 ? void 0 : babelHelpers.classPrivateFieldLooseBase(_o$Foo$self$getSelf2, _m)[_m].bind(_o$Foo$self$getSelf2))();
}
}], [{
key: "getSelf",
value: function getSelf() {
return Foo;
}
}]);
return Foo;
}();

var _x = babelHelpers.classPrivateFieldLooseKey("x");

var _m = babelHelpers.classPrivateFieldLooseKey("m");

Object.defineProperty(Foo, _x, {
writable: true,
value: 1
});
Foo.self = Foo;
Object.defineProperty(Foo, _m, {
writable: true,
value: function () {
return babelHelpers.classPrivateFieldLooseBase(this, _x)[_x];
}
});
new Foo().test();
@@ -0,0 +1,36 @@
class Foo {
static #x = 1;

static self = Foo;
static #m = function() { return this.#x; };
static getSelf() { return Foo }

test() {
const o = { Foo: Foo };

expect((Foo?.#m)()).toEqual(1);
expect((Foo?.#m)().toString).toEqual(1..toString);
expect((Foo?.#m)().toString()).toEqual('1');

expect((o?.Foo.#m)()).toEqual(1);
expect((o?.Foo.#m)().toString).toEqual(1..toString);
expect((o?.Foo.#m)().toString()).toEqual('1');

expect((((o.Foo?.self.getSelf)())?.#m)()).toEqual(1);
expect((((o.Foo.self?.getSelf)())?.#m)()).toEqual(1);
}

testNull() {
const o = null;

expect(() => { (o?.Foo.#m)() }).toThrow();
expect(() => { (o?.Foo.#m)().toString }).toThrow();
expect(() => { (o?.Foo.#m)().toString() }).toThrow();

expect(() => { (((o.Foo?.self.getSelf)())?.#m)() }).toThrow();
expect(() => { (((o.Foo.self?.getSelf)())?.#m)() }).toThrow();
}
}

(new Foo).test();
(new Foo).testNull();
@@ -0,0 +1,24 @@
class Foo {
static #x = 1;

static self = Foo;
static #m = function() { return this.#x; };
static getSelf() { return Foo }

test() {
const o = { Foo: Foo };

(Foo?.#m)();
(Foo?.#m)().toString;
(Foo?.#m)().toString();

(o?.Foo.#m)();
(o?.Foo.#m)().toString;
(o?.Foo.#m)().toString();

(((o.Foo?.self.getSelf)())?.#m)();
(((o.Foo.self?.getSelf)())?.#m)();
}
}

(new Foo).test();
@@ -0,0 +1,8 @@
{
"plugins": [
["external-helpers", { "helperVersion": "7.100.0" }],
"proposal-class-properties",
"transform-classes",
"transform-block-scoping"
]
}
@@ -0,0 +1,45 @@
var Foo = /*#__PURE__*/function () {
"use strict";

function Foo() {
babelHelpers.classCallCheck(this, Foo);
}

babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
var _o$Foo$self$getSelf, _o$Foo$self$getSelf2;

var o = {
Foo: Foo
};
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(Foo, Foo, _m).bind(Foo))();
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(Foo, Foo, _m).bind(Foo))().toString;
(Foo === null || Foo === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(Foo, Foo, _m).bind(Foo))().toString();
(o === null || o === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(o.Foo, Foo, _m).bind(o.Foo))();
(o === null || o === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(o.Foo, Foo, _m).bind(o.Foo))().toString;
(o === null || o === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(o.Foo, Foo, _m).bind(o.Foo))().toString();
((_o$Foo$self$getSelf = (o.Foo?.self.getSelf)()) === null || _o$Foo$self$getSelf === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(_o$Foo$self$getSelf, Foo, _m).bind(_o$Foo$self$getSelf))();
((_o$Foo$self$getSelf2 = (o.Foo.self?.getSelf)()) === null || _o$Foo$self$getSelf2 === void 0 ? void 0 : babelHelpers.classStaticPrivateFieldSpecGet(_o$Foo$self$getSelf2, Foo, _m).bind(_o$Foo$self$getSelf2))();
}
}], [{
key: "getSelf",
value: function getSelf() {
return Foo;
}
}]);
return Foo;
}();

var _x = {
writable: true,
value: 1
};
babelHelpers.defineProperty(Foo, "self", Foo);
var _m = {
writable: true,
value: function () {
return babelHelpers.classStaticPrivateFieldSpecGet(this, Foo, _x);
}
};
new Foo().test();

0 comments on commit bd78255

Please sign in to comment.