Skip to content

Commit

Permalink
fix: tagged template incorrect receiver (#13395)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
sag1v and sagiv.bengiat committed Jun 15, 2021
1 parent 4517473 commit a3c7497
Show file tree
Hide file tree
Showing 20 changed files with 229 additions and 2 deletions.
Expand Up @@ -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));
}
},
};

Expand Down
@@ -0,0 +1,9 @@
class Foo {
static #tag = function () { return this };

static getReceiver() {
return this.#tag``;
}
}

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

static getReceiver() {
return this.#tag``;
}
}

@@ -0,0 +1,6 @@
{
"plugins": [
"proposal-class-properties",
"proposal-private-methods"
]
}
@@ -0,0 +1,13 @@
class Foo {
static getReceiver() {
return babelHelpers.classStaticPrivateFieldSpecGet(this, Foo, _tag).bind(this)``;
}

}

var _tag = {
writable: true,
value: function () {
return this;
}
};
@@ -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();
@@ -0,0 +1,9 @@
class Foo {
#tag;

test() {
this.#tag``;
}
}

new Foo();
@@ -0,0 +1,13 @@
{
"presets": [
[
"@babel/preset-env",
{
"shippedProposals": true,
"targets": {
"chrome": "75"
}
}
]
]
}
@@ -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();
@@ -0,0 +1,10 @@
class Foo {
get #tag() {
return function() { return this; };
}

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

constructor() {
this.#tag``;
}
}

new Foo();
@@ -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();
@@ -0,0 +1,11 @@
class Foo {
#tag() {
return this;
}

constructor() {
const receiver = this.#tag`tagged template`;
expect(receiver).toBe(this);
}
}
new Foo();
@@ -0,0 +1,6 @@
class Foo {
#tag() {
this.#tag``;
}
}
new Foo();
@@ -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();
@@ -0,0 +1,11 @@
class Foo {
static #tag() {
return this;
}

static getReceiver() {
return this.#tag``;
}
}

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

function _tag() {
babelHelpers.classStaticPrivateMethodGet(this, Foo, _tag).bind(this)``;
}

new Foo();
@@ -0,0 +1,10 @@
class Foo {
static get #tag() {
return function() { return this; };
}

static test() {
const receiver = this.#tag``;
expect(receiver).toBe(this);
}
}
@@ -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
};

0 comments on commit a3c7497

Please sign in to comment.