fix: tagged template incorrect receiver (#13395)

* fix: tagged template incorrect receiver

* review changes

* func exp instead of arrow

* review comments

* update tests output

* swap arrow funcs to regular funcs

Co-authored-by: sagiv.bengiat <sagiv.bengiat@appsflyer.com>
This commit is contained in:
Sagiv ben giat 2021-06-15 19:01:07 +03:00 committed by GitHub
parent 45174730ab
commit a3c7497eb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 229 additions and 2 deletions

View File

@ -462,8 +462,13 @@ const handle = {
return;
}
// MEMBER -> _get(MEMBER)
member.replaceWith(this.get(member));
if (parentPath.isTaggedTemplateExpression()) {
// MEMBER -> _get(MEMBER).bind(this)
member.replaceWith(this.boundGet(member));
} else {
// MEMBER -> _get(MEMBER)
member.replaceWith(this.get(member));
}
},
};

View File

@ -0,0 +1,9 @@
class Foo {
static #tag = function () { return this };
static getReceiver() {
return this.#tag``;
}
}
expect(Foo.getReceiver()).toBe(Foo);

View File

@ -0,0 +1,8 @@
class Foo {
static #tag = function () { return this };
static getReceiver() {
return this.#tag``;
}
}

View File

@ -0,0 +1,6 @@
{
"plugins": [
"proposal-class-properties",
"proposal-private-methods"
]
}

View File

@ -0,0 +1,13 @@
class Foo {
static getReceiver() {
return babelHelpers.classStaticPrivateFieldSpecGet(this, Foo, _tag).bind(this)``;
}
}
var _tag = {
writable: true,
value: function () {
return this;
}
};

View File

@ -0,0 +1,17 @@
class Foo {
#tag() {
return this;
}
#tag2 = function() { return this; };
constructor() {
const receiver = this.#tag`tagged template`;
expect(receiver).toBe(this);
const receiver2 = this.#tag2`tagged template`;
expect(receiver2).toBe(this);
}
}
new Foo();

View File

@ -0,0 +1,9 @@
class Foo {
#tag;
test() {
this.#tag``;
}
}
new Foo();

View File

@ -0,0 +1,13 @@
{
"presets": [
[
"@babel/preset-env",
{
"shippedProposals": true,
"targets": {
"chrome": "75"
}
}
]
]
}

View File

@ -0,0 +1,24 @@
var _tag = /*#__PURE__*/new WeakMap();
var Foo = /*#__PURE__*/function () {
"use strict";
function Foo() {
babelHelpers.classCallCheck(this, Foo);
_tag.set(this, {
writable: true,
value: void 0
});
}
babelHelpers.createClass(Foo, [{
key: "test",
value: function test() {
babelHelpers.classPrivateFieldGet(this, _tag).bind(this)``;
}
}]);
return Foo;
}();
new Foo();

View File

@ -0,0 +1,10 @@
class Foo {
get #tag() {
return function() { return this; };
}
constructor() {
const receiver = this.#tag``;
expect(receiver).toBe(this);
}
}

View File

@ -0,0 +1,11 @@
class Foo {
get #tag() {
return () => this;
}
constructor() {
this.#tag``;
}
}
new Foo();

View File

@ -0,0 +1,19 @@
var _tag = /*#__PURE__*/new WeakMap();
class Foo {
constructor() {
_tag.set(this, {
get: _get_tag,
set: void 0
});
babelHelpers.classPrivateFieldGet(this, _tag).bind(this)``;
}
}
function _get_tag() {
return () => this;
}
new Foo();

View File

@ -0,0 +1,11 @@
class Foo {
#tag() {
return this;
}
constructor() {
const receiver = this.#tag`tagged template`;
expect(receiver).toBe(this);
}
}
new Foo();

View File

@ -0,0 +1,6 @@
class Foo {
#tag() {
this.#tag``;
}
}
new Foo();

View File

@ -0,0 +1,14 @@
var _tag = /*#__PURE__*/new WeakSet();
class Foo {
constructor() {
_tag.add(this);
}
}
function _tag2() {
babelHelpers.classPrivateMethodGet(this, _tag, _tag2).bind(this)``;
}
new Foo();

View File

@ -0,0 +1,11 @@
class Foo {
static #tag() {
return this;
}
static getReceiver() {
return this.#tag``;
}
}
expect(Foo.getReceiver()).toBe(Foo);

View File

@ -0,0 +1,6 @@
class Foo {
static #tag() {
this.#tag``;
}
}
new Foo();

View File

@ -0,0 +1,7 @@
class Foo {}
function _tag() {
babelHelpers.classStaticPrivateMethodGet(this, Foo, _tag).bind(this)``;
}
new Foo();

View File

@ -0,0 +1,10 @@
class Foo {
static get #tag() {
return function() { return this; };
}
static test() {
const receiver = this.#tag``;
expect(receiver).toBe(this);
}
}

View File

@ -0,0 +1,18 @@
class Foo {
static test() {
var receiver = babelHelpers.classStaticPrivateFieldSpecGet(this, Foo, _tag).bind(this)``;
expect(receiver).toBe(this);
}
}
function _get_tag() {
return function () {
return this;
};
}
var _tag = {
get: _get_tag,
set: void 0
};