From 169ba57e720a7d97d8b880a4d96bfba9ecc012cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 05:20:07 +0900 Subject: [PATCH 001/105] Start From c076cc7e42cf82bb485dcf2e54abc4d91b667055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 05:49:23 +0900 Subject: [PATCH 002/105] Add a module --- ecmascript/transforms/proposal/src/lib.rs | 1 + ecmascript/transforms/proposal/src/private_in_object.rs | 1 + 2 files changed, 2 insertions(+) create mode 100644 ecmascript/transforms/proposal/src/private_in_object.rs diff --git a/ecmascript/transforms/proposal/src/lib.rs b/ecmascript/transforms/proposal/src/lib.rs index 2f7d78c7cf45..e7035b8009fc 100644 --- a/ecmascript/transforms/proposal/src/lib.rs +++ b/ecmascript/transforms/proposal/src/lib.rs @@ -6,3 +6,4 @@ pub use self::{ pub mod decorators; mod export_default_from; mod import_assertions; +pub mod private_in_object; diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -0,0 +1 @@ + From d9b0ae90bb9397d80e4804134a385b967f7542dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 07:26:06 +0900 Subject: [PATCH 003/105] Add fixtures --- .../proposal/src/private_in_object.rs | 9 ++++ .../accessor/input.js | 7 +++ .../accessor/output.js | 17 ++++++ .../compiled-classes/input.js | 12 +++++ .../compiled-classes/options.json | 8 +++ .../compiled-classes/output.js | 33 ++++++++++++ .../field/input.js | 7 +++ .../field/output.js | 15 ++++++ .../method/input.js | 7 +++ .../method/output.js | 16 ++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 39 ++++++++++++++ .../nested-class-redeclared/input.js | 15 ++++++ .../nested-class-redeclared/output.js | 31 +++++++++++ .../nested-class/input.js | 13 +++++ .../nested-class/output.js | 22 ++++++++ .../options.json | 10 ++++ .../static-accessor/input.js | 7 +++ .../static-accessor/output.js | 15 ++++++ .../static-field/input.js | 7 +++ .../static-field/output.js | 13 +++++ .../static-method/input.js | 7 +++ .../static-method/output.js | 14 +++++ .../private-loose/accessor/input.js | 7 +++ .../private-loose/accessor/output.js | 23 ++++++++ .../private-loose/field/input.js | 7 +++ .../private-loose/field/output.js | 21 ++++++++ .../private-loose/method/input.js | 7 +++ .../private-loose/method/output.js | 22 ++++++++ .../private-loose/native-classes/input.js | 12 +++++ .../private-loose/native-classes/options.json | 7 +++ .../private-loose/native-classes/output.js | 24 +++++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 49 +++++++++++++++++ .../nested-class-redeclared/input.js | 15 ++++++ .../nested-class-redeclared/output.js | 41 ++++++++++++++ .../private-loose/nested-class/input.js | 13 +++++ .../private-loose/nested-class/output.js | 35 ++++++++++++ .../private-loose/options.json | 8 +++ .../private-loose/static-accessor/input.js | 7 +++ .../private-loose/static-accessor/output.js | 24 +++++++++ .../private-loose/static-field/input.js | 7 +++ .../private-loose/static-field/output.js | 22 ++++++++ .../private-loose/static-method/input.js | 7 +++ .../private-loose/static-method/output.js | 23 ++++++++ .../private/accessor/input.js | 7 +++ .../private/accessor/output.js | 24 +++++++++ .../private-in-object/private/field/input.js | 7 +++ .../private-in-object/private/field/output.js | 22 ++++++++ .../private-in-object/private/method/input.js | 7 +++ .../private/method/output.js | 21 ++++++++ .../private/native-classes/input.js | 12 +++++ .../private/native-classes/options.json | 7 +++ .../private/native-classes/output.js | 24 +++++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 54 +++++++++++++++++++ .../private/nested-class-redeclared/input.js | 15 ++++++ .../private/nested-class-redeclared/output.js | 43 +++++++++++++++ .../private/nested-class/input.js | 13 +++++ .../private/nested-class/output.js | 36 +++++++++++++ .../private-in-object/private/options.json | 8 +++ .../private/static-accessor/input.js | 7 +++ .../private/static-accessor/output.js | 22 ++++++++ .../private/static-field/input.js | 7 +++ .../private/static-field/output.js | 20 +++++++ .../private/static-method/input.js | 7 +++ .../private/static-method/output.js | 17 ++++++ .../to-native-fields/accessor/input.js | 7 +++ .../to-native-fields/accessor/output.js | 14 +++++ .../input.js | 4 ++ .../output.js | 12 +++++ .../class-expression-instance/input.js | 9 ++++ .../class-expression-instance/output.js | 12 +++++ .../class-expression-static/input.js | 9 ++++ .../class-expression-static/output.js | 12 +++++ .../to-native-fields/field/input.js | 7 +++ .../to-native-fields/field/output.js | 12 +++++ .../half-constructed-instance/exec.js | 28 ++++++++++ .../half-constructed-instance/input.js | 14 +++++ .../half-constructed-instance/options.json | 3 ++ .../half-constructed-instance/output.js | 29 ++++++++++ .../half-constructed-static/exec.js | 27 ++++++++++ .../half-constructed-static/input.js | 12 +++++ .../half-constructed-static/options.json | 3 ++ .../half-constructed-static/output.js | 23 ++++++++ .../to-native-fields/method/input.js | 7 +++ .../to-native-fields/method/output.js | 14 +++++ .../to-native-fields/multiple-checks/input.js | 11 ++++ .../multiple-checks/output.js | 20 +++++++ .../nested-class-other-redeclared/input.js | 18 +++++++ .../nested-class-other-redeclared/output.js | 32 +++++++++++ .../nested-class-redeclared/input.js | 15 ++++++ .../nested-class-redeclared/output.js | 25 +++++++++ .../to-native-fields/nested-class/input.js | 13 +++++ .../to-native-fields/nested-class/output.js | 19 +++++++ .../to-native-fields/options.json | 3 ++ .../to-native-fields/static-accessor/input.js | 7 +++ .../static-accessor/output.js | 8 +++ .../to-native-fields/static-field/input.js | 7 +++ .../to-native-fields/static-field/output.js | 12 +++++ .../to-native-fields/static-method/input.js | 7 +++ .../to-native-fields/static-method/output.js | 8 +++ .../static-shadowed-binding/input.js | 9 ++++ .../static-shadowed-binding/output.js | 12 +++++ 104 files changed, 1623 insertions(+) create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/exec.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/exec.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/options.json create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/input.js create mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 8b137891791f..45e7ed29d217 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1 +1,10 @@ +#[cfg(test)] +mod tests { + use std::path::PathBuf; + #[testing::fixture("tests/private-in-object/**/input.js")] + fn fixture(input: PathBuf) {} + + #[testing::fixture("tests/private-in-object/**/exec.js")] + fn exec(input: PathBuf) {} +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js new file mode 100644 index 000000000000..c0e9000615fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js new file mode 100644 index 000000000000..ca993c31efc2 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js @@ -0,0 +1,17 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + get: _get_foo, + set: void 0 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +function _get_foo() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js new file mode 100644 index 000000000000..23c266018025 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js @@ -0,0 +1,12 @@ +class Foo { + static #foo = "foo"; + #bar = "bar"; + + static test() { + return #foo in Foo; + } + + test() { + return #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json new file mode 100644 index 000000000000..83069bfb945c --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "proposal-private-property-in-object", + "proposal-class-properties", + "proposal-private-methods", + "transform-classes" + ] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js new file mode 100644 index 000000000000..eea2454f629f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js @@ -0,0 +1,33 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bar"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _bar, { + writable: true, + value: "bar" + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + return Object.prototype.hasOwnProperty.call(this, _bar); + } + }], [{ + key: "test", + value: function test() { + return Object.prototype.hasOwnProperty.call(Foo, _foo); + } + }]); + return Foo; +}(); + +Object.defineProperty(Foo, _foo, { + writable: true, + value: "foo" +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js new file mode 100644 index 000000000000..a682a1a15c5b --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js new file mode 100644 index 000000000000..81bf64307a34 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js @@ -0,0 +1,15 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js new file mode 100644 index 000000000000..365843c59708 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js new file mode 100644 index 000000000000..4957a58ecc58 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js @@ -0,0 +1,16 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +function _foo2() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js new file mode 100644 index 000000000000..a084dd06afd6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + #foo in this; + #bar in this; + } + } + + #foo in this; + #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js new file mode 100644 index 000000000000..f07ced4f8b1d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js @@ -0,0 +1,39 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bar"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + Object.defineProperty(this, _bar, { + writable: true, + value: 1 + }); + } + + test() { + var _bar2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bar"); + + class Nested { + constructor() { + Object.defineProperty(this, _bar2, { + writable: true, + value: 2 + }); + } + + test() { + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar2); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js new file mode 100644 index 000000000000..2258be35c5fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js new file mode 100644 index 000000000000..99d94eec791e --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js @@ -0,0 +1,31 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test() { + var _foo2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + + class Nested { + constructor() { + Object.defineProperty(this, _foo2, { + writable: true, + value: 2 + }); + } + + test() { + Object.prototype.hasOwnProperty.call(this, _foo2); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js new file mode 100644 index 000000000000..e17e438b314d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js new file mode 100644 index 000000000000..972e8075ccde --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js @@ -0,0 +1,22 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test() { + class Nested { + test() { + Object.prototype.hasOwnProperty.call(this, _foo); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..5004aaa7fee5 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "proposal-private-property-in-object", + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js new file mode 100644 index 000000000000..e74333f2055f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + static get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js new file mode 100644 index 000000000000..045270ad39e9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js @@ -0,0 +1,15 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +function _get_foo() {} + +Object.defineProperty(Foo, _foo, { + get: _get_foo, + set: void 0 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js new file mode 100644 index 000000000000..a4f771844fe9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js new file mode 100644 index 000000000000..8a13e9186c1a --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js @@ -0,0 +1,13 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +Object.defineProperty(Foo, _foo, { + writable: true, + value: 1 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js new file mode 100644 index 000000000000..9fffe7a01622 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js new file mode 100644 index 000000000000..83bab303a478 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js @@ -0,0 +1,14 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +function _foo2() {} + +Object.defineProperty(Foo, _foo, { + value: _foo2 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js new file mode 100644 index 000000000000..c0e9000615fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js new file mode 100644 index 000000000000..9984179820a2 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js @@ -0,0 +1,23 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + get: _get_foo, + set: void 0 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); + +function _get_foo() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js new file mode 100644 index 000000000000..a682a1a15c5b --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js new file mode 100644 index 000000000000..89fcd20b3d13 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js @@ -0,0 +1,21 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js new file mode 100644 index 000000000000..365843c59708 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js new file mode 100644 index 000000000000..9b5a35fa2380 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js @@ -0,0 +1,22 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); + +function _foo2() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js new file mode 100644 index 000000000000..23c266018025 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js @@ -0,0 +1,12 @@ +class Foo { + static #foo = "foo"; + #bar = "bar"; + + static test() { + return #foo in Foo; + } + + test() { + return #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json new file mode 100644 index 000000000000..caa287fb27bc --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + "proposal-private-property-in-object", + "proposal-class-properties", + "proposal-private-methods" + ] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js new file mode 100644 index 000000000000..13ebbe421023 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js @@ -0,0 +1,24 @@ +var _bar = /*#__PURE__*/new WeakMap(); + +class Foo { + constructor() { + _bar.set(this, { + writable: true, + value: "bar" + }); + } + + static test() { + return Foo === Foo; + } + + test() { + return _bar.has(this); + } + +} + +var _foo = { + writable: true, + value: "foo" +}; diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js new file mode 100644 index 000000000000..a084dd06afd6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + #foo in this; + #bar in this; + } + } + + #foo in this; + #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js new file mode 100644 index 000000000000..37103472562f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js @@ -0,0 +1,49 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bar"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + Object.defineProperty(this, _bar, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _bar2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("bar"); + + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + Object.defineProperty(this, _bar2, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar2); + } + }]); + return Nested; + }(); + + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js new file mode 100644 index 000000000000..2258be35c5fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js new file mode 100644 index 000000000000..1f548b814c05 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js @@ -0,0 +1,41 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _foo2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + Object.defineProperty(this, _foo2, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + Object.prototype.hasOwnProperty.call(this, _foo2); + } + }]); + return Nested; + }(); + + Object.prototype.hasOwnProperty.call(this, _foo); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js new file mode 100644 index 000000000000..e17e438b314d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js new file mode 100644 index 000000000000..75838559d3a6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js @@ -0,0 +1,35 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + Object.prototype.hasOwnProperty.call(this, _foo); + } + }]); + return Nested; + }(); + + Object.prototype.hasOwnProperty.call(this, _foo); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json new file mode 100644 index 000000000000..1656538358e6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + ["proposal-private-property-in-object", { "loose": true }], + ["proposal-class-properties", { "loose": true }], + ["proposal-private-methods", { "loose": true }], + "transform-classes" + ] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js new file mode 100644 index 000000000000..e74333f2055f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + static get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js new file mode 100644 index 000000000000..84c86bb30c42 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js @@ -0,0 +1,24 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); + +function _get_foo() {} + +Object.defineProperty(Foo, _foo, { + get: _get_foo, + set: void 0 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js new file mode 100644 index 000000000000..a4f771844fe9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js new file mode 100644 index 000000000000..273eadf31b91 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js @@ -0,0 +1,22 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); + +Object.defineProperty(Foo, _foo, { + writable: true, + value: 1 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js new file mode 100644 index 000000000000..9fffe7a01622 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js new file mode 100644 index 000000000000..646174ed7dd4 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js @@ -0,0 +1,23 @@ +var _foo = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("foo"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + }]); + return Foo; +}(); + +function _foo2() {} + +Object.defineProperty(Foo, _foo, { + value: _foo2 +}); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/input.js new file mode 100644 index 000000000000..c0e9000615fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js new file mode 100644 index 000000000000..75a7587782a9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js @@ -0,0 +1,24 @@ +var _foo = /*#__PURE__*/new WeakMap(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + get: _get_foo, + set: void 0 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return _foo.has(other); + } + }]); + return Foo; +}(); + +function _get_foo() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/field/input.js new file mode 100644 index 000000000000..a682a1a15c5b --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/field/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js new file mode 100644 index 000000000000..c83e48bcd86d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js @@ -0,0 +1,22 @@ +var _foo = /*#__PURE__*/new WeakMap(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return _foo.has(other); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/method/input.js new file mode 100644 index 000000000000..365843c59708 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/method/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js new file mode 100644 index 000000000000..ac675cbf7d85 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js @@ -0,0 +1,21 @@ +var _foo = /*#__PURE__*/new WeakSet(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.add(this); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return _foo.has(other); + } + }]); + return Foo; +}(); + +function _foo2() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/input.js new file mode 100644 index 000000000000..23c266018025 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/input.js @@ -0,0 +1,12 @@ +class Foo { + static #foo = "foo"; + #bar = "bar"; + + static test() { + return #foo in Foo; + } + + test() { + return #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/options.json b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/options.json new file mode 100644 index 000000000000..caa287fb27bc --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + "proposal-private-property-in-object", + "proposal-class-properties", + "proposal-private-methods" + ] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js new file mode 100644 index 000000000000..13ebbe421023 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js @@ -0,0 +1,24 @@ +var _bar = /*#__PURE__*/new WeakMap(); + +class Foo { + constructor() { + _bar.set(this, { + writable: true, + value: "bar" + }); + } + + static test() { + return Foo === Foo; + } + + test() { + return _bar.has(this); + } + +} + +var _foo = { + writable: true, + value: "foo" +}; diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/input.js new file mode 100644 index 000000000000..a084dd06afd6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + #foo in this; + #bar in this; + } + } + + #foo in this; + #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js new file mode 100644 index 000000000000..a54b7a6691f1 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js @@ -0,0 +1,54 @@ +var _foo = /*#__PURE__*/new WeakMap(); + +var _bar = /*#__PURE__*/new WeakMap(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + + _bar.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _bar2 = /*#__PURE__*/new WeakMap(); + + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + + _bar2.set(this, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + _foo.has(this); + + _bar2.has(this); + } + }]); + return Nested; + }(); + + _foo.has(this); + + _bar.has(this); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/input.js new file mode 100644 index 000000000000..2258be35c5fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js new file mode 100644 index 000000000000..20a7183234aa --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js @@ -0,0 +1,43 @@ +var _foo = /*#__PURE__*/new WeakMap(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + var _foo2 = /*#__PURE__*/new WeakMap(); + + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + + _foo2.set(this, { + writable: true, + value: 2 + }); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + _foo2.has(this); + } + }]); + return Nested; + }(); + + _foo.has(this); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/input.js new file mode 100644 index 000000000000..e17e438b314d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js new file mode 100644 index 000000000000..2c52c716a1ee --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js @@ -0,0 +1,36 @@ +var _foo = /*#__PURE__*/new WeakMap(); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + + _foo.set(this, { + writable: true, + value: 1 + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + let Nested = /*#__PURE__*/function () { + function Nested() { + babelHelpers.classCallCheck(this, Nested); + } + + babelHelpers.createClass(Nested, [{ + key: "test", + value: function test() { + _foo.has(this); + } + }]); + return Nested; + }(); + + _foo.has(this); + } + }]); + return Foo; +}(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/options.json b/ecmascript/transforms/proposal/tests/private-in-object/private/options.json new file mode 100644 index 000000000000..83069bfb945c --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "proposal-private-property-in-object", + "proposal-class-properties", + "proposal-private-methods", + "transform-classes" + ] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/input.js new file mode 100644 index 000000000000..e74333f2055f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + static get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js new file mode 100644 index 000000000000..810276221b74 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js @@ -0,0 +1,22 @@ +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return other === Foo; + } + }]); + return Foo; +}(); + +function _get_foo() {} + +var _foo = { + get: _get_foo, + set: void 0 +}; diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/input.js new file mode 100644 index 000000000000..a4f771844fe9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js new file mode 100644 index 000000000000..c631923cb5a9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js @@ -0,0 +1,20 @@ +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return other === Foo; + } + }]); + return Foo; +}(); + +var _foo = { + writable: true, + value: 1 +}; diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/input.js new file mode 100644 index 000000000000..9fffe7a01622 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js new file mode 100644 index 000000000000..efde0032c540 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js @@ -0,0 +1,17 @@ +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test(other) { + return other === Foo; + } + }]); + return Foo; +}(); + +function _foo() {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/input.js new file mode 100644 index 000000000000..c0e9000615fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js new file mode 100644 index 000000000000..f7a2a1df365c --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js @@ -0,0 +1,14 @@ +var _FooBrandCheck = /*#__PURE__*/new WeakSet(); + +class Foo { + constructor() { + _FooBrandCheck.add(this); + } + + get #foo() {} + + test(other) { + return _FooBrandCheck.has(other); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/input.js new file mode 100644 index 000000000000..e7f65a90b196 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/input.js @@ -0,0 +1,4 @@ +(x = class { + #foo; + test(other) { return #foo in other } +}) => {} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js new file mode 100644 index 000000000000..79443544a14d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js @@ -0,0 +1,12 @@ +(x = (() => { + var _fooBrandCheck; + + return _fooBrandCheck = /*#__PURE__*/new WeakSet(), class { + #foo = void _fooBrandCheck.add(this); + + test(other) { + return _fooBrandCheck.has(other); + } + + }; +})()) => {}; diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/input.js new file mode 100644 index 000000000000..3d817b01b547 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/input.js @@ -0,0 +1,9 @@ +function fn() { + return new class { + #priv; + + method(obj) { + return #priv in obj; + } + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js new file mode 100644 index 000000000000..164117087063 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js @@ -0,0 +1,12 @@ +function fn() { + var _privBrandCheck; + + return new (_privBrandCheck = /*#__PURE__*/new WeakSet(), class { + #priv = void _privBrandCheck.add(this); + + method(obj) { + return _privBrandCheck.has(obj); + } + + })(); +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/input.js new file mode 100644 index 000000000000..8f394f3d4c76 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/input.js @@ -0,0 +1,9 @@ +function fn() { + return new class { + static #priv; + + method(obj) { + return #priv in obj; + } + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js new file mode 100644 index 000000000000..ff0e5b1a6548 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js @@ -0,0 +1,12 @@ +function fn() { + var _privBrandCheck; + + return new (_privBrandCheck = /*#__PURE__*/new WeakSet(), class { + static #priv = void _privBrandCheck.add(this); + + method(obj) { + return _privBrandCheck.has(obj); + } + + })(); +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/input.js new file mode 100644 index 000000000000..a682a1a15c5b --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js new file mode 100644 index 000000000000..c0ea2596a758 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js @@ -0,0 +1,12 @@ +var _temp; + +var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + +class Foo { + #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); + + test(other) { + return _fooBrandCheck.has(other); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/exec.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/exec.js new file mode 100644 index 000000000000..733062328585 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/exec.js @@ -0,0 +1,28 @@ +let hasW, hasX, hasY, hasZ; +let halfConstructed; + +class F { + m() { + hasW = #w in this; + hasX = #x in this; + hasY = #y in this; + hasZ = #z in this; + } + get #w() {} + #x = 0; + #y = (() => { + halfConstructed = this; + throw "error"; + })(); + #z() {} +} + +try { + new F(); +} catch {} +halfConstructed.m(); + +expect(hasW).toBe(true); +expect(hasX).toBe(true); +expect(hasY).toBe(false); +expect(hasZ).toBe(true); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/input.js new file mode 100644 index 000000000000..048cedcd5bf4 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/input.js @@ -0,0 +1,14 @@ +class F { + m() { + #w in this; + #x in this; + #y in this; + #z in this; + } + get #w() {} + #x = 0; + #y = (() => { + throw 'error'; + })(); + #z() {} +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json new file mode 100644 index 000000000000..1655c55f42cc --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json @@ -0,0 +1,3 @@ +{ + "minNodeVersion": "14.0.0" +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js new file mode 100644 index 000000000000..6a6068c69d7a --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js @@ -0,0 +1,29 @@ +var _temp, _temp2; + +var _FBrandCheck = /*#__PURE__*/new WeakSet(); + +var _xBrandCheck = /*#__PURE__*/new WeakSet(); + +var _yBrandCheck = /*#__PURE__*/new WeakSet(); + +class F { + m() { + _FBrandCheck.has(this); + + _xBrandCheck.has(this); + + _yBrandCheck.has(this); + + _FBrandCheck.has(this); + } + + get #w() {} + + #x = (_temp = (_FBrandCheck.add(this), 0), _xBrandCheck.add(this), _temp); + #y = (_temp2 = (() => { + throw 'error'; + })(), _yBrandCheck.add(this), _temp2); + + #z() {} + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/exec.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/exec.js new file mode 100644 index 000000000000..f60e0b24fde7 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/exec.js @@ -0,0 +1,27 @@ +let hasW, hasX, hasY, hasZ; +let halfConstructed; + +try { + class F { + static m() { + hasW = #w in this; + hasX = #x in this; + hasY = #y in this; + hasZ = #z in this; + } + static get #w() {} + static #x = 0; + static #y = (() => { + halfConstructed = this; + throw "error"; + })(); + static #z() {} + } +} catch {} + +halfConstructed.m(); + +expect(hasW).toBe(true); +expect(hasX).toBe(true); +expect(hasY).toBe(false); +expect(hasZ).toBe(true); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/input.js new file mode 100644 index 000000000000..9b6ff923f33a --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/input.js @@ -0,0 +1,12 @@ +class F { + static m() { + #x in this; + #y in this; + #z in this; + } + static #x = 0; + static #y = (() => { + throw 'error'; + })(); + static #z() {} +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json new file mode 100644 index 000000000000..1655c55f42cc --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json @@ -0,0 +1,3 @@ +{ + "minNodeVersion": "14.0.0" +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js new file mode 100644 index 000000000000..5a318b582285 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js @@ -0,0 +1,23 @@ +var _temp, _temp2; + +var _xBrandCheck = /*#__PURE__*/new WeakSet(); + +var _yBrandCheck = /*#__PURE__*/new WeakSet(); + +class F { + static m() { + _xBrandCheck.has(this); + + _yBrandCheck.has(this); + + F === this; + } + + static #x = (_temp = 0, _xBrandCheck.add(this), _temp); + static #y = (_temp2 = (() => { + throw 'error'; + })(), _yBrandCheck.add(this), _temp2); + + static #z() {} + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/input.js new file mode 100644 index 000000000000..365843c59708 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js new file mode 100644 index 000000000000..71e16edbe93f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js @@ -0,0 +1,14 @@ +var _FooBrandCheck = /*#__PURE__*/new WeakSet(); + +class Foo { + constructor() { + _FooBrandCheck.add(this); + } + + #foo() {} + + test(other) { + return _FooBrandCheck.has(other); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/input.js new file mode 100644 index 000000000000..bb22d4fbdb0e --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/input.js @@ -0,0 +1,11 @@ +class A { + #x; + #m() {} + + test() { + #x in this; + #m in this; + #x in this; + #m in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js new file mode 100644 index 000000000000..da055a4bc10b --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js @@ -0,0 +1,20 @@ +var _xBrandCheck = /*#__PURE__*/new WeakSet(); + +var _ABrandCheck = /*#__PURE__*/new WeakSet(); + +class A { + #x = (_ABrandCheck.add(this), void _xBrandCheck.add(this)); + + #m() {} + + test() { + _xBrandCheck.has(this); + + _ABrandCheck.has(this); + + _xBrandCheck.has(this); + + _ABrandCheck.has(this); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/input.js new file mode 100644 index 000000000000..a084dd06afd6 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + #foo in this; + #bar in this; + } + } + + #foo in this; + #bar in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js new file mode 100644 index 000000000000..9048d000144f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js @@ -0,0 +1,32 @@ +var _temp, _temp3; + +var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + +var _barBrandCheck2 = /*#__PURE__*/new WeakSet(); + +class Foo { + #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); + #bar = (_temp3 = 1, _barBrandCheck2.add(this), _temp3); + + test() { + var _temp2; + + var _barBrandCheck = /*#__PURE__*/new WeakSet(); + + class Nested { + #bar = (_temp2 = 2, _barBrandCheck.add(this), _temp2); + + test() { + _fooBrandCheck.has(this); + + _barBrandCheck.has(this); + } + + } + + _fooBrandCheck.has(this); + + _barBrandCheck2.has(this); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/input.js new file mode 100644 index 000000000000..2258be35c5fd --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js new file mode 100644 index 000000000000..279f759f6f6d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js @@ -0,0 +1,25 @@ +var _temp2; + +var _fooBrandCheck2 = /*#__PURE__*/new WeakSet(); + +class Foo { + #foo = (_temp2 = 1, _fooBrandCheck2.add(this), _temp2); + + test() { + var _temp; + + var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + + class Nested { + #foo = (_temp = 2, _fooBrandCheck.add(this), _temp); + + test() { + _fooBrandCheck.has(this); + } + + } + + _fooBrandCheck2.has(this); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/input.js new file mode 100644 index 000000000000..e17e438b314d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js new file mode 100644 index 000000000000..ff28dc79027c --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js @@ -0,0 +1,19 @@ +var _temp; + +var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + +class Foo { + #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); + + test() { + class Nested { + test() { + _fooBrandCheck.has(this); + } + + } + + _fooBrandCheck.has(this); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/options.json b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/options.json new file mode 100644 index 000000000000..4387c5cb4e0e --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-private-property-in-object"] +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/input.js new file mode 100644 index 000000000000..e74333f2055f --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + static get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js new file mode 100644 index 000000000000..cdec0d002314 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js @@ -0,0 +1,8 @@ +class Foo { + static get #foo() {} + + test(other) { + return Foo === other; + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/input.js new file mode 100644 index 000000000000..a4f771844fe9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js new file mode 100644 index 000000000000..588b3ad0b3c9 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js @@ -0,0 +1,12 @@ +var _temp; + +var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + +class Foo { + static #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); + + test(other) { + return _fooBrandCheck.has(other); + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/input.js new file mode 100644 index 000000000000..9fffe7a01622 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js new file mode 100644 index 000000000000..bb657d68eb23 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js @@ -0,0 +1,8 @@ +class Foo { + static #foo() {} + + test(other) { + return Foo === other; + } + +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/input.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/input.js new file mode 100644 index 000000000000..67206379b189 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/input.js @@ -0,0 +1,9 @@ +class A { + static #foo; + + test() { + let A = function fn(A) { + return #foo in A; + }; + } +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js new file mode 100644 index 000000000000..9b87e5b5b41d --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js @@ -0,0 +1,12 @@ +var _fooBrandCheck = /*#__PURE__*/new WeakSet(); + +class A { + static #foo = void _fooBrandCheck.add(this); + + test() { + let A = function fn(A) { + return _fooBrandCheck.has(A); + }; + } + +} From e43676234d469149bb4ef5c246ac5016db0315ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 07:43:43 +0900 Subject: [PATCH 004/105] Basic form --- .../proposal/src/private_in_object.rs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 45e7ed29d217..b1b43013e5ab 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,9 +1,42 @@ +use std::borrow::Cow; +use swc_common::pass::CompilerPass; +use swc_ecma_transforms_base::pass::JsPass; +use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut}; + +/// https://github.com/tc39/proposal-private-fields-in-in +pub fn private_in_object() -> impl JsPass { + as_folder(PrivateInObject {}) +} + +struct PrivateInObject {} + +impl CompilerPass for PrivateInObject { + fn name() -> Cow<'static, str> { + Cow::Borrowed("private-in-object") + } +} + +impl VisitMut for PrivateInObject { + noop_visit_mut_type!(); +} + #[cfg(test)] mod tests { + use super::private_in_object; use std::path::PathBuf; + use swc_ecma_transforms_testing::test_fixture; #[testing::fixture("tests/private-in-object/**/input.js")] - fn fixture(input: PathBuf) {} + fn fixture(input: PathBuf) { + let parent = input.parent().unwrap(); + let output = parent.join("output.js"); + test_fixture( + Default::default(), + &|_| private_in_object(), + &input, + &output, + ) + } #[testing::fixture("tests/private-in-object/**/exec.js")] fn exec(input: PathBuf) {} From c4c62a1238d391bf6ca4cec7bffedeb4121c0963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 08:42:48 +0900 Subject: [PATCH 005/105] WIP: Options --- .../transforms/proposal/src/private_in_object.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index b1b43013e5ab..3a2428cc142f 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -23,12 +23,20 @@ impl VisitMut for PrivateInObject { #[cfg(test)] mod tests { use super::private_in_object; + use serde::Deserialize; use std::path::PathBuf; - use swc_ecma_transforms_testing::test_fixture; + use swc_ecma_transforms_testing::{parse_options, test_fixture}; + + #[derive(Debug, Clone, Deserialize)] + #[serde(deny_unknown_fields)] + struct TestOptions {} #[testing::fixture("tests/private-in-object/**/input.js")] fn fixture(input: PathBuf) { let parent = input.parent().unwrap(); + + let options: TestOptions = parse_options(&parent); + let output = parent.join("output.js"); test_fixture( Default::default(), From ce9bc5d8aedf42bd8cb5e1cf25cc86924c8e85af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 08:43:59 +0900 Subject: [PATCH 006/105] Dep --- Cargo.lock | 2 ++ ecmascript/transforms/proposal/Cargo.toml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ce100aa009a6..e26e4a6086f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2861,6 +2861,7 @@ dependencies = [ "either", "fxhash", "serde", + "serde_json", "smallvec 1.6.1", "swc_atoms 0.2.7", "swc_common", @@ -2874,6 +2875,7 @@ dependencies = [ "swc_ecma_transforms_testing", "swc_ecma_utils", "swc_ecma_visit", + "testing", ] [[package]] diff --git a/ecmascript/transforms/proposal/Cargo.toml b/ecmascript/transforms/proposal/Cargo.toml index 6f312fcf0783..ed9e5c5ecf49 100644 --- a/ecmascript/transforms/proposal/Cargo.toml +++ b/ecmascript/transforms/proposal/Cargo.toml @@ -30,6 +30,8 @@ swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] +serde_json = "1.0.66" swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} +testing = {version = "0.12.2", path = "../../../testing"} From 69a5bac0a15011e2e10c552ab0c9799cd0d64c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 08:46:44 +0900 Subject: [PATCH 007/105] Print option on parsing error --- ecmascript/transforms/testing/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecmascript/transforms/testing/src/lib.rs b/ecmascript/transforms/testing/src/lib.rs index a31ae677fe4a..331f2767d224 100644 --- a/ecmascript/transforms/testing/src/lib.rs +++ b/ecmascript/transforms/testing/src/lib.rs @@ -603,7 +603,7 @@ where } serde_json::from_str(&s) - .unwrap_or_else(|err| panic!("failed to deserialize options.json: {}", err)) + .unwrap_or_else(|err| panic!("failed to deserialize options.json: {}\n{}", err, s)) } pub fn test_fixture

(syntax: Syntax, tr: &dyn Fn(&mut Tester) -> P, input: &Path, output: &Path) From 3d0516e50323700e5a4496492c80fb680bf6ca39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 08:48:16 +0900 Subject: [PATCH 008/105] Parse test options --- .../transforms/proposal/src/private_in_object.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 3a2428cc142f..2603d451bb2f 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -29,7 +29,16 @@ mod tests { #[derive(Debug, Clone, Deserialize)] #[serde(deny_unknown_fields)] - struct TestOptions {} + struct TestOptions { + plugins: Vec, + } + + #[derive(Debug, Clone, Deserialize)] + #[serde(untagged)] + enum PluginConfig { + WithOption(String, #[serde(default)] serde_json::Value), + Name(String), + } #[testing::fixture("tests/private-in-object/**/input.js")] fn fixture(input: PathBuf) { From 97008ff273e361469ce648a2778396abd8e61c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sun, 15 Aug 2021 08:59:55 +0900 Subject: [PATCH 009/105] Improve test system --- .../proposal/src/private_in_object.rs | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 2603d451bb2f..81e443a56695 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -25,7 +25,11 @@ mod tests { use super::private_in_object; use serde::Deserialize; use std::path::PathBuf; + use swc_common::chain; + use swc_ecma_transforms_base::pass::noop; + use swc_ecma_transforms_compat::{es2015::classes, es2020::class_properties}; use swc_ecma_transforms_testing::{parse_options, test_fixture}; + use swc_ecma_visit::Fold; #[derive(Debug, Clone, Deserialize)] #[serde(deny_unknown_fields)] @@ -49,7 +53,38 @@ mod tests { let output = parent.join("output.js"); test_fixture( Default::default(), - &|_| private_in_object(), + &|t| { + let mut pass: Box = Box::new(noop()); + + for plugin in &options.plugins { + let (name, _option) = match plugin { + PluginConfig::WithOption(name, config) => (name, config.clone()), + PluginConfig::Name(name) => (name, serde_json::Value::Null), + }; + + match &**name { + "proposal-private-property-in-object" => { + pass = Box::new(chain!(pass, private_in_object())); + } + + "proposal-class-properties" => { + pass = Box::new(chain!(pass, class_properties())); + } + + "proposal-private-methods" => {} + + "transform-classes" => { + pass = Box::new(chain!(pass, classes(Some(t.comments.clone())))); + } + + _ => { + panic!("unknown pass: {}", name) + } + } + } + + pass + }, &input, &output, ) From ceec55bda1f8f6dee9247369028fe52d69d07e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 18 Aug 2021 20:08:32 +0900 Subject: [PATCH 010/105] Add `EsConfig.private_in_object` --- ecmascript/parser/src/lib.rs | 2 ++ ecmascript/parser/tests/comments.rs | 1 + 2 files changed, 3 insertions(+) diff --git a/ecmascript/parser/src/lib.rs b/ecmascript/parser/src/lib.rs index 5b071f9fc662..1af0a787393b 100644 --- a/ecmascript/parser/src/lib.rs +++ b/ecmascript/parser/src/lib.rs @@ -378,6 +378,8 @@ pub struct EsConfig { #[serde(default)] #[serde(rename = "staticBlocks")] pub static_blocks: bool, + #[serde(rename = "privateInObject")] + pub private_in_object: bool, } /// Syntactic context. diff --git a/ecmascript/parser/tests/comments.rs b/ecmascript/parser/tests/comments.rs index 43f759d7cd88..4bf32ecc1991 100644 --- a/ecmascript/parser/tests/comments.rs +++ b/ecmascript/parser/tests/comments.rs @@ -42,6 +42,7 @@ fn test(input: PathBuf) { top_level_await: true, import_assertions: true, static_blocks: true, + ..Default::default() }), "ts" | "tsx" => Syntax::Typescript(TsConfig { tsx: ext == "tsx", From ee0908e7ac002c872001b097d25852b5e32e0c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 18 Aug 2021 20:19:13 +0900 Subject: [PATCH 011/105] Fix parser --- ecmascript/parser/src/lib.rs | 9 +++++++++ ecmascript/parser/src/parser/expr.rs | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/ecmascript/parser/src/lib.rs b/ecmascript/parser/src/lib.rs index 1af0a787393b..4071b92951ef 100644 --- a/ecmascript/parser/src/lib.rs +++ b/ecmascript/parser/src/lib.rs @@ -276,6 +276,15 @@ impl Syntax { } } + pub(crate) fn private_in_object(self) -> bool { + match self { + Syntax::Es(EsConfig { + private_in_object, .. + }) => private_in_object, + _ => false, + } + } + pub(crate) fn early_errors(self) -> bool { match self { Syntax::Typescript(t) => !t.no_early_errors, diff --git a/ecmascript/parser/src/parser/expr.rs b/ecmascript/parser/src/parser/expr.rs index 018f284e31d9..1977ec47a71c 100644 --- a/ecmascript/parser/src/parser/expr.rs +++ b/ecmascript/parser/src/parser/expr.rs @@ -414,6 +414,16 @@ impl<'a, I: Tokens> Parser { } } + if self.input.syntax().private_in_object() { + if eat!(self, '#') { + let id = self.parse_ident_name()?; + return Ok(Box::new(Expr::PrivateName(PrivateName { + span: span!(self, start), + id, + }))); + } + } + unexpected!( self, "this, import, async, function, [ for array literal, { for object literal, @ for \ From 093ffe72343049544c5d778bb9b3db02b1f72b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 18 Aug 2021 20:19:30 +0900 Subject: [PATCH 012/105] Enable parser feature --- ecmascript/transforms/proposal/src/private_in_object.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 81e443a56695..28e8539f8c1d 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -26,6 +26,7 @@ mod tests { use serde::Deserialize; use std::path::PathBuf; use swc_common::chain; + use swc_ecma_parser::{EsConfig, Syntax}; use swc_ecma_transforms_base::pass::noop; use swc_ecma_transforms_compat::{es2015::classes, es2020::class_properties}; use swc_ecma_transforms_testing::{parse_options, test_fixture}; @@ -52,7 +53,10 @@ mod tests { let output = parent.join("output.js"); test_fixture( - Default::default(), + Syntax::Es(EsConfig { + private_in_object: true, + ..Default::default() + }), &|t| { let mut pass: Box = Box::new(noop()); From 6298ae5297627c080a25bbc8c1ee74d7b9a08e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 18:38:14 +0900 Subject: [PATCH 013/105] Disable assumption tests --- .../accessor/input.js | 0 .../accessor/output.js | 0 .../compiled-classes/input.js | 0 .../compiled-classes/options.json | 0 .../compiled-classes/output.js | 0 .../field/input.js | 0 .../field/output.js | 0 .../method/input.js | 0 .../method/output.js | 0 .../nested-class-other-redeclared/input.js | 0 .../nested-class-other-redeclared/output.js | 0 .../nested-class-redeclared/input.js | 0 .../nested-class-redeclared/output.js | 0 .../nested-class/input.js | 0 .../nested-class/output.js | 0 .../options.json | 0 .../static-accessor/input.js | 0 .../static-accessor/output.js | 0 .../static-field/input.js | 0 .../static-field/output.js | 0 .../static-method/input.js | 0 .../static-method/output.js | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/accessor/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/accessor/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/compiled-classes/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/compiled-classes/options.json (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/compiled-classes/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/field/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/field/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/method/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/method/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class-other-redeclared/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class-other-redeclared/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class-redeclared/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class-redeclared/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/nested-class/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/options.json (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-accessor/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-accessor/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-field/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-field/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-method/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{assumption-privateFieldsAsProperties => .assumption-privateFieldsAsProperties}/static-method/output.js (100%) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/accessor/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/accessor/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/accessor/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/accessor/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/accessor/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/options.json similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/options.json rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/options.json diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/compiled-classes/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/compiled-classes/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/field/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/field/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/field/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/field/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/field/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/method/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/method/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/method/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/method/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/method/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-redeclared/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-redeclared/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-redeclared/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class-redeclared/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/nested-class/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/nested-class/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/options.json similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/options.json rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/options.json diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-accessor/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-accessor/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-accessor/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-accessor/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-accessor/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-field/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-field/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-field/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-field/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-field/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-method/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-method/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-method/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/assumption-privateFieldsAsProperties/static-method/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.assumption-privateFieldsAsProperties/static-method/output.js From 59197f19a7ddc0026c55b63cd7849e268bcba0bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 18:53:19 +0900 Subject: [PATCH 014/105] More pass --- .../transforms/proposal/src/private_in_object.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 28e8539f8c1d..56b12acf2b40 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -60,6 +60,8 @@ mod tests { &|t| { let mut pass: Box = Box::new(noop()); + let mut class_props = false; + for plugin in &options.plugins { let (name, _option) = match plugin { PluginConfig::WithOption(name, config) => (name, config.clone()), @@ -72,10 +74,18 @@ mod tests { } "proposal-class-properties" => { - pass = Box::new(chain!(pass, class_properties())); + if !class_props { + class_props = true; + pass = Box::new(chain!(pass, class_properties())); + } } - "proposal-private-methods" => {} + "proposal-private-methods" => { + if !class_props { + class_props = true; + pass = Box::new(chain!(pass, class_properties())); + } + } "transform-classes" => { pass = Box::new(chain!(pass, classes(Some(t.comments.clone())))); From 0767a1f1f6ef39c2ccaa41b2fd06f77b12462f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:06:57 +0900 Subject: [PATCH 015/105] WIP: Brand check form class properties pass --- .../compat/src/es2020/class_properties/mod.rs | 1 + .../es2020/class_properties/private_field.rs | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index 8efbcc75b10d..07db9da37b6a 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -67,6 +67,7 @@ impl Fold for ClassProperties { ..p.fold_children_with(self) } } + fn fold_object_pat(&mut self, p: ObjectPat) -> ObjectPat { ObjectPat { optional: false, diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index 43f0806df0cf..b906a4eb3c0a 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -58,6 +58,33 @@ impl<'a> Fold for FieldAccessFolder<'a> { fn fold_expr(&mut self, e: Expr) -> Expr { match e { + Expr::Bin(BinExpr { + span, + op: op!("in"), + left, + right, + }) if left.is_private_name() => { + let n = match &*left { + Expr::PrivateName(ref n) => n, + _ => { + unreachable!() + } + }; + + let is_static = self.statics.contains(&n.id.sym); + let ident = Ident::new( + format!("_{}", n.id.sym).into(), + n.id.span.apply_mark(self.mark), + ); + + Expr::Call(CallExpr { + span, + callee: ident.make_member(quote_ident!("has")).as_callee(), + args: vec![right.as_arg()], + type_args: Default::default(), + }) + } + Expr::Update(UpdateExpr { span, prefix, From b9a19ab148c0ff7363fce2cc1e6ed0bbe493d84d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:14:35 +0900 Subject: [PATCH 016/105] Pre-calc statics --- .../compat/src/es2020/class_properties/mod.rs | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index 07db9da37b6a..729324e1748d 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -328,7 +328,29 @@ impl ClassProperties { let mut constructor = None; let mut used_names = vec![]; let mut used_key_names = vec![]; - let mut statics = HashSet::default(); + let statics = { + let mut s = HashSet::default(); + + for member in &class.body { + match member { + ClassMember::PrivateMethod(method) => { + if method.is_static { + s.insert(method.key.id.sym.clone()); + } + } + + ClassMember::PrivateProp(prop) => { + if prop.is_static { + s.insert(prop.key.id.sym.clone()); + } + } + + _ => {} + } + } + + s + }; let mut private_methods = HashSet::default(); for member in class.body { @@ -521,9 +543,6 @@ impl ClassProperties { } ClassMember::PrivateProp(prop) => { let prop_span = prop.span(); - if prop.is_static { - statics.insert(prop.key.id.sym.clone()); - } let ident = Ident::new( format!("_{}", prop.key.id.sym).into(), @@ -673,9 +692,6 @@ impl ClassProperties { .with_ctxt(SyntaxContext::empty()) .apply_mark(self.method_mark), ); - if method.is_static { - statics.insert(method.key.id.sym.clone()); - } let weak_set_var = Ident::new( format!("_{}", method.key.id.sym).into(), From 8d0bae577d390a8e0ed89e82eaee9bc895b633e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:22:51 +0900 Subject: [PATCH 017/105] Brand-check --- .../compat/src/es2020/class_properties/mod.rs | 39 +++++++-- .../es2020/class_properties/private_field.rs | 83 ++++++++++++------- 2 files changed, 86 insertions(+), 36 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index 729324e1748d..ac0cc9350dee 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -1,6 +1,8 @@ use self::{ - class_name_tdz::ClassNameTdzFolder, private_field::FieldAccessFolder, - this_in_static::ThisInStaticFolder, used_name::UsedNameCollector, + class_name_tdz::ClassNameTdzFolder, + private_field::{BrandCheckHandler, FieldAccessFolder}, + this_in_static::ThisInStaticFolder, + used_name::UsedNameCollector, }; use std::{collections::HashSet, mem::take}; use swc_common::{util::move_map::MoveMap, Mark, Spanned, SyntaxContext, DUMMY_SP}; @@ -12,7 +14,9 @@ use swc_ecma_utils::{ alias_ident_for, alias_if_required, constructor::inject_after_super, default_constructor, private_ident, quote_ident, undefined, ExprFactory, ModuleItemLike, StmtLike, }; -use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith}; +use swc_ecma_visit::{ + noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitMutWith, VisitWith, +}; mod class_name_tdz; mod private_field; @@ -310,7 +314,7 @@ impl ClassProperties { fn fold_class_as_decl( &mut self, ident: Ident, - class: Class, + mut class: Class, ) -> (Vec, ClassDecl, Vec) { // Create one mark per class self.mark = Mark::fresh(Mark::root()); @@ -328,6 +332,8 @@ impl ClassProperties { let mut constructor = None; let mut used_names = vec![]; let mut used_key_names = vec![]; + let mut names_used_for_brand_checks = HashSet::default(); + let statics = { let mut s = HashSet::default(); @@ -351,7 +357,28 @@ impl ClassProperties { s }; - let mut private_methods = HashSet::default(); + let private_methods = { + let mut s = HashSet::default(); + + for member in &class.body { + match member { + ClassMember::PrivateMethod(method) => { + s.insert(method.key.id.sym.clone()); + } + + _ => {} + } + } + + s + }; + + class.body.visit_mut_with(&mut BrandCheckHandler { + mark: self.mark, + names: &mut names_used_for_brand_checks, + methods: &private_methods, + statics: &statics, + }); for member in class.body { match member { @@ -682,8 +709,6 @@ impl ClassProperties { } ClassMember::PrivateMethod(method) => { - private_methods.insert(method.key.id.sym.clone()); - let prop_span = method.span; let fn_name = Ident::new( method.key.id.sym.clone(), diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index b906a4eb3c0a..642739a612bd 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -4,11 +4,63 @@ use swc_atoms::JsWord; use swc_common::{Mark, Spanned, SyntaxContext, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{ - ext::{AsOptExpr, PatOrExprExt}, + ext::{AsOptExpr, MapWithMut, PatOrExprExt}, helper, }; use swc_ecma_utils::{alias_ident_for, alias_if_required, prepend, quote_ident, ExprFactory}; -use swc_ecma_visit::{noop_fold_type, Fold, FoldWith}; +use swc_ecma_visit::{noop_fold_type, noop_visit_mut_type, Fold, FoldWith, VisitMut, VisitMutWith}; + +pub(super) struct BrandCheckHandler<'a> { + /// Mark for the private `WeakSet` variable. + pub mark: Mark, + + /// Private names used for brand checks. + pub names: &'a mut FxHashSet, + + pub methods: &'a FxHashSet, + + pub statics: &'a FxHashSet, +} + +impl VisitMut for BrandCheckHandler<'_> { + noop_visit_mut_type!(); + + fn visit_mut_expr(&mut self, e: &mut Expr) { + e.visit_mut_children_with(self); + + match e { + Expr::Bin(BinExpr { + span, + op: op!("in"), + left, + right, + }) if left.is_private_name() => { + let n = match &**left { + Expr::PrivateName(ref n) => n, + _ => { + unreachable!() + } + }; + self.names.insert(n.id.sym.clone()); + + let is_static = self.statics.contains(&n.id.sym); + let ident = Ident::new( + format!("_{}", n.id.sym).into(), + n.id.span.apply_mark(self.mark), + ); + + *e = Expr::Call(CallExpr { + span: *span, + callee: ident.make_member(quote_ident!("has")).as_callee(), + args: vec![right.take().as_arg()], + type_args: Default::default(), + }); + } + + _ => {} + } + } +} pub(super) struct FieldAccessFolder<'a> { /// Mark for the private `WeakSet` variable. @@ -58,33 +110,6 @@ impl<'a> Fold for FieldAccessFolder<'a> { fn fold_expr(&mut self, e: Expr) -> Expr { match e { - Expr::Bin(BinExpr { - span, - op: op!("in"), - left, - right, - }) if left.is_private_name() => { - let n = match &*left { - Expr::PrivateName(ref n) => n, - _ => { - unreachable!() - } - }; - - let is_static = self.statics.contains(&n.id.sym); - let ident = Ident::new( - format!("_{}", n.id.sym).into(), - n.id.span.apply_mark(self.mark), - ); - - Expr::Call(CallExpr { - span, - callee: ident.make_member(quote_ident!("has")).as_callee(), - args: vec![right.as_arg()], - type_args: Default::default(), - }) - } - Expr::Update(UpdateExpr { span, prefix, From 8ae0f6c1cfa78cc8a517868769033986952eedb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:30:42 +0900 Subject: [PATCH 018/105] More work for privaet methods --- .../compat/src/es2020/class_properties/mod.rs | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index ac0cc9350dee..d074270d8c69 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -718,7 +718,9 @@ impl ClassProperties { .apply_mark(self.method_mark), ); - let weak_set_var = Ident::new( + let should_use_map = names_used_for_brand_checks.contains(&method.key.id.sym); + + let weak_coll_var = Ident::new( format!("_{}", method.key.id.sym).into(), // We use `self.mark` for private variables. method.key.span.apply_mark(self.mark), @@ -733,26 +735,55 @@ impl ClassProperties { vars.push(VarDeclarator { span: DUMMY_SP, definite: false, - name: Pat::Ident(weak_set_var.clone().into()), + name: Pat::Ident(weak_coll_var.clone().into()), init: Some(Box::new(Expr::from(NewExpr { span: DUMMY_SP, - callee: Box::new(Expr::Ident(quote_ident!("WeakSet"))), + callee: if should_use_map { + Box::new(Expr::Ident(quote_ident!("WeakMap"))) + } else { + Box::new(Expr::Ident(quote_ident!("WeakSet"))) + }, args: Some(Default::default()), type_args: Default::default(), }))), }); - // Add `_get.add(this);` to the constructor where `_get` is the name of the weak - // set. - constructor_exprs.push(Box::new(Expr::Call(CallExpr { - span: prop_span, - callee: weak_set_var - .clone() - .make_member(quote_ident!("add")) - .as_callee(), - args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], - type_args: Default::default(), - }))); + if should_use_map { + let get = PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(quote_ident!("get")), + value: Box::new(Expr::Ident(fn_name.clone())), + }))); + let set = PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { + key: PropName::Ident(quote_ident!("set")), + value: undefined(DUMMY_SP), + }))); + + let obj = ObjectLit { + span: DUMMY_SP, + props: vec![get, set], + }; + constructor_exprs.push(Box::new(Expr::Call(CallExpr { + span: prop_span, + callee: weak_coll_var + .clone() + .make_member(quote_ident!("set")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg(), obj.as_arg()], + type_args: Default::default(), + }))); + } else { + // Add `_get.add(this);` to the constructor where `_get` is the name of the + // weak set. + constructor_exprs.push(Box::new(Expr::Call(CallExpr { + span: prop_span, + callee: weak_coll_var + .clone() + .make_member(quote_ident!("add")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], + type_args: Default::default(), + }))); + } private_method_fn_decls.push(Stmt::Decl(Decl::Fn(FnDecl { ident: fn_name, From 513f6afd2208d54c0c913fa08f02740e298e0960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:35:14 +0900 Subject: [PATCH 019/105] Update test refs --- .../private/accessor/output.js | 42 +++++++++---------- .../private-in-object/private/field/output.js | 38 ++++++++--------- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js index 75a7587782a9..46a465d34d72 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/accessor/output.js @@ -1,24 +1,22 @@ -var _foo = /*#__PURE__*/new WeakMap(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.set(this, { - get: _get_foo, - set: void 0 - }); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return _foo.has(other); +var _foo = new WeakMap(); +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.set(this, { + get: foo, + set: void 0 + }); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return _foo.has(other); + } + } + ]); + return Foo; }(); - -function _get_foo() {} +function foo() { +} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js index c83e48bcd86d..9822842d48d7 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/field/output.js @@ -1,22 +1,20 @@ -var _foo = /*#__PURE__*/new WeakMap(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.set(this, { - writable: true, - value: 1 - }); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return _foo.has(other); +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.set(this, { + writable: true, + value: 1 + }); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return _foo.has(other); + } + } + ]); + return Foo; }(); +var _foo = new WeakMap(); From 32e8bda2ffc6fb26e80f887716a2f9ef3094afc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:37:32 +0900 Subject: [PATCH 020/105] More check for private methods --- .../transforms/compat/src/es2020/class_properties/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index d074270d8c69..d7ead60162f9 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -718,7 +718,9 @@ impl ClassProperties { .apply_mark(self.method_mark), ); - let should_use_map = names_used_for_brand_checks.contains(&method.key.id.sym); + let should_use_map = + matches!(method.kind, MethodKind::Getter | MethodKind::Setter) + && names_used_for_brand_checks.contains(&method.key.id.sym); let weak_coll_var = Ident::new( format!("_{}", method.key.id.sym).into(), From e3b632eca77fb9ce2a4dd2a73f96f41825d30c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:38:00 +0900 Subject: [PATCH 021/105] Update test refs --- .../private/method/output.js | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js index ac675cbf7d85..9b2fc9710dcc 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/method/output.js @@ -1,21 +1,19 @@ -var _foo = /*#__PURE__*/new WeakSet(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.add(this); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return _foo.has(other); +var _foo = new WeakSet(); +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.add(this); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return _foo.has(other); + } + } + ]); + return Foo; }(); - -function _foo2() {} +function foo() { +} From 8b32cb11eb13da8613e8521cc230a6e4750ecf86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:45:08 +0900 Subject: [PATCH 022/105] Handle class name --- .../compat/src/es2020/class_properties/mod.rs | 1 + .../es2020/class_properties/private_field.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index d7ead60162f9..5b550d1ac592 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -375,6 +375,7 @@ impl ClassProperties { class.body.visit_mut_with(&mut BrandCheckHandler { mark: self.mark, + class_name: &ident, names: &mut names_used_for_brand_checks, methods: &private_methods, statics: &statics, diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index 642739a612bd..10bc97b9c2c1 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -14,6 +14,8 @@ pub(super) struct BrandCheckHandler<'a> { /// Mark for the private `WeakSet` variable. pub mark: Mark, + pub class_name: &'a Ident, + /// Private names used for brand checks. pub names: &'a mut FxHashSet, @@ -41,6 +43,23 @@ impl VisitMut for BrandCheckHandler<'_> { unreachable!() } }; + match &**right { + Expr::Ident(right) => { + if self.class_name.sym == right.sym + && self.class_name.span.ctxt == right.span.ctxt + { + *e = Expr::Bin(BinExpr { + span: *span, + op: op!("==="), + left: Box::new(Expr::Ident(self.class_name.clone())), + right: Box::new(Expr::Ident(right.clone())), + }); + return; + } + } + _ => {} + } + self.names.insert(n.id.sym.clone()); let is_static = self.statics.contains(&n.id.sym); From 9241c8a3813c6055888a3b6544c5d6ed0c9021af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:46:17 +0900 Subject: [PATCH 023/105] Update test refs --- .../private/native-classes/output.js | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js index 13ebbe421023..75be945f72c8 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/native-classes/output.js @@ -1,24 +1,19 @@ -var _bar = /*#__PURE__*/new WeakMap(); - class Foo { - constructor() { - _bar.set(this, { - writable: true, - value: "bar" - }); - } - - static test() { - return Foo === Foo; - } - - test() { - return _bar.has(this); - } - + static test() { + return Foo === Foo; + } + test() { + return _bar.has(this); + } + constructor(){ + _bar.set(this, { + writable: true, + value: "bar" + }); + } } - var _foo = { - writable: true, - value: "foo" + writable: true, + value: "foo" }; +var _bar = new WeakMap(); From bdf958055a4629e44361fbd39729af27a87992a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:47:59 +0900 Subject: [PATCH 024/105] Update test refs --- .../private/nested-class/output.js | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js index 2c52c716a1ee..48884ce30f17 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js @@ -1,36 +1,34 @@ -var _foo = /*#__PURE__*/new WeakMap(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.set(this, { - writable: true, - value: 1 - }); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test() { - let Nested = /*#__PURE__*/function () { - function Nested() { - babelHelpers.classCallCheck(this, Nested); - } - - babelHelpers.createClass(Nested, [{ - key: "test", - value: function test() { - _foo.has(this); - } - }]); - return Nested; - }(); - - _foo.has(this); +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.set(this, { + writable: true, + value: 1 + }); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test() { + let Nested = function() { + function Nested() { + _classCallCheck(this, Nested); + } + _createClass(Nested, [ + { + key: "test", + value: function test() { + _foo.has(this); + } + } + ]); + return Nested; + }(); + _foo.has(this); + } + } + ]); + return Foo; }(); +var _foo = new WeakMap(); From 0c7a7da4f2474fad0173573ac851b5c86a6e1fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:49:04 +0900 Subject: [PATCH 025/105] Update test refs --- .../nested-class-other-redeclared/output.js | 94 +++++++++---------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js index a54b7a6691f1..8f498ec12716 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js @@ -1,54 +1,46 @@ -var _foo = /*#__PURE__*/new WeakMap(); - -var _bar = /*#__PURE__*/new WeakMap(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.set(this, { - writable: true, - value: 1 - }); - - _bar.set(this, { - writable: true, - value: 1 - }); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test() { - var _bar2 = /*#__PURE__*/new WeakMap(); - - let Nested = /*#__PURE__*/function () { - function Nested() { - babelHelpers.classCallCheck(this, Nested); - - _bar2.set(this, { +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.set(this, { writable: true, - value: 2 - }); - } - - babelHelpers.createClass(Nested, [{ - key: "test", - value: function test() { - _foo.has(this); - - _bar2.has(this); - } - }]); - return Nested; - }(); - - _foo.has(this); - - _bar.has(this); + value: 1 + }); + _bar.set(this, { + writable: true, + value: 1 + }); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test() { + let Nested = function() { + function Nested() { + _classCallCheck(this, Nested); + _bar1.set(this, { + writable: true, + value: 2 + }); + } + _createClass(Nested, [ + { + key: "test", + value: function test() { + _foo.has(this); + _bar1.has(this); + } + } + ]); + return Nested; + }(); + var _bar1 = new WeakMap(); + _foo.has(this); + _bar.has(this); + } + } + ]); + return Foo; }(); +var _foo = new WeakMap(); +var _bar = new WeakMap(); From 0f568c0420fd76dff9bec404173ff3ee3070f048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:49:38 +0900 Subject: [PATCH 026/105] Update test refs --- .../private/nested-class-redeclared/output.js | 76 +++++++++---------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js index 20a7183234aa..f9439af09d7d 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-redeclared/output.js @@ -1,43 +1,39 @@ -var _foo = /*#__PURE__*/new WeakMap(); - -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - - _foo.set(this, { - writable: true, - value: 1 - }); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test() { - var _foo2 = /*#__PURE__*/new WeakMap(); - - let Nested = /*#__PURE__*/function () { - function Nested() { - babelHelpers.classCallCheck(this, Nested); - - _foo2.set(this, { +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); + _foo.set(this, { writable: true, - value: 2 - }); - } - - babelHelpers.createClass(Nested, [{ - key: "test", - value: function test() { - _foo2.has(this); - } - }]); - return Nested; - }(); - - _foo.has(this); + value: 1 + }); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test() { + let Nested = function() { + function Nested() { + _classCallCheck(this, Nested); + _foo1.set(this, { + writable: true, + value: 2 + }); + } + _createClass(Nested, [ + { + key: "test", + value: function test() { + _foo1.has(this); + } + } + ]); + return Nested; + }(); + var _foo1 = new WeakMap(); + _foo.has(this); + } + } + ]); + return Foo; }(); +var _foo = new WeakMap(); From 04bc68fd72df821747a00e3e4c5f8998317fc54a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:57:41 +0900 Subject: [PATCH 027/105] Handle static --- .../src/es2020/class_properties/private_field.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index 10bc97b9c2c1..b453a140afe1 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -63,14 +63,25 @@ impl VisitMut for BrandCheckHandler<'_> { self.names.insert(n.id.sym.clone()); let is_static = self.statics.contains(&n.id.sym); - let ident = Ident::new( + + if is_static { + *e = Expr::Bin(BinExpr { + span: *span, + op: op!("==="), + left: right.take(), + right: Box::new(Expr::Ident(self.class_name.clone())), + }); + return; + } + + let weak_coll_ident = Ident::new( format!("_{}", n.id.sym).into(), n.id.span.apply_mark(self.mark), ); *e = Expr::Call(CallExpr { span: *span, - callee: ident.make_member(quote_ident!("has")).as_callee(), + callee: weak_coll_ident.make_member(quote_ident!("has")).as_callee(), args: vec![right.take().as_arg()], type_args: Default::default(), }); From 7e9ea3214e89bf5655d13ba8379d5ac7229893b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:59:03 +0900 Subject: [PATCH 028/105] Update test refs --- .../private/static-field/output.js | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js index c631923cb5a9..121706eca645 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-field/output.js @@ -1,20 +1,19 @@ -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return other === Foo; +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return other === Foo; + } + } + ]); + return Foo; }(); - var _foo = { - writable: true, - value: 1 + writable: true, + value: 1 }; From 277ca88e09034b9480a604af2b78afcc830b62da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 24 Aug 2021 19:59:46 +0900 Subject: [PATCH 029/105] Remove options.json --- .../to-native-fields/half-constructed-instance/options.json | 3 --- .../to-native-fields/half-constructed-static/options.json | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json delete mode 100644 ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json deleted file mode 100644 index 1655c55f42cc..000000000000 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "minNodeVersion": "14.0.0" -} diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json deleted file mode 100644 index 1655c55f42cc..000000000000 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "minNodeVersion": "14.0.0" -} From 83fc006d786c3bfcec013dd49b9e1ecbf7645b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 07:13:52 +0900 Subject: [PATCH 030/105] Optimize static methods --- .../compat/src/es2020/class_properties/mod.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index 5b550d1ac592..a3b1a6ba81ca 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -765,13 +765,29 @@ impl ClassProperties { span: DUMMY_SP, props: vec![get, set], }; + + let obj = if statics.contains(&method.key.id.sym) { + let var_name = private_ident!("static_method"); + + vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(var_name.clone().into()), + init: Some(Box::new(Expr::Object(obj))), + definite: Default::default(), + }); + + var_name.as_arg() + } else { + obj.as_arg() + }; + constructor_exprs.push(Box::new(Expr::Call(CallExpr { span: prop_span, callee: weak_coll_var .clone() .make_member(quote_ident!("set")) .as_callee(), - args: vec![ThisExpr { span: DUMMY_SP }.as_arg(), obj.as_arg()], + args: vec![ThisExpr { span: DUMMY_SP }.as_arg(), obj], type_args: Default::default(), }))); } else { From b9ae2df388db3aed20fdfaa2c13864a122154bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 09:39:45 +0900 Subject: [PATCH 031/105] Move test definitions --- .../proposal/src/private_in_object.rs | 88 ------------------- .../proposal/tests/private_in_object.rs | 84 ++++++++++++++++++ 2 files changed, 84 insertions(+), 88 deletions(-) create mode 100644 ecmascript/transforms/proposal/tests/private_in_object.rs diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 56b12acf2b40..aeb7a463c556 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -19,91 +19,3 @@ impl CompilerPass for PrivateInObject { impl VisitMut for PrivateInObject { noop_visit_mut_type!(); } - -#[cfg(test)] -mod tests { - use super::private_in_object; - use serde::Deserialize; - use std::path::PathBuf; - use swc_common::chain; - use swc_ecma_parser::{EsConfig, Syntax}; - use swc_ecma_transforms_base::pass::noop; - use swc_ecma_transforms_compat::{es2015::classes, es2020::class_properties}; - use swc_ecma_transforms_testing::{parse_options, test_fixture}; - use swc_ecma_visit::Fold; - - #[derive(Debug, Clone, Deserialize)] - #[serde(deny_unknown_fields)] - struct TestOptions { - plugins: Vec, - } - - #[derive(Debug, Clone, Deserialize)] - #[serde(untagged)] - enum PluginConfig { - WithOption(String, #[serde(default)] serde_json::Value), - Name(String), - } - - #[testing::fixture("tests/private-in-object/**/input.js")] - fn fixture(input: PathBuf) { - let parent = input.parent().unwrap(); - - let options: TestOptions = parse_options(&parent); - - let output = parent.join("output.js"); - test_fixture( - Syntax::Es(EsConfig { - private_in_object: true, - ..Default::default() - }), - &|t| { - let mut pass: Box = Box::new(noop()); - - let mut class_props = false; - - for plugin in &options.plugins { - let (name, _option) = match plugin { - PluginConfig::WithOption(name, config) => (name, config.clone()), - PluginConfig::Name(name) => (name, serde_json::Value::Null), - }; - - match &**name { - "proposal-private-property-in-object" => { - pass = Box::new(chain!(pass, private_in_object())); - } - - "proposal-class-properties" => { - if !class_props { - class_props = true; - pass = Box::new(chain!(pass, class_properties())); - } - } - - "proposal-private-methods" => { - if !class_props { - class_props = true; - pass = Box::new(chain!(pass, class_properties())); - } - } - - "transform-classes" => { - pass = Box::new(chain!(pass, classes(Some(t.comments.clone())))); - } - - _ => { - panic!("unknown pass: {}", name) - } - } - } - - pass - }, - &input, - &output, - ) - } - - #[testing::fixture("tests/private-in-object/**/exec.js")] - fn exec(input: PathBuf) {} -} diff --git a/ecmascript/transforms/proposal/tests/private_in_object.rs b/ecmascript/transforms/proposal/tests/private_in_object.rs new file mode 100644 index 000000000000..2bcc6a2881c2 --- /dev/null +++ b/ecmascript/transforms/proposal/tests/private_in_object.rs @@ -0,0 +1,84 @@ +use serde::Deserialize; +use std::path::PathBuf; +use swc_common::chain; +use swc_ecma_parser::{EsConfig, Syntax}; +use swc_ecma_transforms_base::pass::noop; +use swc_ecma_transforms_compat::{es2015::classes, es2020::class_properties}; +use swc_ecma_transforms_proposal::private_in_object; +use swc_ecma_transforms_testing::{parse_options, test_fixture}; +use swc_ecma_visit::Fold; + +#[derive(Debug, Clone, Deserialize)] +#[serde(deny_unknown_fields)] +struct TestOptions { + plugins: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(untagged)] +enum PluginConfig { + WithOption(String, #[serde(default)] serde_json::Value), + Name(String), +} + +#[testing::fixture("tests/private-in-object/**/input.js")] +fn fixture(input: PathBuf) { + let parent = input.parent().unwrap(); + + let options: TestOptions = parse_options(&parent); + + let output = parent.join("output.js"); + test_fixture( + Syntax::Es(EsConfig { + private_in_object: true, + ..Default::default() + }), + &|t| { + let mut pass: Box = Box::new(noop()); + + let mut class_props = false; + + for plugin in &options.plugins { + let (name, _option) = match plugin { + PluginConfig::WithOption(name, config) => (name, config.clone()), + PluginConfig::Name(name) => (name, serde_json::Value::Null), + }; + + match &**name { + "proposal-private-property-in-object" => { + pass = Box::new(chain!(pass, private_in_object())); + } + + "proposal-class-properties" => { + if !class_props { + class_props = true; + pass = Box::new(chain!(pass, class_properties())); + } + } + + "proposal-private-methods" => { + if !class_props { + class_props = true; + pass = Box::new(chain!(pass, class_properties())); + } + } + + "transform-classes" => { + pass = Box::new(chain!(pass, classes(Some(t.comments.clone())))); + } + + _ => { + panic!("unknown pass: {}", name) + } + } + } + + pass + }, + &input, + &output, + ) +} + +#[testing::fixture("tests/private-in-object/**/exec.js")] +fn exec(input: PathBuf) {} From f1b4f722f040bf79a64fa4a90d89ebfd2483e34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 09:42:25 +0900 Subject: [PATCH 032/105] WIP: private_in_object --- ecmascript/transforms/proposal/src/lib.rs | 2 +- .../proposal/src/private_in_object.rs | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/src/lib.rs b/ecmascript/transforms/proposal/src/lib.rs index e7035b8009fc..367d8c373a1b 100644 --- a/ecmascript/transforms/proposal/src/lib.rs +++ b/ecmascript/transforms/proposal/src/lib.rs @@ -1,6 +1,6 @@ pub use self::{ decorators::decorators, export_default_from::export_default_from, - import_assertions::import_assertions, + import_assertions::import_assertions, private_in_object::private_in_object, }; pub mod decorators; diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index aeb7a463c556..4449038dd6cc 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,7 +1,8 @@ use std::borrow::Cow; use swc_common::pass::CompilerPass; +use swc_ecma_ast::*; use swc_ecma_transforms_base::pass::JsPass; -use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut}; +use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; /// https://github.com/tc39/proposal-private-fields-in-in pub fn private_in_object() -> impl JsPass { @@ -18,4 +19,22 @@ impl CompilerPass for PrivateInObject { impl VisitMut for PrivateInObject { noop_visit_mut_type!(); + + fn visit_mut_member_expr(&mut self, e: &mut MemberExpr) { + e.obj.visit_mut_with(self); + + if e.computed { + e.obj.visit_mut_with(self); + } + } + + fn visit_mut_prop_name(&mut self, n: &mut PropName) { + match n { + PropName::Computed(_) => { + n.visit_mut_children_with(self); + } + + _ => {} + } + } } From e0e7123a3ff1505e353186cc9bfc8dc1afc873cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 09:49:37 +0900 Subject: [PATCH 033/105] Use marker --- .../proposal/src/private_in_object.rs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 4449038dd6cc..b46ec488dc6b 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,15 +1,20 @@ use std::borrow::Cow; -use swc_common::pass::CompilerPass; +use swc_common::{pass::CompilerPass, Mark}; use swc_ecma_ast::*; use swc_ecma_transforms_base::pass::JsPass; use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; /// https://github.com/tc39/proposal-private-fields-in-in pub fn private_in_object() -> impl JsPass { - as_folder(PrivateInObject {}) + as_folder(PrivateInObject { mark: Mark::root() }) } -struct PrivateInObject {} +struct PrivateInObject { + /// [Mark] for the current class. + /// + /// This is modified the class visitor. + mark: Mark, +} impl CompilerPass for PrivateInObject { fn name() -> Cow<'static, str> { @@ -20,6 +25,16 @@ impl CompilerPass for PrivateInObject { impl VisitMut for PrivateInObject { noop_visit_mut_type!(); + fn visit_mut_class(&mut self, n: &mut Class) { + let old_mark = self.mark; + + self.mark = Mark::fresh(Mark::root()); + + n.visit_mut_children_with(self); + + self.mark = old_mark; + } + fn visit_mut_member_expr(&mut self, e: &mut MemberExpr) { e.obj.visit_mut_with(self); From 304b1700ae7fb02d2dc0cf8b05a06e9849047b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 09:59:53 +0900 Subject: [PATCH 034/105] More field --- .../proposal/src/private_in_object.rs | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index b46ec488dc6b..1a6899c926e7 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, mem::take}; use swc_common::{pass::CompilerPass, Mark}; use swc_ecma_ast::*; use swc_ecma_transforms_base::pass::JsPass; @@ -6,10 +6,16 @@ use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; /// https://github.com/tc39/proposal-private-fields-in-in pub fn private_in_object() -> impl JsPass { - as_folder(PrivateInObject { mark: Mark::root() }) + as_folder(PrivateInObject::default()) } +#[derive(Default)] struct PrivateInObject { + cls: ClassData, +} + +#[derive(Default)] +struct ClassData { /// [Mark] for the current class. /// /// This is modified the class visitor. @@ -26,13 +32,28 @@ impl VisitMut for PrivateInObject { noop_visit_mut_type!(); fn visit_mut_class(&mut self, n: &mut Class) { - let old_mark = self.mark; + let old_cls = take(&mut self.cls); - self.mark = Mark::fresh(Mark::root()); + self.cls.mark = Mark::fresh(Mark::root()); n.visit_mut_children_with(self); - self.mark = old_mark; + self.cls = old_cls; + } + + fn visit_mut_expr(&mut self, e: &mut Expr) { + e.visit_mut_children_with(self); + + match e { + Expr::Bin(BinExpr { + op: op!("in"), + left, + right, + .. + }) if left.is_private_name() => {} + + _ => {} + } } fn visit_mut_member_expr(&mut self, e: &mut MemberExpr) { From 5ae7b93620c242a25aab305d45dd4727410e5368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:03:17 +0900 Subject: [PATCH 035/105] Fill more info --- .../proposal/src/private_in_object.rs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 1a6899c926e7..0127dc38e614 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,4 +1,5 @@ use std::{borrow::Cow, mem::take}; +use swc_atoms::JsWord; use swc_common::{pass::CompilerPass, Mark}; use swc_ecma_ast::*; use swc_ecma_transforms_base::pass::JsPass; @@ -18,8 +19,14 @@ struct PrivateInObject { struct ClassData { /// [Mark] for the current class. /// - /// This is modified the class visitor. + /// This is modified by the class visitor. mark: Mark, + + /// Name of private methods. + methods: Vec, + + /// Name of private statics. + statics: Vec, } impl CompilerPass for PrivateInObject { @@ -35,6 +42,25 @@ impl VisitMut for PrivateInObject { let old_cls = take(&mut self.cls); self.cls.mark = Mark::fresh(Mark::root()); + for m in &n.body { + match m { + ClassMember::PrivateMethod(m) => { + self.cls.methods.push(m.key.id.sym.clone()); + + if m.is_static { + self.cls.statics.push(m.key.id.sym.clone()); + } + } + + ClassMember::PrivateProp(m) => { + if m.is_static { + self.cls.statics.push(m.key.id.sym.clone()); + } + } + + _ => {} + } + } n.visit_mut_children_with(self); From b892ced9add6ff1282e423e47572349c122b7fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:19:28 +0900 Subject: [PATCH 036/105] inject vars --- .../proposal/src/private_in_object.rs | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 0127dc38e614..4c89da64f303 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,8 +1,10 @@ +use fxhash::FxHashSet; use std::{borrow::Cow, mem::take}; use swc_atoms::JsWord; -use swc_common::{pass::CompilerPass, Mark}; +use swc_common::{pass::CompilerPass, Mark, DUMMY_SP}; use swc_ecma_ast::*; -use swc_ecma_transforms_base::pass::JsPass; +use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass}; +use swc_ecma_utils::{ident::IdentLike, prepend, quote_ident, ExprExt, ExprFactory, Id}; use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; /// https://github.com/tc39/proposal-private-fields-in-in @@ -12,6 +14,8 @@ pub fn private_in_object() -> impl JsPass { #[derive(Default)] struct PrivateInObject { + vars: Vec, + injected_vars: FxHashSet, cls: ClassData, } @@ -35,6 +39,13 @@ impl CompilerPass for PrivateInObject { } } +impl PrivateInObject { + fn var_name_for_brand_check(&self, n: &PrivateName) -> Ident { + let span = n.span.apply_mark(self.cls.mark); + Ident::new(format!("_brand_check_{}", n.id.sym).into(), span) + } +} + impl VisitMut for PrivateInObject { noop_visit_mut_type!(); @@ -76,7 +87,25 @@ impl VisitMut for PrivateInObject { left, right, .. - }) if left.is_private_name() => {} + }) if left.is_private_name() => { + let left = left.clone().expect_private_name(); + + let var_name = self.var_name_for_brand_check(&left); + + if self.injected_vars.insert(var_name.to_id()) { + self.vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(var_name.clone().into()), + init: Some(Box::new(Expr::New(NewExpr { + span: DUMMY_SP, + callee: Box::new(Expr::Ident(quote_ident!("WeakSet"))), + args: Default::default(), + type_args: Default::default(), + }))), + definite: Default::default(), + }); + } + } _ => {} } @@ -90,6 +119,22 @@ impl VisitMut for PrivateInObject { } } + fn visit_mut_module_items(&mut self, ns: &mut Vec) { + ns.visit_mut_children_with(self); + + if !self.vars.is_empty() { + prepend( + ns, + ModuleItem::Stmt(Stmt::Decl(Decl::Var(VarDecl { + span: DUMMY_SP, + kind: VarDeclKind::Var, + declare: Default::default(), + decls: take(&mut self.vars), + }))), + ); + } + } + fn visit_mut_prop_name(&mut self, n: &mut PropName) { match n { PropName::Computed(_) => { @@ -99,4 +144,20 @@ impl VisitMut for PrivateInObject { _ => {} } } + + fn visit_mut_stmts(&mut self, ns: &mut Vec) { + ns.visit_mut_children_with(self); + + if !self.vars.is_empty() { + prepend( + ns, + Stmt::Decl(Decl::Var(VarDecl { + span: DUMMY_SP, + kind: VarDeclKind::Var, + declare: Default::default(), + decls: take(&mut self.vars), + })), + ); + } + } } From aed16db3e815d7308693c2c99067bf751c65fc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:22:29 +0900 Subject: [PATCH 037/105] Fix tester --- ecmascript/transforms/proposal/tests/private_in_object.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private_in_object.rs b/ecmascript/transforms/proposal/tests/private_in_object.rs index 2bcc6a2881c2..03d6762b17de 100644 --- a/ecmascript/transforms/proposal/tests/private_in_object.rs +++ b/ecmascript/transforms/proposal/tests/private_in_object.rs @@ -45,9 +45,7 @@ fn fixture(input: PathBuf) { }; match &**name { - "proposal-private-property-in-object" => { - pass = Box::new(chain!(pass, private_in_object())); - } + "proposal-private-property-in-object" => {} "proposal-class-properties" => { if !class_props { @@ -73,6 +71,8 @@ fn fixture(input: PathBuf) { } } + pass = Box::new(chain!(pass, private_in_object())); + pass }, &input, From b003ededae7335e59d8ab8397a06f525bdd31251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:23:49 +0900 Subject: [PATCH 038/105] Fix var injection --- ecmascript/transforms/proposal/src/private_in_object.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 4c89da64f303..7aad6aecbe9d 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -145,12 +145,12 @@ impl VisitMut for PrivateInObject { } } - fn visit_mut_stmts(&mut self, ns: &mut Vec) { - ns.visit_mut_children_with(self); + fn visit_mut_script(&mut self, s: &mut Script) { + s.visit_mut_children_with(self); if !self.vars.is_empty() { prepend( - ns, + &mut s.body, Stmt::Decl(Decl::Var(VarDecl { span: DUMMY_SP, kind: VarDeclKind::Var, From a59a136adafb1f569b605b8cb1abe7ae94295b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:29:42 +0900 Subject: [PATCH 039/105] More work for brand checking --- .../transforms/proposal/src/private_in_object.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 7aad6aecbe9d..42bb8d6d1ee6 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -83,10 +83,10 @@ impl VisitMut for PrivateInObject { match e { Expr::Bin(BinExpr { + span, op: op!("in"), left, right, - .. }) if left.is_private_name() => { let left = left.clone().expect_private_name(); @@ -105,6 +105,14 @@ impl VisitMut for PrivateInObject { definite: Default::default(), }); } + + *e = Expr::Call(CallExpr { + span: *span, + callee: var_name.make_member(quote_ident!("has")).as_callee(), + args: vec![right.take().as_arg()], + type_args: Default::default(), + }); + return; } _ => {} From 78f3ce85f696c5ee8e87c52827ee16afe8f86389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 10:30:22 +0900 Subject: [PATCH 040/105] `new WeakSet()` --- ecmascript/transforms/proposal/src/private_in_object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 42bb8d6d1ee6..e763fd9bfd2a 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -99,7 +99,7 @@ impl VisitMut for PrivateInObject { init: Some(Box::new(Expr::New(NewExpr { span: DUMMY_SP, callee: Box::new(Expr::Ident(quote_ident!("WeakSet"))), - args: Default::default(), + args: Some(Default::default()), type_args: Default::default(), }))), definite: Default::default(), From 8ec9c37711e54c964ad5f72f5d404b065d440cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:27:12 +0900 Subject: [PATCH 041/105] Add a field for constructor injection --- ecmascript/transforms/proposal/src/private_in_object.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index e763fd9bfd2a..ae2c971aac2d 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -31,6 +31,8 @@ struct ClassData { /// Name of private statics. statics: Vec, + + consturctor_exprs: Vec, } impl CompilerPass for PrivateInObject { @@ -75,6 +77,8 @@ impl VisitMut for PrivateInObject { n.visit_mut_children_with(self); + if !self.cls.consturctor_exprs.is_empty() {} + self.cls = old_cls; } From 7591cb0d2a4b44c0b88ac3015db2a4c949b61b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:31:14 +0900 Subject: [PATCH 042/105] Consturctor injection --- .../proposal/src/private_in_object.rs | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index ae2c971aac2d..49c6e7e331cf 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -4,7 +4,9 @@ use swc_atoms::JsWord; use swc_common::{pass::CompilerPass, Mark, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass}; -use swc_ecma_utils::{ident::IdentLike, prepend, quote_ident, ExprExt, ExprFactory, Id}; +use swc_ecma_utils::{ + default_constructor, ident::IdentLike, prepend, quote_ident, ExprExt, ExprFactory, Id, +}; use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; /// https://github.com/tc39/proposal-private-fields-in-in @@ -32,7 +34,7 @@ struct ClassData { /// Name of private statics. statics: Vec, - consturctor_exprs: Vec, + consturctor_exprs: Vec>, } impl CompilerPass for PrivateInObject { @@ -77,7 +79,35 @@ impl VisitMut for PrivateInObject { n.visit_mut_children_with(self); - if !self.cls.consturctor_exprs.is_empty() {} + if !self.cls.consturctor_exprs.is_empty() { + let has_constructor = n + .body + .iter() + .any(|m| matches!(m, ClassMember::Constructor(_))); + + if !has_constructor { + let has_super = n.super_class.is_some(); + n.body + .push(ClassMember::Constructor(default_constructor(has_super))); + } + + for m in &mut n.body { + match m { + ClassMember::Constructor(Constructor { + body: Some(body), .. + }) => { + for expr in take(&mut self.cls.consturctor_exprs) { + body.stmts.push(Stmt::Expr(ExprStmt { + span: DUMMY_SP, + expr, + })); + } + } + + _ => {} + } + } + } self.cls = old_cls; } From a0fe6f138ea0e604637ee0563a5559938053493d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:33:28 +0900 Subject: [PATCH 043/105] Inject expressions into consturctor --- .../transforms/proposal/src/private_in_object.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 49c6e7e331cf..4ac35db614be 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -138,6 +138,17 @@ impl VisitMut for PrivateInObject { }))), definite: Default::default(), }); + self.cls + .consturctor_exprs + .push(Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: var_name + .clone() + .make_member(quote_ident!("add")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], + type_args: Default::default(), + }))); } *e = Expr::Call(CallExpr { From 4d1796b6491ccb06f944a41d774817951dcba440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:34:05 +0900 Subject: [PATCH 044/105] Update test refs --- .../to-native-fields/accessor/output.js | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js index f7a2a1df365c..be479bf8d60d 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js @@ -1,14 +1,11 @@ -var _FooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_foo = new WeakSet(); class Foo { - constructor() { - _FooBrandCheck.add(this); - } - - get #foo() {} - - test(other) { - return _FooBrandCheck.has(other); - } - + get #foo() { + } + test(other) { + return _brand_check_foo.has(other); + } + constructor(){ + _brand_check_foo.add(this); + } } From 8280791a2980fbf89b8c2079196e70bbdf58dbff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:48:30 +0900 Subject: [PATCH 045/105] Handle statics --- .../proposal/src/private_in_object.rs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 4ac35db614be..fce7478453cf 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -5,7 +5,8 @@ use swc_common::{pass::CompilerPass, Mark, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass}; use swc_ecma_utils::{ - default_constructor, ident::IdentLike, prepend, quote_ident, ExprExt, ExprFactory, Id, + default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprExt, + ExprFactory, Id, }; use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; @@ -19,6 +20,8 @@ struct PrivateInObject { vars: Vec, injected_vars: FxHashSet, cls: ClassData, + + cls_ident: Option, } #[derive(Default)] @@ -112,6 +115,26 @@ impl VisitMut for PrivateInObject { self.cls = old_cls; } + fn visit_mut_class_decl(&mut self, n: &mut ClassDecl) { + let old_cls_ident = take(&mut self.cls_ident); + self.cls_ident = Some(n.ident.clone()); + + n.visit_mut_children_with(self); + + self.cls_ident = old_cls_ident; + } + + fn visit_mut_class_expr(&mut self, n: &mut ClassExpr) { + let old_cls_ident = take(&mut self.cls_ident); + + let i = n.ident.get_or_insert_with(|| private_ident!("_class")); + self.cls_ident = Some(i.clone()); + + n.visit_mut_children_with(self); + + self.cls_ident = old_cls_ident; + } + fn visit_mut_expr(&mut self, e: &mut Expr) { e.visit_mut_children_with(self); @@ -124,6 +147,20 @@ impl VisitMut for PrivateInObject { }) if left.is_private_name() => { let left = left.clone().expect_private_name(); + let is_static = self.cls.statics.contains(&left.id.sym); + + if let Some(cls_ident) = self.cls_ident.clone() { + if is_static { + *e = Expr::Bin(BinExpr { + span: *span, + op: op!("==="), + left: Box::new(Expr::Ident(cls_ident)), + right: right.take(), + }); + return; + } + } + let var_name = self.var_name_for_brand_check(&left); if self.injected_vars.insert(var_name.to_id()) { From f9c08431ffd1e7a07cb7de82946dc3d18065708a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:49:58 +0900 Subject: [PATCH 046/105] More check --- ecmascript/transforms/proposal/src/private_in_object.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index fce7478453cf..24ad900da0a9 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -148,9 +148,10 @@ impl VisitMut for PrivateInObject { let left = left.clone().expect_private_name(); let is_static = self.cls.statics.contains(&left.id.sym); + let is_method = self.cls.methods.contains(&left.id.sym); if let Some(cls_ident) = self.cls_ident.clone() { - if is_static { + if is_static && is_method { *e = Expr::Bin(BinExpr { span: *span, op: op!("==="), From 01879634a065d8ca31398f5f607cc21fb861f462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:50:15 +0900 Subject: [PATCH 047/105] Update test refs --- .../to-native-fields/static-method/output.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js index bb657d68eb23..75df5c9662d0 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-method/output.js @@ -1,8 +1,7 @@ class Foo { - static #foo() {} - - test(other) { - return Foo === other; - } - + static #foo() { + } + test(other) { + return Foo === other; + } } From ffbb7eefa0bd3e05b1649c1dbff627d4c804c31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:51:02 +0900 Subject: [PATCH 048/105] Update test refs --- .../to-native-fields/static-accessor/output.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js index cdec0d002314..977421f120fc 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-accessor/output.js @@ -1,8 +1,7 @@ class Foo { - static get #foo() {} - - test(other) { - return Foo === other; - } - + static get #foo() { + } + test(other) { + return Foo === other; + } } From 2cc638377be75445a24ada8aad0bfb7d37834be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 11:51:36 +0900 Subject: [PATCH 049/105] Update test refs --- .../to-native-fields/method/output.js | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js index 71e16edbe93f..25f6d2353974 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js @@ -1,14 +1,11 @@ -var _FooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_foo = new WeakSet(); class Foo { - constructor() { - _FooBrandCheck.add(this); - } - - #foo() {} - - test(other) { - return _FooBrandCheck.has(other); - } - + #foo() { + } + test(other) { + return _brand_check_foo.has(other); + } + constructor(){ + _brand_check_foo.add(this); + } } From 49305bcde363c4c4853689bad924a09e12c0716e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:05:00 +0900 Subject: [PATCH 050/105] Reduce clone --- ecmascript/transforms/proposal/src/private_in_object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 24ad900da0a9..44ec48829c6b 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -145,7 +145,7 @@ impl VisitMut for PrivateInObject { left, right, }) if left.is_private_name() => { - let left = left.clone().expect_private_name(); + let left = left.take().expect_private_name(); let is_static = self.cls.statics.contains(&left.id.sym); let is_method = self.cls.methods.contains(&left.id.sym); From 70c4a865c366243ac4006509d1aeb47f2b989821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:11:34 +0900 Subject: [PATCH 051/105] Inject vars at correct level --- .../transforms/proposal/src/private_in_object.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 44ec48829c6b..68bc6587b7f3 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -26,6 +26,8 @@ struct PrivateInObject { #[derive(Default)] struct ClassData { + vars: Vec, + /// [Mark] for the current class. /// /// This is modified by the class visitor. @@ -112,6 +114,8 @@ impl VisitMut for PrivateInObject { } } + self.vars.extend(take(&mut self.cls.vars)); + self.cls = old_cls; } @@ -165,7 +169,7 @@ impl VisitMut for PrivateInObject { let var_name = self.var_name_for_brand_check(&left); if self.injected_vars.insert(var_name.to_id()) { - self.vars.push(VarDeclarator { + self.cls.vars.push(VarDeclarator { span: DUMMY_SP, name: Pat::Ident(var_name.clone().into()), init: Some(Box::new(Expr::New(NewExpr { @@ -236,12 +240,12 @@ impl VisitMut for PrivateInObject { } } - fn visit_mut_script(&mut self, s: &mut Script) { + fn visit_mut_stmts(&mut self, s: &mut Vec) { s.visit_mut_children_with(self); if !self.vars.is_empty() { prepend( - &mut s.body, + s, Stmt::Decl(Decl::Var(VarDecl { span: DUMMY_SP, kind: VarDeclKind::Var, From 212860fc8779145f966e86b2ab3efaf93fe023d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:21:19 +0900 Subject: [PATCH 052/105] Collect names used for brand checking --- .../proposal/src/private_in_object.rs | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 68bc6587b7f3..bdf06a230547 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -8,7 +8,9 @@ use swc_ecma_utils::{ default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprExt, ExprFactory, Id, }; -use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut, VisitMutWith}; +use swc_ecma_visit::{ + as_folder, noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith, +}; /// https://github.com/tc39/proposal-private-fields-in-in pub fn private_in_object() -> impl JsPass { @@ -40,6 +42,8 @@ struct ClassData { statics: Vec, consturctor_exprs: Vec>, + + names_used_for_brand_checks: FxHashSet, } impl CompilerPass for PrivateInObject { @@ -62,6 +66,16 @@ impl VisitMut for PrivateInObject { let old_cls = take(&mut self.cls); self.cls.mark = Mark::fresh(Mark::root()); + + { + n.visit_with( + &Invalid { span: DUMMY_SP }, + &mut ClassAnalyzer { + brand_check_names: &mut self.cls.names_used_for_brand_checks, + }, + ) + } + for m in &n.body { match m { ClassMember::PrivateMethod(m) => { @@ -139,6 +153,10 @@ impl VisitMut for PrivateInObject { self.cls_ident = old_cls_ident; } + fn visit_mut_class_prop(&mut self, n: &mut ClassProp) { + n.visit_mut_children_with(self); + } + fn visit_mut_expr(&mut self, e: &mut Expr) { e.visit_mut_children_with(self); @@ -256,3 +274,25 @@ impl VisitMut for PrivateInObject { } } } + +struct ClassAnalyzer<'a> { + brand_check_names: &'a mut FxHashSet, +} + +impl Visit for ClassAnalyzer<'_> { + noop_visit_type!(); + + fn visit_bin_expr(&mut self, n: &BinExpr, _: &dyn Node) { + n.visit_children_with(self); + + if n.op == op!("in") { + match &*n.left { + Expr::PrivateName(left) => { + self.brand_check_names.insert(left.id.sym.clone()); + } + + _ => {} + } + } + } +} From 588e0ea572b7bc5331e93f919bad930bbd5f8694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:22:16 +0900 Subject: [PATCH 053/105] fixup --- ecmascript/transforms/proposal/src/private_in_object.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index bdf06a230547..aa66a4d9f357 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -295,4 +295,7 @@ impl Visit for ClassAnalyzer<'_> { } } } + + /// Noop + fn visit_class(&mut self, n: &Class, _: &dyn Node) {} } From a1eb164c9354a6d82de8924911a4ba0f11f83cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:31:17 +0900 Subject: [PATCH 054/105] Handle private properties without init --- .../proposal/src/private_in_object.rs | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index aa66a4d9f357..9f5cb02c016b 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -68,12 +68,9 @@ impl VisitMut for PrivateInObject { self.cls.mark = Mark::fresh(Mark::root()); { - n.visit_with( - &Invalid { span: DUMMY_SP }, - &mut ClassAnalyzer { - brand_check_names: &mut self.cls.names_used_for_brand_checks, - }, - ) + n.visit_children_with(&mut ClassAnalyzer { + brand_check_names: &mut self.cls.names_used_for_brand_checks, + }) } for m in &n.body { @@ -153,10 +150,6 @@ impl VisitMut for PrivateInObject { self.cls_ident = old_cls_ident; } - fn visit_mut_class_prop(&mut self, n: &mut ClassProp) { - n.visit_mut_children_with(self); - } - fn visit_mut_expr(&mut self, e: &mut Expr) { e.visit_mut_children_with(self); @@ -248,6 +241,33 @@ impl VisitMut for PrivateInObject { } } + fn visit_mut_private_prop(&mut self, n: &mut PrivateProp) { + n.visit_mut_children_with(self); + + if self.cls.names_used_for_brand_checks.contains(&n.key.id.sym) { + let var_name = self.var_name_for_brand_check(&n.key); + + match &mut n.value { + Some(init) => {} + None => { + n.value = Some(Box::new(Expr::Unary(UnaryExpr { + span: DUMMY_SP, + op: op!("void"), + arg: Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: var_name + .clone() + .make_member(quote_ident!("add")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], + type_args: Default::default(), + })), + }))) + } + } + } + } + fn visit_mut_prop_name(&mut self, n: &mut PropName) { match n { PropName::Computed(_) => { From 6e38613963645a4ba5209a06e048c4b4de12ce22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:32:54 +0900 Subject: [PATCH 055/105] Skip expr injection for private properties --- .../proposal/src/private_in_object.rs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 9f5cb02c016b..aa1512677c76 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -191,17 +191,20 @@ impl VisitMut for PrivateInObject { }))), definite: Default::default(), }); - self.cls - .consturctor_exprs - .push(Box::new(Expr::Call(CallExpr { - span: DUMMY_SP, - callee: var_name - .clone() - .make_member(quote_ident!("add")) - .as_callee(), - args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], - type_args: Default::default(), - }))); + + if is_method { + self.cls + .consturctor_exprs + .push(Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: var_name + .clone() + .make_member(quote_ident!("add")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], + type_args: Default::default(), + }))); + } } *e = Expr::Call(CallExpr { From 19a12c1777eaed040a1914735150dbadf6e7200b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:34:22 +0900 Subject: [PATCH 056/105] Update test refs --- .../static-shadowed-binding/output.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js index 9b87e5b5b41d..9a30bb5679ca 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-shadowed-binding/output.js @@ -1,12 +1,9 @@ -var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_foo = new WeakSet(); class A { - static #foo = void _fooBrandCheck.add(this); - - test() { - let A = function fn(A) { - return _fooBrandCheck.has(A); - }; - } - + static #foo = void _brand_check_foo.add(this); + test() { + let A = function fn(A) { + return _brand_check_foo.has(A); + }; + } } From 730952075f1c03bd2ab1246ff0047aab1a3a875e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:38:32 +0900 Subject: [PATCH 057/105] Handle private properties --- .../proposal/src/private_in_object.rs | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index aa1512677c76..8e6e09857e8c 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,7 +1,7 @@ use fxhash::FxHashSet; use std::{borrow::Cow, mem::take}; use swc_atoms::JsWord; -use swc_common::{pass::CompilerPass, Mark, DUMMY_SP}; +use swc_common::{pass::CompilerPass, Mark, Spanned, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass}; use swc_ecma_utils::{ @@ -251,7 +251,39 @@ impl VisitMut for PrivateInObject { let var_name = self.var_name_for_brand_check(&n.key); match &mut n.value { - Some(init) => {} + Some(init) => { + let init_span = init.span(); + + let tmp = private_ident!("_tmp"); + self.vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(tmp.clone().into()), + init: None, + definite: Default::default(), + }); + + let assign = Box::new(Expr::Assign(AssignExpr { + span: DUMMY_SP, + op: op!("="), + left: PatOrExpr::Pat(Box::new(Pat::Ident(tmp.clone().into()))), + right: init.take(), + })); + + let add_to_checker = Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: var_name + .clone() + .make_member(quote_ident!("add")) + .as_callee(), + args: vec![ThisExpr { span: DUMMY_SP }.as_arg()], + type_args: Default::default(), + })); + + *init = Box::new(Expr::Seq(SeqExpr { + span: init_span, + exprs: vec![assign, add_to_checker, Box::new(tmp.clone().into())], + })); + } None => { n.value = Some(Box::new(Expr::Unary(UnaryExpr { span: DUMMY_SP, From 9a2126f6f96292f9f165c138b760b41670192662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:39:13 +0900 Subject: [PATCH 058/105] fixup --- ecmascript/transforms/proposal/src/private_in_object.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 8e6e09857e8c..70d97d426c2b 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -255,7 +255,7 @@ impl VisitMut for PrivateInObject { let init_span = init.span(); let tmp = private_ident!("_tmp"); - self.vars.push(VarDeclarator { + self.cls.vars.push(VarDeclarator { span: DUMMY_SP, name: Pat::Ident(tmp.clone().into()), init: None, From c945bf0a82842b43ae5d37dff41fa4080a09fca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:39:47 +0900 Subject: [PATCH 059/105] Update test refs --- .../to-native-fields/static-field/output.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js index 588b3ad0b3c9..53c3f3f84ab3 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/static-field/output.js @@ -1,12 +1,7 @@ -var _temp; - -var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _tmp, _brand_check_foo = new WeakSet(); class Foo { - static #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); - - test(other) { - return _fooBrandCheck.has(other); - } - + static #foo = (_tmp = 1, _brand_check_foo.add(this), _tmp); + test(other) { + return _brand_check_foo.has(other); + } } From 33cc568729d26ee0bf44b7f73f8aeefd1979e467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 25 Aug 2021 12:40:05 +0900 Subject: [PATCH 060/105] Update test refs --- .../to-native-fields/field/output.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js index c0ea2596a758..276e50805ef1 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/field/output.js @@ -1,12 +1,7 @@ -var _temp; - -var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _tmp, _brand_check_foo = new WeakSet(); class Foo { - #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); - - test(other) { - return _fooBrandCheck.has(other); - } - + #foo = (_tmp = 1, _brand_check_foo.add(this), _tmp); + test(other) { + return _brand_check_foo.has(other); + } } From 6b0879f52b3323409d762bcbc36e568f1e1d9713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 15:49:27 +0900 Subject: [PATCH 061/105] We need lifetime --- .../transforms/proposal/src/private_in_object.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 70d97d426c2b..322464e41638 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -18,16 +18,18 @@ pub fn private_in_object() -> impl JsPass { } #[derive(Default)] -struct PrivateInObject { +struct PrivateInObject<'a> { vars: Vec, injected_vars: FxHashSet, - cls: ClassData, + cls: ClassData<'a>, cls_ident: Option, } #[derive(Default)] -struct ClassData { +struct ClassData<'a> { + parent: Option<&'a ClassData<'a>>, + vars: Vec, /// [Mark] for the current class. @@ -46,20 +48,20 @@ struct ClassData { names_used_for_brand_checks: FxHashSet, } -impl CompilerPass for PrivateInObject { +impl CompilerPass for PrivateInObject<'_> { fn name() -> Cow<'static, str> { Cow::Borrowed("private-in-object") } } -impl PrivateInObject { +impl PrivateInObject<'_> { fn var_name_for_brand_check(&self, n: &PrivateName) -> Ident { let span = n.span.apply_mark(self.cls.mark); Ident::new(format!("_brand_check_{}", n.id.sym).into(), span) } } -impl VisitMut for PrivateInObject { +impl VisitMut for PrivateInObject<'_> { noop_visit_mut_type!(); fn visit_mut_class(&mut self, n: &mut Class) { From c470ce9ff27ed102cf678e11162f34365a633f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 15:51:42 +0900 Subject: [PATCH 062/105] Revert "We need lifetime" This reverts commit a24794729c2a97a066b89debd97c28bf18f8b82a. --- .../transforms/proposal/src/private_in_object.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 322464e41638..70d97d426c2b 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -18,18 +18,16 @@ pub fn private_in_object() -> impl JsPass { } #[derive(Default)] -struct PrivateInObject<'a> { +struct PrivateInObject { vars: Vec, injected_vars: FxHashSet, - cls: ClassData<'a>, + cls: ClassData, cls_ident: Option, } #[derive(Default)] -struct ClassData<'a> { - parent: Option<&'a ClassData<'a>>, - +struct ClassData { vars: Vec, /// [Mark] for the current class. @@ -48,20 +46,20 @@ struct ClassData<'a> { names_used_for_brand_checks: FxHashSet, } -impl CompilerPass for PrivateInObject<'_> { +impl CompilerPass for PrivateInObject { fn name() -> Cow<'static, str> { Cow::Borrowed("private-in-object") } } -impl PrivateInObject<'_> { +impl PrivateInObject { fn var_name_for_brand_check(&self, n: &PrivateName) -> Ident { let span = n.span.apply_mark(self.cls.mark); Ident::new(format!("_brand_check_{}", n.id.sym).into(), span) } } -impl VisitMut for PrivateInObject<'_> { +impl VisitMut for PrivateInObject { noop_visit_mut_type!(); fn visit_mut_class(&mut self, n: &mut Class) { From 146112d79c781b54dc37dd018bf1dde88f558116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:24:43 +0900 Subject: [PATCH 063/105] WIP: Common interface --- .../proposal/src/private_in_object.rs | 70 +++++++++++++++---- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 70d97d426c2b..b9a643f85f46 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -17,6 +17,56 @@ pub fn private_in_object() -> impl JsPass { as_folder(PrivateInObject::default()) } +#[derive(Debug)] +enum Mode { + ClassExpr { + vars: Vec, + init_exprs: Vec>, + }, + ClassDecl { + vars: Vec, + }, +} + +impl Default for Mode { + fn default() -> Self { + Self::ClassDecl { + vars: Default::default(), + } + } +} + +impl Mode { + fn push_var(&mut self, n: Ident, init: Option>) { + match self { + Mode::ClassExpr { vars, init_exprs } => { + vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(n.clone().into()), + init: None, + definite: Default::default(), + }); + if let Some(init) = init { + init_exprs.push(Box::new(Expr::Assign(AssignExpr { + span: DUMMY_SP, + op: op!("="), + left: PatOrExpr::Pat(Box::new(Pat::Ident(n.into()))), + right: init, + }))); + } + } + Mode::ClassDecl { vars } => { + vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(n.into()), + init, + definite: Default::default(), + }); + } + } + } +} + #[derive(Default)] struct PrivateInObject { vars: Vec, @@ -28,7 +78,7 @@ struct PrivateInObject { #[derive(Default)] struct ClassData { - vars: Vec, + vars: Mode, /// [Mark] for the current class. /// @@ -180,17 +230,15 @@ impl VisitMut for PrivateInObject { let var_name = self.var_name_for_brand_check(&left); if self.injected_vars.insert(var_name.to_id()) { - self.cls.vars.push(VarDeclarator { - span: DUMMY_SP, - name: Pat::Ident(var_name.clone().into()), - init: Some(Box::new(Expr::New(NewExpr { + self.cls.vars.push_var( + var_name.clone(), + Some(Box::new(Expr::New(NewExpr { span: DUMMY_SP, callee: Box::new(Expr::Ident(quote_ident!("WeakSet"))), args: Some(Default::default()), type_args: Default::default(), }))), - definite: Default::default(), - }); + ); if is_method { self.cls @@ -255,12 +303,8 @@ impl VisitMut for PrivateInObject { let init_span = init.span(); let tmp = private_ident!("_tmp"); - self.cls.vars.push(VarDeclarator { - span: DUMMY_SP, - name: Pat::Ident(tmp.clone().into()), - init: None, - definite: Default::default(), - }); + + self.cls.vars.push_var(tmp.clone(), None); let assign = Box::new(Expr::Assign(AssignExpr { span: DUMMY_SP, From fc7e4e0012957bc2ac47b3c0592589cd9a85d1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:32:15 +0900 Subject: [PATCH 064/105] Move some duplicates --- .../proposal/src/private_in_object.rs | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index b9a643f85f46..998f9b3f327f 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -72,12 +72,12 @@ struct PrivateInObject { vars: Vec, injected_vars: FxHashSet, cls: ClassData, - - cls_ident: Option, } #[derive(Default)] struct ClassData { + ident: Option, + vars: Mode, /// [Mark] for the current class. @@ -113,10 +113,6 @@ impl VisitMut for PrivateInObject { noop_visit_mut_type!(); fn visit_mut_class(&mut self, n: &mut Class) { - let old_cls = take(&mut self.cls); - - self.cls.mark = Mark::fresh(Mark::root()); - { n.visit_children_with(&mut ClassAnalyzer { brand_check_names: &mut self.cls.names_used_for_brand_checks, @@ -174,30 +170,39 @@ impl VisitMut for PrivateInObject { } } } - - self.vars.extend(take(&mut self.cls.vars)); - - self.cls = old_cls; } fn visit_mut_class_decl(&mut self, n: &mut ClassDecl) { - let old_cls_ident = take(&mut self.cls_ident); - self.cls_ident = Some(n.ident.clone()); + let old_cls = take(&mut self.cls); + + self.cls.mark = Mark::fresh(Mark::root()); + self.cls.ident = Some(n.ident.clone()); + self.cls.vars = Mode::ClassDecl { + vars: Default::default(), + }; n.visit_mut_children_with(self); - self.cls_ident = old_cls_ident; + self.vars.extend(take(&mut self.cls.vars)); + + self.cls = old_cls; } fn visit_mut_class_expr(&mut self, n: &mut ClassExpr) { - let old_cls_ident = take(&mut self.cls_ident); + let old_cls = take(&mut self.cls); - let i = n.ident.get_or_insert_with(|| private_ident!("_class")); - self.cls_ident = Some(i.clone()); + self.cls.mark = Mark::fresh(Mark::root()); + self.cls.ident = n.ident.clone(); + self.cls.vars = Mode::ClassExpr { + vars: Default::default(), + init_exprs: Default::default(), + }; n.visit_mut_children_with(self); - self.cls_ident = old_cls_ident; + self.vars.extend(take(&mut self.cls.vars)); + + self.cls = old_cls; } fn visit_mut_expr(&mut self, e: &mut Expr) { @@ -215,7 +220,7 @@ impl VisitMut for PrivateInObject { let is_static = self.cls.statics.contains(&left.id.sym); let is_method = self.cls.methods.contains(&left.id.sym); - if let Some(cls_ident) = self.cls_ident.clone() { + if let Some(cls_ident) = self.cls.ident.clone() { if is_static && is_method { *e = Expr::Bin(BinExpr { span: *span, From b06bb24cbc8d8a372350c5523457f45b2b8dc3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:36:18 +0900 Subject: [PATCH 065/105] WIP: prepend_exprs --- .../proposal/src/private_in_object.rs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 998f9b3f327f..ed6b9017cbb1 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -70,6 +70,8 @@ impl Mode { #[derive(Default)] struct PrivateInObject { vars: Vec, + prepend_exprs: Vec>, + injected_vars: FxHashSet, cls: ClassData, } @@ -183,7 +185,14 @@ impl VisitMut for PrivateInObject { n.visit_mut_children_with(self); - self.vars.extend(take(&mut self.cls.vars)); + match &mut self.cls.vars { + Mode::ClassDecl { vars } => { + self.vars.extend(take(vars)); + } + _ => { + unreachable!() + } + } self.cls = old_cls; } @@ -200,7 +209,15 @@ impl VisitMut for PrivateInObject { n.visit_mut_children_with(self); - self.vars.extend(take(&mut self.cls.vars)); + match &mut self.cls.vars { + Mode::ClassExpr { vars, init_exprs } => { + self.vars.extend(take(vars)); + self.prepend_exprs.extend(take(init_exprs)); + } + _ => { + unreachable!() + } + } self.cls = old_cls; } From 4f7345ca3ba8741401ed001535534d09a093206c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:39:39 +0900 Subject: [PATCH 066/105] Handle prepend_exprs --- .../proposal/src/private_in_object.rs | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index ed6b9017cbb1..c4027a69e00c 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -1,5 +1,8 @@ use fxhash::FxHashSet; -use std::{borrow::Cow, mem::take}; +use std::{ + borrow::Cow, + mem::{replace, take}, +}; use swc_atoms::JsWord; use swc_common::{pass::CompilerPass, Mark, Spanned, DUMMY_SP}; use swc_ecma_ast::*; @@ -223,8 +226,28 @@ impl VisitMut for PrivateInObject { } fn visit_mut_expr(&mut self, e: &mut Expr) { + let prev_prepend_exprs = take(&mut self.prepend_exprs); + e.visit_mut_children_with(self); + let mut prepend_exprs = replace(&mut self.prepend_exprs, prev_prepend_exprs); + + if !prepend_exprs.is_empty() { + match e { + Expr::Seq(e) => { + e.exprs = prepend_exprs.into_iter().chain(e.exprs.take()).collect(); + } + _ => { + prepend_exprs.push(Box::new(e.take())); + *e = Expr::Seq(SeqExpr { + span: DUMMY_SP, + exprs: prepend_exprs, + }); + } + } + return; + } + match e { Expr::Bin(BinExpr { span, From e9ba2234fa1a413f71e405ffb877db3fd17631b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:40:23 +0900 Subject: [PATCH 067/105] Update test refs --- .../class-expression-instance/output.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js index 164117087063..9c0e54e274e3 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-instance/output.js @@ -1,12 +1,9 @@ function fn() { - var _privBrandCheck; - - return new (_privBrandCheck = /*#__PURE__*/new WeakSet(), class { - #priv = void _privBrandCheck.add(this); - - method(obj) { - return _privBrandCheck.has(obj); - } - - })(); + var _brand_check_priv; + return new (_brand_check_priv = new WeakSet(), class { + #priv = void _brand_check_priv.add(this); + method(obj) { + return _brand_check_priv.has(obj); + } + }); } From dfa172853a763ba5d558ef0487d5cb640b087bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:40:41 +0900 Subject: [PATCH 068/105] Update test refs --- .../class-expression-static/output.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js index ff0e5b1a6548..69813ccd04d9 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-static/output.js @@ -1,12 +1,9 @@ function fn() { - var _privBrandCheck; - - return new (_privBrandCheck = /*#__PURE__*/new WeakSet(), class { - static #priv = void _privBrandCheck.add(this); - - method(obj) { - return _privBrandCheck.has(obj); - } - - })(); + var _brand_check_priv; + return new (_brand_check_priv = new WeakSet(), class { + static #priv = void _brand_check_priv.add(this); + method(obj) { + return _brand_check_priv.has(obj); + } + }); } From cc3fa10b220f8821d7bbabbcb27f8d07a4920b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:43:01 +0900 Subject: [PATCH 069/105] Deps --- Cargo.lock | 1 + ecmascript/transforms/proposal/Cargo.toml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e26e4a6086f7..7b6bc87a2805 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2871,6 +2871,7 @@ dependencies = [ "swc_ecma_transforms_base", "swc_ecma_transforms_classes", "swc_ecma_transforms_compat", + "swc_ecma_transforms_macros", "swc_ecma_transforms_module", "swc_ecma_transforms_testing", "swc_ecma_utils", diff --git a/ecmascript/transforms/proposal/Cargo.toml b/ecmascript/transforms/proposal/Cargo.toml index ed9e5c5ecf49..363244eee380 100644 --- a/ecmascript/transforms/proposal/Cargo.toml +++ b/ecmascript/transforms/proposal/Cargo.toml @@ -26,6 +26,7 @@ swc_ecma_loader = {version = "0.18.1", path = "../../loader", optional = true} swc_ecma_parser = {version = "0.70.2", path = "../../parser"} swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} swc_ecma_transforms_classes = {version = "0.17.1", path = "../classes"} +swc_ecma_transforms_macros = {version = "0.2.1", path = "../macros"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} @@ -34,4 +35,4 @@ serde_json = "1.0.66" swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} -testing = {version = "0.12.2", path = "../../../testing"} +testing = {version = "0.13.0", path = "../../../testing"} From 3d8d4de38a07d51f1941335a8fae72c67a6bfca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:47:50 +0900 Subject: [PATCH 070/105] Handle arrow body --- .../proposal/src/private_in_object.rs | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index c4027a69e00c..5d6a653cf774 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -6,7 +6,8 @@ use std::{ use swc_atoms::JsWord; use swc_common::{pass::CompilerPass, Mark, Spanned, DUMMY_SP}; use swc_ecma_ast::*; -use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass}; +use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass, perf::Check}; +use swc_ecma_transforms_macros::fast_path; use swc_ecma_utils::{ default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprExt, ExprFactory, Id, @@ -114,9 +115,32 @@ impl PrivateInObject { } } +#[fast_path(ShouldWork)] impl VisitMut for PrivateInObject { noop_visit_mut_type!(); + fn visit_mut_block_stmt_or_expr(&mut self, e: &mut BlockStmtOrExpr) { + // Thanks to #[fast_path], we are sure that `e` contains a brand check. + + match e { + BlockStmtOrExpr::BlockStmt(e) => { + e.visit_mut_with(self); + } + BlockStmtOrExpr::Expr(expr) => { + let ret = Stmt::Return(ReturnStmt { + span: DUMMY_SP, + arg: Some(expr.take()), + }); + let mut bs = BlockStmt { + span: DUMMY_SP, + stmts: vec![ret], + }; + bs.visit_mut_with(self); + *e = BlockStmtOrExpr::BlockStmt(bs); + } + } + } + fn visit_mut_class(&mut self, n: &mut Class) { { n.visit_children_with(&mut ClassAnalyzer { @@ -443,3 +467,27 @@ impl Visit for ClassAnalyzer<'_> { /// Noop fn visit_class(&mut self, n: &Class, _: &dyn Node) {} } + +#[derive(Default)] +struct ShouldWork { + found: bool, +} + +impl Check for ShouldWork { + fn should_handle(&self) -> bool { + self.found + } +} + +impl Visit for ShouldWork { + noop_visit_type!(); + + fn visit_bin_expr(&mut self, e: &BinExpr, _: &dyn Node) { + if e.op == op!("in") && e.left.is_private_name() { + self.found = true; + return; + } + + e.visit_children_with(self); + } +} From 2a0989897eddb568b5fd7b4b74ce187a98b865d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:49:29 +0900 Subject: [PATCH 071/105] Revert wrong code --- .../proposal/src/private_in_object.rs | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 5d6a653cf774..2b395eaca488 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -119,28 +119,6 @@ impl PrivateInObject { impl VisitMut for PrivateInObject { noop_visit_mut_type!(); - fn visit_mut_block_stmt_or_expr(&mut self, e: &mut BlockStmtOrExpr) { - // Thanks to #[fast_path], we are sure that `e` contains a brand check. - - match e { - BlockStmtOrExpr::BlockStmt(e) => { - e.visit_mut_with(self); - } - BlockStmtOrExpr::Expr(expr) => { - let ret = Stmt::Return(ReturnStmt { - span: DUMMY_SP, - arg: Some(expr.take()), - }); - let mut bs = BlockStmt { - span: DUMMY_SP, - stmts: vec![ret], - }; - bs.visit_mut_with(self); - *e = BlockStmtOrExpr::BlockStmt(bs); - } - } - } - fn visit_mut_class(&mut self, n: &mut Class) { { n.visit_children_with(&mut ClassAnalyzer { From 088a94dac112e26b35865e6b7f3f53c74bdb6a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:51:38 +0900 Subject: [PATCH 072/105] Fix fast path --- ecmascript/transforms/proposal/src/private_in_object.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 2b395eaca488..b71e4a25b16a 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -468,4 +468,12 @@ impl Visit for ShouldWork { e.visit_children_with(self); } + + fn visit_private_method(&mut self, _: &PrivateMethod, _: &dyn Node) { + self.found = true; + } + + fn visit_private_prop(&mut self, _: &PrivateProp, _: &dyn Node) { + self.found = true; + } } From f9d9c1be72e10520eddfeb97daca75973e3825c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 16:55:35 +0900 Subject: [PATCH 073/105] Update test refs --- .../half-constructed-static/output.js | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js index 5a318b582285..6dd51a8d8811 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-static/output.js @@ -1,23 +1,14 @@ -var _temp, _temp2; - -var _xBrandCheck = /*#__PURE__*/new WeakSet(); - -var _yBrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_x = new WeakSet(), _brand_check_y = new WeakSet(), _tmp, _tmp1; class F { - static m() { - _xBrandCheck.has(this); - - _yBrandCheck.has(this); - - F === this; - } - - static #x = (_temp = 0, _xBrandCheck.add(this), _temp); - static #y = (_temp2 = (() => { - throw 'error'; - })(), _yBrandCheck.add(this), _temp2); - - static #z() {} - + static m() { + _brand_check_x.has(this); + _brand_check_y.has(this); + F === this; + } + static #x = (_tmp = 0, _brand_check_x.add(this), _tmp); + static #y = (_tmp1 = (()=>{ + throw "error"; + })(), _brand_check_y.add(this), _tmp1); + static #z() { + } } From 562c4202962ac1b946f49a835a50c63fe8763d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 17:35:10 +0900 Subject: [PATCH 074/105] codegen: Pat::Invalid --- ecmascript/codegen/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ecmascript/codegen/src/lib.rs b/ecmascript/codegen/src/lib.rs index 35683577fcf2..281c7c9d5531 100644 --- a/ecmascript/codegen/src/lib.rs +++ b/ecmascript/codegen/src/lib.rs @@ -1964,6 +1964,7 @@ impl<'a> Emitter<'a> { #[emitter] fn emit_pat(&mut self, node: &Pat) -> Result { match node { + match &*node { Pat::Array(ref n) => emit!(n), Pat::Assign(ref n) => emit!(n), Pat::Expr(ref n) => emit!(n), From fe7e9633c565f2655be5e1d15b416cbfadb2eee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 17:37:58 +0900 Subject: [PATCH 075/105] Fix fixer --- ecmascript/transforms/base/src/fixer.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ecmascript/transforms/base/src/fixer.rs b/ecmascript/transforms/base/src/fixer.rs index 49f19c8c7367..d6101bbf2ddb 100644 --- a/ecmascript/transforms/base/src/fixer.rs +++ b/ecmascript/transforms/base/src/fixer.rs @@ -115,6 +115,17 @@ impl VisitMut for Fixer<'_> { } } + fn visit_mut_assign_pat(&mut self, node: &mut AssignPat) { + node.visit_mut_children_with(self); + + match &*node.right { + Expr::Seq(..) => { + self.wrap(&mut *node.right); + } + _ => {} + } + } + fn visit_mut_assign_pat_prop(&mut self, node: &mut AssignPatProp) { node.key.visit_mut_children_with(self); From d360d2b200b1f224596d664dc468fc6fc2885e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 17:41:02 +0900 Subject: [PATCH 076/105] Handle default pat --- .../proposal/src/private_in_object.rs | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index b71e4a25b16a..0ef6e0becba4 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -123,6 +123,7 @@ impl VisitMut for PrivateInObject { { n.visit_children_with(&mut ClassAnalyzer { brand_check_names: &mut self.cls.names_used_for_brand_checks, + ignore_class: true, }) } @@ -227,6 +228,49 @@ impl VisitMut for PrivateInObject { self.cls = old_cls; } + fn visit_mut_assign_pat(&mut self, p: &mut AssignPat) { + p.left.visit_mut_with(self); + + { + let mut buf = FxHashSet::default(); + let mut v = ClassAnalyzer { + brand_check_names: &mut buf, + ignore_class: false, + }; + p.right.visit_with(p, &mut v); + + if buf.is_empty() { + p.right.visit_mut_with(self); + } else { + let mut bs = BlockStmt { + span: DUMMY_SP, + stmts: vec![], + }; + bs.stmts.push(Stmt::Return(ReturnStmt { + span: DUMMY_SP, + arg: Some(p.right.take()), + })); + bs.visit_mut_with(self); + + p.right = Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee: ArrowExpr { + span: DUMMY_SP, + params: Default::default(), + body: BlockStmtOrExpr::BlockStmt(bs), + is_async: false, + is_generator: false, + type_params: Default::default(), + return_type: Default::default(), + } + .as_callee(), + args: Default::default(), + type_args: Default::default(), + })); + } + } + } + fn visit_mut_expr(&mut self, e: &mut Expr) { let prev_prepend_exprs = take(&mut self.prepend_exprs); @@ -423,6 +467,7 @@ impl VisitMut for PrivateInObject { struct ClassAnalyzer<'a> { brand_check_names: &'a mut FxHashSet, + ignore_class: bool, } impl Visit for ClassAnalyzer<'_> { @@ -443,7 +488,13 @@ impl Visit for ClassAnalyzer<'_> { } /// Noop - fn visit_class(&mut self, n: &Class, _: &dyn Node) {} + fn visit_class(&mut self, n: &Class, _: &dyn Node) { + if self.ignore_class { + return; + } + + n.visit_children_with(self); + } } #[derive(Default)] From 3a8ab0b86b56bc93cd73ffd6b9571fe4185cad9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 30 Aug 2021 17:41:29 +0900 Subject: [PATCH 077/105] Update test refs --- .../output.js | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js index 79443544a14d..d7b1e8831735 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/class-expression-in-default-param/output.js @@ -1,12 +1,10 @@ -(x = (() => { - var _fooBrandCheck; - - return _fooBrandCheck = /*#__PURE__*/new WeakSet(), class { - #foo = void _fooBrandCheck.add(this); - - test(other) { - return _fooBrandCheck.has(other); - } - - }; -})()) => {}; +(x = (()=>{ + var _brand_check_foo; + return _brand_check_foo = new WeakSet(), class { + #foo = void _brand_check_foo.add(this); + test(other) { + return _brand_check_foo.has(other); + } + }; +})())=>{ +}; From 97665a83e95d2f295bbe0e5a524b06b262e0d1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Thu, 9 Sep 2021 14:28:14 +0900 Subject: [PATCH 078/105] Fix codegen --- ecmascript/codegen/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/ecmascript/codegen/src/lib.rs b/ecmascript/codegen/src/lib.rs index 281c7c9d5531..35683577fcf2 100644 --- a/ecmascript/codegen/src/lib.rs +++ b/ecmascript/codegen/src/lib.rs @@ -1964,7 +1964,6 @@ impl<'a> Emitter<'a> { #[emitter] fn emit_pat(&mut self, node: &Pat) -> Result { match node { - match &*node { Pat::Array(ref n) => emit!(n), Pat::Assign(ref n) => emit!(n), Pat::Expr(ref n) => emit!(n), From 8a91a15f036a9347460c0a77a5501c2b4f34f265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Thu, 9 Sep 2021 14:29:26 +0900 Subject: [PATCH 079/105] fixup --- .../compat/src/es2020/class_properties/private_field.rs | 4 ++-- ecmascript/transforms/proposal/src/private_in_object.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index b453a140afe1..12f425eb3fa2 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -1,10 +1,10 @@ use fxhash::FxHashSet; use std::{iter, mem}; use swc_atoms::JsWord; -use swc_common::{Mark, Spanned, SyntaxContext, DUMMY_SP}; +use swc_common::{util::take::Take, Mark, Spanned, SyntaxContext, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{ - ext::{AsOptExpr, MapWithMut, PatOrExprExt}, + ext::{AsOptExpr, PatOrExprExt}, helper, }; use swc_ecma_utils::{alias_ident_for, alias_if_required, prepend, quote_ident, ExprFactory}; diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 0ef6e0becba4..b2729707d9f5 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -4,9 +4,9 @@ use std::{ mem::{replace, take}, }; use swc_atoms::JsWord; -use swc_common::{pass::CompilerPass, Mark, Spanned, DUMMY_SP}; +use swc_common::{pass::CompilerPass, util::take::Take, Mark, Spanned, DUMMY_SP}; use swc_ecma_ast::*; -use swc_ecma_transforms_base::{ext::MapWithMut, pass::JsPass, perf::Check}; +use swc_ecma_transforms_base::{pass::JsPass, perf::Check}; use swc_ecma_transforms_macros::fast_path; use swc_ecma_utils::{ default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprExt, From 87d8ae7ce4475551d503ed2608f00b1ab869c023 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 13:52:12 +0900 Subject: [PATCH 080/105] Update test refs --- .../private/nested-class-other-redeclared/output.js | 6 +++--- .../tests/private-in-object/private/nested-class/output.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js index 8f498ec12716..ec96a83e2eb6 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class-other-redeclared/output.js @@ -2,7 +2,7 @@ let Foo = function() { "use strict"; function Foo() { _classCallCheck(this, Foo); - _foo.set(this, { + _foo1.set(this, { writable: true, value: 1 }); @@ -35,12 +35,12 @@ let Foo = function() { return Nested; }(); var _bar1 = new WeakMap(); - _foo.has(this); + _foo1.has(this); _bar.has(this); } } ]); return Foo; }(); -var _foo = new WeakMap(); +var _foo1 = new WeakMap(); var _bar = new WeakMap(); diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js index 48884ce30f17..778a02a02940 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/nested-class/output.js @@ -2,7 +2,7 @@ let Foo = function() { "use strict"; function Foo() { _classCallCheck(this, Foo); - _foo.set(this, { + _foo1.set(this, { writable: true, value: 1 }); @@ -25,10 +25,10 @@ let Foo = function() { ]); return Nested; }(); - _foo.has(this); + _foo1.has(this); } } ]); return Foo; }(); -var _foo = new WeakMap(); +var _foo1 = new WeakMap(); From 3655b36703fe50b173d7d914ba9277e6ead1f67a Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:05:28 +0900 Subject: [PATCH 081/105] static method --- .../compat/src/es2020/class_properties/mod.rs | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index a3b1a6ba81ca..a91ba2e79061 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -735,21 +735,23 @@ impl ClassProperties { }, ); - vars.push(VarDeclarator { - span: DUMMY_SP, - definite: false, - name: Pat::Ident(weak_coll_var.clone().into()), - init: Some(Box::new(Expr::from(NewExpr { + if should_use_map || !statics.contains(&method.key.id.sym) { + vars.push(VarDeclarator { span: DUMMY_SP, - callee: if should_use_map { - Box::new(Expr::Ident(quote_ident!("WeakMap"))) - } else { - Box::new(Expr::Ident(quote_ident!("WeakSet"))) - }, - args: Some(Default::default()), - type_args: Default::default(), - }))), - }); + definite: false, + name: Pat::Ident(weak_coll_var.clone().into()), + init: Some(Box::new(Expr::from(NewExpr { + span: DUMMY_SP, + callee: if should_use_map { + Box::new(Expr::Ident(quote_ident!("WeakMap"))) + } else { + Box::new(Expr::Ident(quote_ident!("WeakSet"))) + }, + args: Some(Default::default()), + type_args: Default::default(), + }))), + }); + } if should_use_map { let get = PropOrSpread::Prop(Box::new(Prop::KeyValue(KeyValueProp { @@ -790,7 +792,7 @@ impl ClassProperties { args: vec![ThisExpr { span: DUMMY_SP }.as_arg(), obj], type_args: Default::default(), }))); - } else { + } else if !statics.contains(&method.key.id.sym) { // Add `_get.add(this);` to the constructor where `_get` is the name of the // weak set. constructor_exprs.push(Box::new(Expr::Call(CallExpr { From 7ee70460657f1a00d02ca505f62864dfb301e777 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:05:32 +0900 Subject: [PATCH 082/105] Update test refs --- .../private/static-method/output.js | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js index efde0032c540..ad67bc487a01 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-method/output.js @@ -1,17 +1,17 @@ -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return other === Foo; +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return other === Foo; + } + } + ]); + return Foo; }(); - -function _foo() {} +function foo() { +} From f192457519cf8b3567ef7e984a12209da41a40eb Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:10:38 +0900 Subject: [PATCH 083/105] Class properties is done --- .../transforms/compat/src/es2020/class_properties/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index a91ba2e79061..a1999c7e3e2b 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -721,7 +721,8 @@ impl ClassProperties { let should_use_map = matches!(method.kind, MethodKind::Getter | MethodKind::Setter) - && names_used_for_brand_checks.contains(&method.key.id.sym); + && names_used_for_brand_checks.contains(&method.key.id.sym) + && !statics.contains(&method.key.id.sym); let weak_coll_var = Ident::new( format!("_{}", method.key.id.sym).into(), From dc4727fee99462331c5b89cf2149ea194c75e361 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:10:43 +0900 Subject: [PATCH 084/105] Update test refs --- .../private/static-accessor/output.js | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js index 810276221b74..ad67bc487a01 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/private/static-accessor/output.js @@ -1,22 +1,17 @@ -let Foo = /*#__PURE__*/function () { - "use strict"; - - function Foo() { - babelHelpers.classCallCheck(this, Foo); - } - - babelHelpers.createClass(Foo, [{ - key: "test", - value: function test(other) { - return other === Foo; +let Foo = function() { + "use strict"; + function Foo() { + _classCallCheck(this, Foo); } - }]); - return Foo; + _createClass(Foo, [ + { + key: "test", + value: function test(other) { + return other === Foo; + } + } + ]); + return Foo; }(); - -function _get_foo() {} - -var _foo = { - get: _get_foo, - set: void 0 -}; +function foo() { +} From 36bf01de4433777d7caa80b8f41d748e5295a0de Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:31:02 +0900 Subject: [PATCH 085/105] Remove typescript_class_properties --- .../compat/src/es2020/class_properties/mod.rs | 222 +++++------------- .../transforms/compat/src/es2020/mod.rs | 20 +- 2 files changed, 69 insertions(+), 173 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index a1999c7e3e2b..a46304de610f 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -4,8 +4,8 @@ use self::{ this_in_static::ThisInStaticFolder, used_name::UsedNameCollector, }; -use std::{collections::HashSet, mem::take}; -use swc_common::{util::move_map::MoveMap, Mark, Spanned, SyntaxContext, DUMMY_SP}; +use std::collections::HashSet; +use swc_common::{Mark, Spanned, SyntaxContext, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_transforms_base::{helper, perf::Check}; use swc_ecma_transforms_classes::super_field::SuperFieldAccessFolder; @@ -30,27 +30,22 @@ mod used_name; /// # Impl note /// /// We use custom helper to handle export default class -pub fn class_properties() -> impl Fold { +pub fn class_properties(config: Config) -> impl Fold { ClassProperties { - typescript: false, + config, mark: Mark::root(), method_mark: Mark::root(), } } -/// Class properties pass for the typescript. -#[deprecated = "The logic is merged into typescript::strip"] -pub fn typescript_class_properties() -> impl Fold { - ClassProperties { - typescript: true, - mark: Mark::root(), - method_mark: Mark::root(), - } +#[derive(Debug, Clone, Default)] +pub struct Config { + pub loose: bool, } #[derive(Clone)] struct ClassProperties { - typescript: bool, + config: Config, mark: Mark, method_mark: Mark, } @@ -433,56 +428,43 @@ impl ClassProperties { ); } - let key = if self.typescript { - // `b` in - // - // class A { - // b = 'foo'; - // } - prop.key - } else { - match *prop.key { - Expr::Ident(ref i) if !prop.computed => { - Box::new(Expr::from(Lit::Str(Str { - span: i.span, - value: i.sym.clone(), - has_escape: false, - kind: StrKind::Normal { - contains_quote: false, - }, - }))) - } - Expr::Lit(ref lit) if !prop.computed => { - Box::new(Expr::from(lit.clone())) - } + let key = match *prop.key { + Expr::Ident(ref i) if !prop.computed => { + Box::new(Expr::from(Lit::Str(Str { + span: i.span, + value: i.sym.clone(), + has_escape: false, + kind: StrKind::Normal { + contains_quote: false, + }, + }))) + } + Expr::Lit(ref lit) if !prop.computed => Box::new(Expr::from(lit.clone())), - _ => { - let (ident, aliased) = if let Expr::Ident(ref i) = *prop.key { - if used_key_names.contains(&i.sym) { - (alias_ident_for(&prop.key, "_ref"), true) - } else { - alias_if_required(&prop.key, "_ref") - } + _ => { + let (ident, aliased) = if let Expr::Ident(ref i) = *prop.key { + if used_key_names.contains(&i.sym) { + (alias_ident_for(&prop.key, "_ref"), true) } else { alias_if_required(&prop.key, "_ref") - }; - // ident.span = ident.span.apply_mark(Mark::fresh(Mark::root())); - if aliased { - // Handle computed property - vars.push(VarDeclarator { - span: DUMMY_SP, - name: Pat::Ident(ident.clone().into()), - init: Some(prop.key), - definite: false, - }); } - Box::new(Expr::from(ident)) + } else { + alias_if_required(&prop.key, "_ref") + }; + // ident.span = ident.span.apply_mark(Mark::fresh(Mark::root())); + if aliased { + // Handle computed property + vars.push(VarDeclarator { + span: DUMMY_SP, + name: Pat::Ident(ident.clone().into()), + init: Some(prop.key), + definite: false, + }); } + Box::new(Expr::from(ident)) } }; - let assigned_value = prop.value.is_some(); - let value = prop.value.unwrap_or_else(|| undefined(prop_span)); let value = if prop.is_static { value @@ -503,70 +485,29 @@ impl ClassProperties { value }; - if self.typescript { - if prop.is_static { - extra_stmts.push( - AssignExpr { - span: DUMMY_SP, - left: PatOrExpr::Expr(Box::new( - MemberExpr { - span: DUMMY_SP, - obj: ident.clone().as_obj(), - computed: prop.computed, - prop: key, - } - .into(), - )), - op: op!("="), - right: value, - } - .into_stmt(), - ); - } else if assigned_value { - constructor_exprs.push(Box::new(Expr::Assign(AssignExpr { - span: DUMMY_SP, - left: (PatOrExpr::Expr(Box::new( - MemberExpr { - span: DUMMY_SP, - obj: ThisExpr { span: DUMMY_SP }.as_obj(), - computed: prop.computed, - prop: key, - } - .into(), - ))), - op: op!("="), - right: value, - }))); - } - } else { - let callee = helper!(define_property, "defineProperty"); + let callee = helper!(define_property, "defineProperty"); - if prop.is_static { - extra_stmts.push( - CallExpr { - span: DUMMY_SP, - callee, - args: vec![ - ident.clone().as_arg(), - key.as_arg(), - value.as_arg(), - ], - type_args: Default::default(), - } - .into_stmt(), - ) - } else { - constructor_exprs.push(Box::new(Expr::Call(CallExpr { + if prop.is_static { + extra_stmts.push( + CallExpr { span: DUMMY_SP, callee, - args: vec![ - ThisExpr { span: DUMMY_SP }.as_arg(), - key.as_arg(), - value.as_arg(), - ], + args: vec![ident.clone().as_arg(), key.as_arg(), value.as_arg()], type_args: Default::default(), - }))); - } + } + .into_stmt(), + ) + } else { + constructor_exprs.push(Box::new(Expr::Call(CallExpr { + span: DUMMY_SP, + callee, + args: vec![ + ThisExpr { span: DUMMY_SP }.as_arg(), + key.as_arg(), + value.as_arg(), + ], + type_args: Default::default(), + }))); } } ClassMember::PrivateProp(prop) => { @@ -656,56 +597,7 @@ impl ClassProperties { }))); } - ClassMember::Constructor(mut c) => { - if self.typescript { - let store = |i: &Ident| { - Box::new( - AssignExpr { - span: DUMMY_SP, - left: PatOrExpr::Expr(Box::new(Expr::Member(MemberExpr { - span: DUMMY_SP, - obj: ThisExpr { span: DUMMY_SP }.as_obj(), - computed: false, - prop: Box::new(i.clone().into()), - }))), - op: op!("="), - right: Box::new(i.clone().into()), - } - .into(), - ) - }; - - c.params = c.params.move_map(|mut param| match &mut param { - ParamOrTsParamProp::TsParamProp(p) => match &p.param { - TsParamPropParam::Ident(i) => { - typescript_constructor_properties.push(store(&i.id)); - ParamOrTsParamProp::Param(Param { - span: p.span, - decorators: take(&mut p.decorators), - pat: Pat::Ident(i.clone().into()), - }) - } - TsParamPropParam::Assign(pat) => match &*pat.left { - Pat::Ident(i) => { - typescript_constructor_properties.push(store(&i.id)); - ParamOrTsParamProp::Param(Param { - span: p.span, - decorators: take(&mut p.decorators), - pat: Pat::Assign(AssignPat { - span: DUMMY_SP, - left: pat.left.clone(), - right: pat.right.clone(), - type_ann: None, - }), - }) - } - _ => param, - }, - }, - ParamOrTsParamProp::Param(_) => param, - }); - } - + ClassMember::Constructor(c) => { constructor = Some(c); } diff --git a/ecmascript/transforms/compat/src/es2020/mod.rs b/ecmascript/transforms/compat/src/es2020/mod.rs index f865dddc3550..1f4d01b7474d 100644 --- a/ecmascript/transforms/compat/src/es2020/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/mod.rs @@ -1,23 +1,27 @@ -#[allow(deprecated)] pub use self::{ - class_properties::{class_properties, typescript_class_properties}, - export_namespace_from::export_namespace_from, - nullish_coalescing::nullish_coalescing, - opt_chaining::optional_chaining, + class_properties::class_properties, export_namespace_from::export_namespace_from, + nullish_coalescing::nullish_coalescing, opt_chaining::optional_chaining, }; use swc_common::chain; use swc_ecma_visit::Fold; -mod class_properties; +pub mod class_properties; mod export_namespace_from; mod nullish_coalescing; mod opt_chaining; -pub fn es2020() -> impl Fold { +pub fn es2020(config: Config) -> impl Fold { chain!( nullish_coalescing(), optional_chaining(), - class_properties(), + class_properties(class_properties::Config { + loose: config.loose + }), export_namespace_from(), ) } + +#[derive(Debug, Clone, Default)] +pub struct Config { + pub loose: bool, +} From 87bfbe721fd60ad2e398cc4aa8e26becda38926d Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:38:57 +0900 Subject: [PATCH 086/105] preset-env --- ecmascript/preset-env/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ecmascript/preset-env/src/lib.rs b/ecmascript/preset-env/src/lib.rs index e4102c4abaa0..8043755bc00d 100644 --- a/ecmascript/preset-env/src/lib.rs +++ b/ecmascript/preset-env/src/lib.rs @@ -96,7 +96,11 @@ where let pass = add!(pass, NullishCoalescing, es2020::nullish_coalescing()); let pass = add!(pass, OptionalChaining, es2020::optional_chaining()); - let pass = add!(pass, ClassProperties, es2020::class_properties()); + let pass = add!( + pass, + ClassProperties, + es2020::class_properties(es2020::class_properties::Config { loose }) + ); // ES2019 let pass = add!(pass, OptionalCatchBinding, es2019::optional_catch_binding()); From 74ecccc5aeb9f2f87e23a519aad3bf40fdde530e Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:39:09 +0900 Subject: [PATCH 087/105] tests --- .../transforms/compat/tests/es2015_classes.rs | 15 +- .../compat/tests/es2015_regenerator.rs | 2 +- .../compat/tests/es2017_async_to_generator.rs | 10 +- .../compat/tests/es2020_class_properties.rs | 311 ++++++++---------- .../transforms/optimization/tests/simplify.rs | 2 +- 5 files changed, 164 insertions(+), 176 deletions(-) diff --git a/ecmascript/transforms/compat/tests/es2015_classes.rs b/ecmascript/transforms/compat/tests/es2015_classes.rs index befa9ed8ba1c..63ff437c7063 100644 --- a/ecmascript/transforms/compat/tests/es2015_classes.rs +++ b/ecmascript/transforms/compat/tests/es2015_classes.rs @@ -6324,7 +6324,7 @@ test!( let global_mark = Mark::fresh(Mark::root()); chain!( - es2020::es2020(), + es2020::es2020(es2020::Config { loose: false }), es2018::es2018(), es2017::es2017(), es2016::es2016(), @@ -6365,7 +6365,7 @@ test!( let global_mark = Mark::fresh(Mark::root()); chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), es2015::es2015( global_mark, Some(t.comments.clone()), @@ -6448,7 +6448,7 @@ test!( let global_mark = Mark::fresh(Mark::root()); chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), es2015::es2015( global_mark, Some(t.comments.clone()), @@ -6494,7 +6494,7 @@ test!( let global_mark = Mark::fresh(Mark::root()); chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), es2015::es2015( global_mark, Some(t.comments.clone()), @@ -6539,7 +6539,12 @@ fn exec(input: PathBuf) { let src = read_to_string(&input).unwrap(); compare_stdout( Default::default(), - |t| chain!(class_properties(), classes(Some(t.comments.clone()))), + |t| { + chain!( + class_properties(class_properties::Config { loose: false }), + classes(Some(t.comments.clone())) + ) + }, &src, ); } diff --git a/ecmascript/transforms/compat/tests/es2015_regenerator.rs b/ecmascript/transforms/compat/tests/es2015_regenerator.rs index 252f9840522e..9a1047e88db6 100644 --- a/ecmascript/transforms/compat/tests/es2015_regenerator.rs +++ b/ecmascript/transforms/compat/tests/es2015_regenerator.rs @@ -1410,7 +1410,7 @@ test!( let mark = Mark::fresh(Mark::root()); chain!( es2021(), - es2020(), + es2020(es2020::Config { loose: false }), es2018(), es2017(), es2016(), diff --git a/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs b/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs index 46d4331779c7..ea9deae87846 100644 --- a/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs +++ b/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs @@ -2289,7 +2289,10 @@ test!( test_exec!( Syntax::default(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), issue_1341_1_exec, " class A { @@ -2336,7 +2339,10 @@ test!( test_exec!( Syntax::default(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), issue_1341_2_exec, " class A { diff --git a/ecmascript/transforms/compat/tests/es2020_class_properties.rs b/ecmascript/transforms/compat/tests/es2020_class_properties.rs index 913d848ae39b..3655f1a8b031 100644 --- a/ecmascript/transforms/compat/tests/es2020_class_properties.rs +++ b/ecmascript/transforms/compat/tests/es2020_class_properties.rs @@ -8,7 +8,7 @@ use swc_ecma_transforms_compat::{ es2015::{arrow, block_scoping, classes, function_name, template_literal}, es2016::exponentation, es2017::async_to_generator, - es2020::{class_properties, typescript_class_properties}, + es2020::class_properties, es3::reserved_words, }; use swc_ecma_transforms_testing::{compare_stdout, test, test_exec, Tester}; @@ -32,7 +32,7 @@ fn tr(t: &Tester) -> impl Fold { chain!( resolver(), function_name(), - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping(), reserved_words(false), @@ -2816,7 +2816,10 @@ var _x = { test!( syntax(), - |_| chain!(resolver(), class_properties()), + |_| chain!( + resolver(), + class_properties(class_properties::Config { loose: false }) + ), issue_308, "function bar(props) {} class Foo { @@ -2846,7 +2849,7 @@ test!( syntax(), |t| chain!( resolver(), - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())) ), issue_342, @@ -2873,7 +2876,11 @@ let Foo = function Foo(bar) { test!( syntax(), - |_| chain!(resolver(), class_properties(), block_scoping()), + |_| chain!( + resolver(), + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), issue_443, " const MODE = 1; @@ -2898,7 +2905,10 @@ _defineProperty(foo, 'MODE', MODE);" // public_regression_t7364 test!( syntax(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), public_regression_t7364, r#" class MyClass { @@ -2951,7 +2961,10 @@ export default class MyClass3 { // private_regression_t6719 test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_regression_t6719, r#" function withContext(ComposedComponent) { @@ -3037,7 +3050,10 @@ function withContext(ComposedComponent) { // private_reevaluated test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_reevaluated, r#" function classFactory() { @@ -3101,7 +3117,10 @@ function classFactory() { // private_static test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_static, r#" class Foo { @@ -3148,7 +3167,7 @@ expect(Foo.test()).toBe("foo"); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -3190,7 +3209,10 @@ var _client = new WeakMap(); // private_static_inherited test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_static_inherited, r#" class Base { @@ -3269,7 +3291,7 @@ class Sub2 extends Base {} // private_destructuring_object_pattern_1_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), private_destructuring_object_pattern_1_exec, r#" class Foo { @@ -3296,7 +3318,10 @@ expect(foo.z).toBe('bar'); // private_static_undefined test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_static_undefined, r#" class Foo { @@ -3336,7 +3361,7 @@ var _bar = { test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -3373,7 +3398,10 @@ var _client = new WeakMap(); // private_regression_t2983 test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_regression_t2983, r#" call(class { @@ -3410,7 +3438,11 @@ export { _class as default } // private_regression_t7364 test!( syntax(), - |_| chain!(class_properties(), async_to_generator(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator(), + block_scoping() + ), private_regression_t7364, r#" class MyClass { @@ -3479,7 +3511,7 @@ export { MyClass3 as default }; test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -3517,7 +3549,7 @@ var _client = new WeakMap(); // regression_8882_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), regression_8882_exec, r#" const classes = []; @@ -3549,7 +3581,7 @@ for(let i=0; i<= 10; ++i) { //// regression_6154 //test!(syntax(),|_| tr("{ // "presets": ["env"], -// "plugins": class_properties() +// "plugins": class_properties(class_properties::Config { loose: false }) //} //"), regression_6154, r#" //class Test { @@ -3655,7 +3687,10 @@ for(let i=0; i<= 10; ++i) { // private_static_export test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_static_export, r#" export class MyClass { @@ -3686,7 +3721,10 @@ export { MyClass2 as default } // static_property_tdz_edgest_case test!( syntax(), - |t| chain!(class_properties(), classes(Some(t.comments.clone()))), + |t| chain!( + class_properties(class_properties::Config { loose: false }), + classes(Some(t.comments.clone())) + ), static_property_tdz_edgest_case, r#" class A { @@ -3713,7 +3751,10 @@ _defineProperty(A, _x, void 0); // regression_6153 test!( syntax(), - |_| chain!(class_properties(), arrow()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + arrow() + ), regression_6153, r#" () => { @@ -3818,7 +3859,10 @@ var qux = (function () { // regression_7371 test!( syntax(), - |_| chain!(class_properties(), arrow()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + arrow() + ), regression_7371, r#" "use strict"; @@ -4029,7 +4073,7 @@ new ComputedField(); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -4120,7 +4164,7 @@ var _y = new WeakMap(); // regression_8882 test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), regression_8882, r#" const classes = []; @@ -4173,7 +4217,7 @@ for(let i = 0; i <= 10; ++i){ test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -4209,7 +4253,7 @@ var _client = new WeakMap(); // public_static_super_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), public_static_super_exec, r#" class A { @@ -4235,7 +4279,7 @@ expect(getPropA()).toBe(1); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -4271,7 +4315,10 @@ var _client = new WeakMap(); // private_non_block_arrow_func test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_non_block_arrow_func, r#" export default param => @@ -4311,7 +4358,7 @@ export default ((param)=>{ // regression_8110 test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), regression_8110, r#" const field = Symbol('field'); @@ -4337,7 +4384,7 @@ class A{ // public_computed_without_block_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), public_computed_without_block_exec, r#" const createClass = (k) => class { [k()] = 2 }; @@ -4352,7 +4399,7 @@ expect(instance.foo).toBe(2); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), exponentation(), classes(Some(t.comments.clone())), block_scoping(), @@ -4384,7 +4431,10 @@ var _bar = new WeakMap(); // static_property_tdz_general test!( syntax(), - |t| chain!(class_properties(), classes(Some(t.comments.clone()))), + |t| chain!( + class_properties(class_properties::Config { loose: false }), + classes(Some(t.comments.clone())) + ), static_property_tdz_general, r#" class C { @@ -4409,7 +4459,10 @@ _defineProperty(C, _ref, 3); // public_native_classes test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), public_native_classes, r#" class Foo { @@ -4461,7 +4514,10 @@ test!( // Seems useless, while being hard to implement. ignore, syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_static_infer_name, r#" var Foo = class { @@ -4483,7 +4539,10 @@ var Foo = (_temp = _class = class Foo {}, _num = { // regression_7951 test!( syntax(), - |_| chain!(resolver(), class_properties()), + |_| chain!( + resolver(), + class_properties(class_properties::Config { loose: false }) + ), regression_7951, r#" export class Foo extends Bar { @@ -4509,7 +4568,10 @@ _defineProperty(Foo, "foo", {}); // private_native_classes test!( syntax(), - |_| chain!(class_properties(), block_scoping()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + block_scoping() + ), private_native_classes, r#" class Foo { @@ -4558,7 +4620,7 @@ var _bar = new WeakMap(); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -4584,7 +4646,7 @@ var createClass = (k)=>{ // private_destructuring_array_pattern_2_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), private_destructuring_array_pattern_2_exec, r#" class Foo { @@ -4610,7 +4672,7 @@ expect(foo.getClient()).toEqual(['bar', 'baz', 'quu']); test!( syntax(), |t| chain!( - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone())), block_scoping() ), @@ -4661,7 +4723,7 @@ _defineProperty(B, "getPropA", () => _get(_getPrototypeOf(B), "prop", B)); // private_destructuring_array_pattern_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), private_destructuring_array_pattern_exec, r#" class Foo { @@ -4685,7 +4747,7 @@ expect(foo.getClient()).toBe('bar'); // private_destructuring_array_pattern_1_exec test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), private_destructuring_array_pattern_1_exec, r#" class Foo { @@ -4709,113 +4771,12 @@ expect(foo.y).toBe('bar'); "# ); -test!( - syntax(), - |_| typescript_class_properties(), - issue_1122_1, - " -const identifier = 'bar'; - -class Foo { - [identifier] = 5; -} - - -", - " -const identifier = \"bar\"; -class Foo { - constructor(){ - this[identifier] = 5; - } -} - " -); - -test!( - syntax(), - |_| typescript_class_properties(), - issue_1122_2, - " -const identifier = 'bar'; - -class Foo { - identifier = 5; -} -", - " - const identifier = \"bar\"; - class Foo { - constructor(){ - this.identifier = 5; - } - } - " -); - -test!( - syntax(), - |_| typescript_class_properties(), - issue_1122_3, - " -const identifier = 'bar'; - -class Foo { - ['identifier'] = 5; -} - ", - " -const identifier = \"bar\"; -class Foo { - constructor(){ - this[\"identifier\"] = 5; - } -} - " -); - -test!( - syntax(), - |_| typescript_class_properties(), - issue_1122_4, - " -const identifier = 'bar'; - -class Foo { - static [identifier] = 5; -} - ", - " -const identifier = \"bar\"; -class Foo { -} -Foo[identifier] = 5; - - " -); - -test!( - syntax(), - |_| typescript_class_properties(), - issue_1122_5, - " -const identifier = 'bar'; - -class Foo { - static identifier = 5; -} - ", - " -const identifier = \"bar\"; -class Foo { -} -Foo.identifier = 5; - " -); - test!( ts(), - |_| chain!(resolver(), class_properties()), + |_| chain!( + resolver(), + class_properties(class_properties::Config { loose: false }) + ), issue_890_1, "const DURATION = 1000 @@ -4845,7 +4806,7 @@ export class HygieneTest { test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1306_1, r#" class Animal { @@ -4879,7 +4840,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1306_2, r#" class Animal { @@ -4913,7 +4874,7 @@ var _name = new WeakMap(); test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_1, " class Foo { @@ -4934,7 +4895,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_2, " class Test { @@ -5107,7 +5068,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_3, " class Test { @@ -5161,7 +5122,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_4, " class Test { @@ -5201,7 +5162,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_5, " class Test { @@ -5221,7 +5182,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1333_6, " class Test { @@ -5241,7 +5202,7 @@ test!( test!( syntax(), - |_| { class_properties() }, + |_| { class_properties(class_properties::Config { loose: false }) }, issue_1660_1, " console.log(class { run() { } }); @@ -5256,7 +5217,10 @@ test!( test!( syntax(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), issue_1694_1, " class MyClass { @@ -5284,7 +5248,10 @@ test!( test!( syntax(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), issue_1694_2, " class MyClass { @@ -5312,7 +5279,10 @@ class MyClass { test!( syntax(), - |_| chain!(class_properties(), async_to_generator()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + async_to_generator() + ), issue_1702_1, " class Foo { @@ -5361,7 +5331,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1711_1, " class Foo { @@ -5393,7 +5363,7 @@ test!( test_exec!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1742_1, " class Foo { @@ -5417,7 +5387,10 @@ test_exec!( test_exec!( syntax(), - |_| chain!(class_properties(), template_literal()), + |_| chain!( + class_properties(class_properties::Config { loose: false }), + template_literal() + ), issue_1742_2, " class Foo { @@ -5441,7 +5414,7 @@ test_exec!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1742_3, " class Foo { @@ -5486,7 +5459,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1869_1, " class TestClass { @@ -5516,7 +5489,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_1869_2, " var _class; @@ -5549,7 +5522,7 @@ test!( test!( syntax(), - |_| class_properties(), + |_| class_properties(class_properties::Config { loose: false }), issue_2021_1, " class Item extends Component { @@ -5573,5 +5546,9 @@ test!( #[testing::fixture("tests/fixture/classes/**/exec.js")] fn exec(input: PathBuf) { let src = read_to_string(&input).unwrap(); - compare_stdout(Default::default(), |_| class_properties(), &src); + compare_stdout( + Default::default(), + |_| class_properties(class_properties::Config { loose: false }), + &src, + ); } diff --git a/ecmascript/transforms/optimization/tests/simplify.rs b/ecmascript/transforms/optimization/tests/simplify.rs index 933268e54d4d..b13807fd3f97 100644 --- a/ecmascript/transforms/optimization/tests/simplify.rs +++ b/ecmascript/transforms/optimization/tests/simplify.rs @@ -528,7 +528,7 @@ test!( chain!( strip(), decorators(Default::default()), - class_properties(), + class_properties(class_properties::Config { loose: false }), simplifier(Default::default()), es2018(), es2017(), From 6524af213ff93370cceeb157cdcdf57c16922bd6 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:42:16 +0900 Subject: [PATCH 088/105] Tests --- .../proposal/tests/private_in_object.rs | 10 +- ecmascript/transforms/tests/decorators.rs | 67 ++++++----- .../transforms/tests/es2015_function_name.rs | 2 +- .../transforms/typescript/benches/compat.rs | 19 ++- .../transforms/typescript/tests/strip.rs | 109 ++++++++++++++++-- src/builder.rs | 2 +- 6 files changed, 159 insertions(+), 50 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private_in_object.rs b/ecmascript/transforms/proposal/tests/private_in_object.rs index 03d6762b17de..ddf55a706bc5 100644 --- a/ecmascript/transforms/proposal/tests/private_in_object.rs +++ b/ecmascript/transforms/proposal/tests/private_in_object.rs @@ -50,14 +50,20 @@ fn fixture(input: PathBuf) { "proposal-class-properties" => { if !class_props { class_props = true; - pass = Box::new(chain!(pass, class_properties())); + pass = Box::new(chain!( + pass, + class_properties(class_properties::Config { loose: false }) + )); } } "proposal-private-methods" => { if !class_props { class_props = true; - pass = Box::new(chain!(pass, class_properties())); + pass = Box::new(chain!( + pass, + class_properties(class_properties::Config { loose: false }) + )); } } diff --git a/ecmascript/transforms/tests/decorators.rs b/ecmascript/transforms/tests/decorators.rs index cd24d9f8e901..99f9bb64bdfb 100644 --- a/ecmascript/transforms/tests/decorators.rs +++ b/ecmascript/transforms/tests/decorators.rs @@ -36,7 +36,10 @@ fn syntax(decorators_before_export: bool) -> Syntax { } fn tr() -> impl Fold { - chain!(decorators(Default::default()), class_properties(),) + chain!( + decorators(Default::default()), + class_properties(class_properties::Config { loose: false }), + ) } fn ts_transform() -> impl Fold { @@ -2013,7 +2016,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_constructors_return_new_constructor_exec, r#" @@ -2174,8 +2177,8 @@ export { _class1 as default } // "presets": ["env"], // "plugins": [ // ["proposal-decorators", { "legacy": true }], -// [class_properties(), { "loose": true }] -// ] +// [class_properties(class_properties::Config { loose: false }), { "loose": +// true }] ] //} //"#), // legacy_class_static_methods_numeric_props_exec, @@ -2201,8 +2204,8 @@ export { _class1 as default } // "presets": ["env"], // "plugins": [ // ["proposal-decorators", { "legacy": true }], -// [class_properties(), { "loose": true }] -// ] +// [class_properties(class_properties::Config { loose: false }), { "loose": +// true }] ] //} //"#), // legacy_class_prototype_properties_mutate_descriptor_exec, @@ -2336,8 +2339,8 @@ export { _class1 as default } // "presets": ["env"], // "plugins": [ // ["proposal-decorators", { "legacy": true }], -// [class_properties(), { "loose": true }] -// ] +// [class_properties(class_properties::Config { loose: false }), { "loose": +// true }] ] //} //"#), // legacy_object_properties_mutate_descriptor_exec, @@ -2473,7 +2476,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_methods_numeric_props_exec, r#" @@ -2499,7 +2502,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_static_properties_mutate_descriptor_exec, r#" @@ -2614,7 +2617,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_static_methods_string_props_exec, r#" @@ -2640,7 +2643,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_properties_string_literal_properties_exec, r#" @@ -2685,7 +2688,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_methods_mutate_descriptor_exec, r#" @@ -2818,7 +2821,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_properties_numeric_props_exec, r#" @@ -2875,7 +2878,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_properties_return_descriptor_exec, r#" @@ -2992,7 +2995,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_properties_string_props_exec, r#" @@ -3020,7 +3023,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_properties_return_descriptor_exec, r#" @@ -3133,7 +3136,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_methods_string_props_exec, r#" @@ -3159,7 +3162,7 @@ test!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_regression_8041, r#" @@ -3189,7 +3192,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_methods_return_descriptor_exec, r#" @@ -3324,7 +3327,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_ordering_reverse_order_exec, r#" @@ -3368,7 +3371,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_methods_numeric_props_exec, r#" @@ -3395,7 +3398,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_static_properties_return_descriptor_exec, r#" @@ -3515,7 +3518,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_export_default_exec, r#" @@ -3545,7 +3548,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_ordering_reverse_order_exec, r#" @@ -3592,7 +3595,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_methods_mutate_descriptor_exec, r#" @@ -3721,7 +3724,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_static_methods_return_descriptor_exec, r#" @@ -3853,7 +3856,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_methods_return_descriptor_exec, r#" @@ -3984,7 +3987,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_object_methods_string_props_exec, r#" @@ -4012,7 +4015,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_prototype_properties_child_classes_properties_exec, r#" @@ -4055,7 +4058,7 @@ test_exec!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), ), legacy_class_static_methods_mutate_descriptor_exec, r#" @@ -5143,7 +5146,7 @@ test!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone()),) ), decorators_legacy_interop_local_define_property, diff --git a/ecmascript/transforms/tests/es2015_function_name.rs b/ecmascript/transforms/tests/es2015_function_name.rs index 75f4213a18a7..010e30f69219 100644 --- a/ecmascript/transforms/tests/es2015_function_name.rs +++ b/ecmascript/transforms/tests/es2015_function_name.rs @@ -694,7 +694,7 @@ test!( legacy: true, ..Default::default() }), - class_properties(), + class_properties(class_properties::Config { loose: false }), classes(Some(t.comments.clone()),), ), decorators_legacy_interop_strict, diff --git a/ecmascript/transforms/typescript/benches/compat.rs b/ecmascript/transforms/typescript/benches/compat.rs index 3b597296998c..7cd213c691b0 100644 --- a/ecmascript/transforms/typescript/benches/compat.rs +++ b/ecmascript/transforms/typescript/benches/compat.rs @@ -90,7 +90,11 @@ fn common_reserved_word(b: &mut Bencher) { #[bench] fn es2020(b: &mut Bencher) { - run(b, || swc_ecma_transforms_compat::es2020()); + run(b, || { + swc_ecma_transforms_compat::es2020(swc_ecma_transforms_compat::es2020::Config { + loose: false, + }) + }); } #[bench] @@ -109,7 +113,9 @@ fn es2020_optional_chaining(b: &mut Bencher) { #[bench] fn es2020_class_properties(b: &mut Bencher) { - run(b, || swc_ecma_transforms_compat::es2020::class_properties()); + run(b, || { + swc_ecma_transforms_compat::es2020::class_properties(Default::default()) + }); } #[bench] @@ -262,7 +268,8 @@ fn es3(b: &mut Bencher) { fn full_es2016(b: &mut Bencher) { run(b, || { chain!( - swc_ecma_transforms_compat::es2020(), + swc_ecma_transforms_compat::es2020(Default::default()), + swc_ecma_transforms_compat::es2019(), swc_ecma_transforms_compat::es2018(), swc_ecma_transforms_compat::es2017(), swc_ecma_transforms_compat::es2016(), @@ -274,7 +281,8 @@ fn full_es2016(b: &mut Bencher) { fn full_es2017(b: &mut Bencher) { run(b, || { chain!( - swc_ecma_transforms_compat::es2020(), + swc_ecma_transforms_compat::es2020(Default::default()), + swc_ecma_transforms_compat::es2019(), swc_ecma_transforms_compat::es2018(), swc_ecma_transforms_compat::es2017(), ) @@ -285,7 +293,8 @@ fn full_es2017(b: &mut Bencher) { fn full_es2018(b: &mut Bencher) { run(b, || { chain!( - swc_ecma_transforms_compat::es2020(), + swc_ecma_transforms_compat::es2020(Default::default()), + swc_ecma_transforms_compat::es2019(), swc_ecma_transforms_compat::es2018(), ) }); diff --git a/ecmascript/transforms/typescript/tests/strip.rs b/ecmascript/transforms/typescript/tests/strip.rs index 908cdb319c34..2996fd66b098 100644 --- a/ecmascript/transforms/typescript/tests/strip.rs +++ b/ecmascript/transforms/typescript/tests/strip.rs @@ -5,7 +5,7 @@ use swc_ecma_parser::{Syntax, TsConfig}; use swc_ecma_transforms_base::resolver::resolver; use swc_ecma_transforms_compat::{ es2017::async_to_generator, - es2020::{class_properties, nullish_coalescing, optional_chaining}, + es2020::{nullish_coalescing, optional_chaining}, }; use swc_ecma_transforms_proposal::decorators; use swc_ecma_transforms_testing::{test, test_exec, test_fixture}; @@ -3252,14 +3252,11 @@ test!( Syntax::Typescript(TsConfig { ..Default::default() }), - |_| chain!( - strip_with_config(strip::Config { - use_define_for_class_fields: true, - no_empty_export: true, - ..Default::default() - }), - class_properties() - ), + |_| strip_with_config(strip::Config { + use_define_for_class_fields: true, + no_empty_export: true, + ..Default::default() + }), compile_to_class_constructor_collision_ignores_types, r#" class C { @@ -4080,6 +4077,100 @@ to!( " ); +to!( + issue_1122_1, + " +const identifier = 'bar'; + +class Foo { + [identifier] = 5; +} + + +", + " +const identifier = \"bar\"; +class Foo { + constructor(){ + this[identifier] = 5; + } +} + " +); + +to!( + issue_1122_2, + " +const identifier = 'bar'; + +class Foo { + identifier = 5; +} +", + " + const identifier = \"bar\"; + class Foo { + constructor(){ + this.identifier = 5; + } + } + " +); + +to!( + issue_1122_3, + " +const identifier = 'bar'; + +class Foo { + ['identifier'] = 5; +} + ", + " +const identifier = \"bar\"; +class Foo { + constructor(){ + this[\"identifier\"] = 5; + } +} + " +); + +to!( + issue_1122_4, + " +const identifier = 'bar'; + +class Foo { + static [identifier] = 5; +} + ", + " +const identifier = \"bar\"; +class Foo { +} +Foo[identifier] = 5; + + " +); + +to!( + issue_1122_5, + " +const identifier = 'bar'; + +class Foo { + static identifier = 5; +} + ", + " +const identifier = \"bar\"; +class Foo { +} +Foo.identifier = 5; + " +); + #[testing::fixture("tests/fixture/**/input.ts")] fn exec(input: PathBuf) { let output = input.with_file_name("output.js"); diff --git a/src/builder.rs b/src/builder.rs index a4eef9c324a1..8c85ea93f4ea 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -175,7 +175,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { should_enable(self.target, JscTarget::Es2021) ), Optional::new( - compat::es2020::es2020(), + compat::es2020::es2020(compat::es2020::Config { loose: self.loose }), should_enable(self.target, JscTarget::Es2020) ), Optional::new( From 1201aaab3d1e0a1f9fd3727e47fa289cd419f4fb Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:42:28 +0900 Subject: [PATCH 089/105] fixup --- ecmascript/babel/compat/benches/babelify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecmascript/babel/compat/benches/babelify.rs b/ecmascript/babel/compat/benches/babelify.rs index 93057cfb87da..b05d1eae1549 100644 --- a/ecmascript/babel/compat/benches/babelify.rs +++ b/ecmascript/babel/compat/benches/babelify.rs @@ -55,7 +55,7 @@ fn babelify_only(b: &mut Bencher) { let module = c.run_transform(&handler, false, || { module .fold_with(&mut typescript::strip()) - .fold_with(&mut es2020()) + .fold_with(&mut es2020(Default::default())) }); b.iter(|| { From 104745ed7fcfc77cfdb26ad63b9b9cb5fe7a1f3c Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 14:43:47 +0900 Subject: [PATCH 090/105] loose --- ecmascript/transforms/proposal/tests/private_in_object.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private_in_object.rs b/ecmascript/transforms/proposal/tests/private_in_object.rs index ddf55a706bc5..fa1514f31085 100644 --- a/ecmascript/transforms/proposal/tests/private_in_object.rs +++ b/ecmascript/transforms/proposal/tests/private_in_object.rs @@ -52,7 +52,9 @@ fn fixture(input: PathBuf) { class_props = true; pass = Box::new(chain!( pass, - class_properties(class_properties::Config { loose: false }) + class_properties(class_properties::Config { + loose: input.to_string_lossy().contains("private-loose") + }) )); } } @@ -62,7 +64,9 @@ fn fixture(input: PathBuf) { class_props = true; pass = Box::new(chain!( pass, - class_properties(class_properties::Config { loose: false }) + class_properties(class_properties::Config { + loose: input.to_string_lossy().contains("private-loose") + }) )); } } From 8819fa9d8982f939c679eeb98e933d1019cd931d Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:05:00 +0900 Subject: [PATCH 091/105] Ignore loose tests --- .../{private-loose => .private-loose}/accessor/input.js | 0 .../{private-loose => .private-loose}/accessor/output.js | 0 .../{private-loose => .private-loose}/field/input.js | 0 .../{private-loose => .private-loose}/field/output.js | 0 .../{private-loose => .private-loose}/method/input.js | 0 .../{private-loose => .private-loose}/method/output.js | 0 .../{private-loose => .private-loose}/native-classes/input.js | 0 .../{private-loose => .private-loose}/native-classes/options.json | 0 .../{private-loose => .private-loose}/native-classes/output.js | 0 .../nested-class-other-redeclared/input.js | 0 .../nested-class-other-redeclared/output.js | 0 .../nested-class-redeclared/input.js | 0 .../nested-class-redeclared/output.js | 0 .../{private-loose => .private-loose}/nested-class/input.js | 0 .../{private-loose => .private-loose}/nested-class/output.js | 0 .../{private-loose => .private-loose}/options.json | 0 .../{private-loose => .private-loose}/static-accessor/input.js | 0 .../{private-loose => .private-loose}/static-accessor/output.js | 0 .../{private-loose => .private-loose}/static-field/input.js | 0 .../{private-loose => .private-loose}/static-field/output.js | 0 .../{private-loose => .private-loose}/static-method/input.js | 0 .../{private-loose => .private-loose}/static-method/output.js | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/accessor/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/accessor/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/field/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/field/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/method/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/method/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/native-classes/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/native-classes/options.json (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/native-classes/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class-other-redeclared/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class-other-redeclared/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class-redeclared/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class-redeclared/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/nested-class/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/options.json (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-accessor/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-accessor/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-field/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-field/output.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-method/input.js (100%) rename ecmascript/transforms/proposal/tests/private-in-object/{private-loose => .private-loose}/static-method/output.js (100%) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/accessor/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/accessor/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/accessor/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/accessor/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/accessor/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/field/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/field/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/field/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/field/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/field/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/method/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/method/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/method/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/method/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/method/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/options.json similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/options.json rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/options.json diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/native-classes/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/native-classes/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-other-redeclared/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-other-redeclared/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-other-redeclared/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-other-redeclared/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-other-redeclared/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-redeclared/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-redeclared/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-redeclared/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class-redeclared/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class-redeclared/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/nested-class/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/nested-class/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/options.json similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/options.json rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/options.json diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-accessor/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-accessor/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-accessor/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-accessor/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-accessor/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-field/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-field/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-field/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-field/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-field/output.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-method/input.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/input.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-method/input.js diff --git a/ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-method/output.js similarity index 100% rename from ecmascript/transforms/proposal/tests/private-in-object/private-loose/static-method/output.js rename to ecmascript/transforms/proposal/tests/private-in-object/.private-loose/static-method/output.js From 900a12455748c127d746d9814cc659ddd7290eda Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:05:47 +0900 Subject: [PATCH 092/105] lint --- .../transforms/compat/src/es2020/class_properties/mod.rs | 1 - .../compat/src/es2020/class_properties/private_field.rs | 2 -- ecmascript/transforms/proposal/tests/private_in_object.rs | 3 --- 3 files changed, 6 deletions(-) diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs index a46304de610f..6ac8ad52d006 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/mod.rs @@ -372,7 +372,6 @@ impl ClassProperties { mark: self.mark, class_name: &ident, names: &mut names_used_for_brand_checks, - methods: &private_methods, statics: &statics, }); diff --git a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs index 12f425eb3fa2..215d33734012 100644 --- a/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs +++ b/ecmascript/transforms/compat/src/es2020/class_properties/private_field.rs @@ -19,8 +19,6 @@ pub(super) struct BrandCheckHandler<'a> { /// Private names used for brand checks. pub names: &'a mut FxHashSet, - pub methods: &'a FxHashSet, - pub statics: &'a FxHashSet, } diff --git a/ecmascript/transforms/proposal/tests/private_in_object.rs b/ecmascript/transforms/proposal/tests/private_in_object.rs index fa1514f31085..06a529cc5063 100644 --- a/ecmascript/transforms/proposal/tests/private_in_object.rs +++ b/ecmascript/transforms/proposal/tests/private_in_object.rs @@ -89,6 +89,3 @@ fn fixture(input: PathBuf) { &output, ) } - -#[testing::fixture("tests/private-in-object/**/exec.js")] -fn exec(input: PathBuf) {} From c1add5a5fe9facc79b3195918660f7d9396afe30 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:22:10 +0900 Subject: [PATCH 093/105] Add to swc --- ecmascript/parser/src/lib.rs | 2 +- src/builder.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ecmascript/parser/src/lib.rs b/ecmascript/parser/src/lib.rs index 4071b92951ef..7c1f3dbcd20c 100644 --- a/ecmascript/parser/src/lib.rs +++ b/ecmascript/parser/src/lib.rs @@ -276,7 +276,7 @@ impl Syntax { } } - pub(crate) fn private_in_object(self) -> bool { + pub fn private_in_object(self) -> bool { match self { Syntax::Es(EsConfig { private_in_object, .. diff --git a/src/builder.rs b/src/builder.rs index 8c85ea93f4ea..4af712af1b1d 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -14,8 +14,14 @@ use swc_ecma_ast::{EsVersion, Module}; use swc_ecma_minifier::option::MinifyOptions; use swc_ecma_parser::Syntax; use swc_ecma_transforms::{ - compat, fixer, helpers, hygiene, hygiene::hygiene_with_config, modules, modules::util::Scope, - optimization::const_modules, pass::Optional, proposals::import_assertions, typescript, + compat, fixer, helpers, hygiene, + hygiene::hygiene_with_config, + modules, + modules::util::Scope, + optimization::const_modules, + pass::Optional, + proposals::{import_assertions, private_in_object}, + typescript, }; use swc_ecma_visit::{as_folder, noop_visit_mut_type, VisitMut}; @@ -220,6 +226,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { let module_scope = Rc::new(RefCell::new(Scope::default())); chain!( self.pass, + Optional::new(private_in_object(), syntax.private_in_object()), compat_pass, // module / helper Optional::new( From b9926267c95ed6dee86e1080ece6e92f4fcfe466 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:34:27 +0900 Subject: [PATCH 094/105] nested --- .../transforms/proposal/src/private_in_object.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index b2729707d9f5..8299ca15389c 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -91,6 +91,8 @@ struct ClassData { /// This is modified by the class visitor. mark: Mark, + privates: FxHashSet, + /// Name of private methods. methods: Vec, @@ -130,6 +132,8 @@ impl VisitMut for PrivateInObject { for m in &n.body { match m { ClassMember::PrivateMethod(m) => { + self.cls.privates.insert(m.key.id.sym.clone()); + self.cls.methods.push(m.key.id.sym.clone()); if m.is_static { @@ -138,6 +142,8 @@ impl VisitMut for PrivateInObject { } ClassMember::PrivateProp(m) => { + self.cls.privates.insert(m.key.id.sym.clone()); + if m.is_static { self.cls.statics.push(m.key.id.sym.clone()); } @@ -320,7 +326,9 @@ impl VisitMut for PrivateInObject { let var_name = self.var_name_for_brand_check(&left); - if self.injected_vars.insert(var_name.to_id()) { + if self.cls.privates.contains(&left.id.sym) + && self.injected_vars.insert(var_name.to_id()) + { self.cls.vars.push_var( var_name.clone(), Some(Box::new(Expr::New(NewExpr { From 09a56f56f80918c73d99dde9378ae4133932aa48 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:34:57 +0900 Subject: [PATCH 095/105] Update test refs --- .../to-native-fields/nested-class/output.js | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js index ff28dc79027c..9c98882aee38 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class/output.js @@ -1,19 +1,12 @@ -var _temp; - -var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - +var _tmp, _brand_check_foo = new WeakSet(); class Foo { - #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); - - test() { - class Nested { - test() { - _fooBrandCheck.has(this); - } - + #foo = (_tmp = 1, _brand_check_foo.add(this), _tmp); + test() { + class Nested { + test() { + _brand_check_foo.has(this); + } + } + _brand_check_foo.has(this); } - - _fooBrandCheck.has(this); - } - } From 0edf54c51b1d14436510ca900626cfca1ef25886 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:38:52 +0900 Subject: [PATCH 096/105] Update test refs --- .../nested-class-other-redeclared/output.js | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js index 9048d000144f..5e511e41bde6 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-other-redeclared/output.js @@ -1,32 +1,17 @@ -var _temp, _temp3; - -var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - -var _barBrandCheck2 = /*#__PURE__*/new WeakSet(); - +var _tmp, _tmp1, _brand_check_foo = new WeakSet(), _brand_check_bar = new WeakSet(); class Foo { - #foo = (_temp = 1, _fooBrandCheck.add(this), _temp); - #bar = (_temp3 = 1, _barBrandCheck2.add(this), _temp3); - - test() { - var _temp2; - - var _barBrandCheck = /*#__PURE__*/new WeakSet(); - - class Nested { - #bar = (_temp2 = 2, _barBrandCheck.add(this), _temp2); - - test() { - _fooBrandCheck.has(this); - - _barBrandCheck.has(this); - } - + #foo = (_tmp = 1, _brand_check_foo.add(this), _tmp); + #bar = (_tmp1 = 1, _brand_check_bar.add(this), _tmp1); + test() { + var _tmp, _brand_check_bar1 = new WeakSet(); + class Nested { + #bar = (_tmp = 2, _brand_check_bar1.add(this), _tmp); + test() { + _brand_check_foo.has(this); + _brand_check_bar1.has(this); + } + } + _brand_check_foo.has(this); + _brand_check_bar.has(this); } - - _fooBrandCheck.has(this); - - _barBrandCheck2.has(this); - } - } From 118c39bb771eb9fa5d1b5f21fc70a54f6d6077fb Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:39:37 +0900 Subject: [PATCH 097/105] Update test refs --- .../nested-class-redeclared/output.js | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js index 279f759f6f6d..895632d88f78 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/nested-class-redeclared/output.js @@ -1,25 +1,14 @@ -var _temp2; - -var _fooBrandCheck2 = /*#__PURE__*/new WeakSet(); - +var _tmp, _brand_check_foo = new WeakSet(); class Foo { - #foo = (_temp2 = 1, _fooBrandCheck2.add(this), _temp2); - - test() { - var _temp; - - var _fooBrandCheck = /*#__PURE__*/new WeakSet(); - - class Nested { - #foo = (_temp = 2, _fooBrandCheck.add(this), _temp); - - test() { - _fooBrandCheck.has(this); - } - + #foo = (_tmp = 1, _brand_check_foo.add(this), _tmp); + test() { + var _tmp, _brand_check_foo1 = new WeakSet(); + class Nested { + #foo = (_tmp = 2, _brand_check_foo1.add(this), _tmp); + test() { + _brand_check_foo1.has(this); + } + } + _brand_check_foo.has(this); } - - _fooBrandCheck2.has(this); - } - } From 5f46aa4f92bb79e4904f3aa2d548cc210c80c2e8 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:40:15 +0900 Subject: [PATCH 098/105] Update test refs --- .../multiple-checks/output.js | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js index da055a4bc10b..914a13edcec0 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js @@ -1,20 +1,15 @@ -var _xBrandCheck = /*#__PURE__*/new WeakSet(); - -var _ABrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_x = new WeakSet(), _brand_check_m = new WeakSet(); class A { - #x = (_ABrandCheck.add(this), void _xBrandCheck.add(this)); - - #m() {} - - test() { - _xBrandCheck.has(this); - - _ABrandCheck.has(this); - - _xBrandCheck.has(this); - - _ABrandCheck.has(this); - } - + #x = void _brand_check_x.add(this); + #m() { + } + test() { + _brand_check_x.has(this); + _brand_check_m.has(this); + _brand_check_x.has(this); + _brand_check_m.has(this); + } + constructor(){ + _brand_check_m.add(this); + } } From affe9a1898bb753685c7424cb83ce35717962b58 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:52:06 +0900 Subject: [PATCH 099/105] methods --- .../transforms/proposal/src/private_in_object.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ecmascript/transforms/proposal/src/private_in_object.rs b/ecmascript/transforms/proposal/src/private_in_object.rs index 8299ca15389c..3ca62e40b3f7 100644 --- a/ecmascript/transforms/proposal/src/private_in_object.rs +++ b/ecmascript/transforms/proposal/src/private_in_object.rs @@ -9,8 +9,7 @@ use swc_ecma_ast::*; use swc_ecma_transforms_base::{pass::JsPass, perf::Check}; use swc_ecma_transforms_macros::fast_path; use swc_ecma_utils::{ - default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprExt, - ExprFactory, Id, + default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprFactory, Id, }; use swc_ecma_visit::{ as_folder, noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith, @@ -112,7 +111,16 @@ impl CompilerPass for PrivateInObject { impl PrivateInObject { fn var_name_for_brand_check(&self, n: &PrivateName) -> Ident { + let is_static = self.cls.statics.contains(&n.id.sym); + let span = n.span.apply_mark(self.cls.mark); + + if !is_static && self.cls.methods.contains(&n.id.sym) { + if let Some(cls_name) = &self.cls.ident { + return Ident::new(format!("_brand_check_{}", cls_name.sym).into(), span); + } + } + Ident::new(format!("_brand_check_{}", n.id.sym).into(), span) } } From b097f6f296750a142cc5496186cf84e218900a87 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:53:46 +0900 Subject: [PATCH 100/105] Update test refs --- .../to-native-fields/accessor/output.js | 6 +-- .../half-constructed-instance/output.js | 45 ++++++++----------- .../to-native-fields/method/output.js | 6 +-- .../multiple-checks/output.js | 8 ++-- 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js index be479bf8d60d..e3df3b6a271d 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/accessor/output.js @@ -1,11 +1,11 @@ -var _brand_check_foo = new WeakSet(); +var _brand_check_Foo = new WeakSet(); class Foo { get #foo() { } test(other) { - return _brand_check_foo.has(other); + return _brand_check_Foo.has(other); } constructor(){ - _brand_check_foo.add(this); + _brand_check_Foo.add(this); } } diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js index 6a6068c69d7a..b7c67550745e 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/half-constructed-instance/output.js @@ -1,29 +1,20 @@ -var _temp, _temp2; - -var _FBrandCheck = /*#__PURE__*/new WeakSet(); - -var _xBrandCheck = /*#__PURE__*/new WeakSet(); - -var _yBrandCheck = /*#__PURE__*/new WeakSet(); - +var _brand_check_F = new WeakSet(), _brand_check_x = new WeakSet(), _brand_check_y = new WeakSet(), _tmp, _tmp1; class F { - m() { - _FBrandCheck.has(this); - - _xBrandCheck.has(this); - - _yBrandCheck.has(this); - - _FBrandCheck.has(this); - } - - get #w() {} - - #x = (_temp = (_FBrandCheck.add(this), 0), _xBrandCheck.add(this), _temp); - #y = (_temp2 = (() => { - throw 'error'; - })(), _yBrandCheck.add(this), _temp2); - - #z() {} - + m() { + _brand_check_F.has(this); + _brand_check_x.has(this); + _brand_check_y.has(this); + _brand_check_F.has(this); + } + get #w() { + } + #x = (_tmp = 0, _brand_check_x.add(this), _tmp); + #y = (_tmp1 = (()=>{ + throw "error"; + })(), _brand_check_y.add(this), _tmp1); + #z() { + } + constructor(){ + _brand_check_F.add(this); + } } diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js index 25f6d2353974..1cea0ec767d3 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/method/output.js @@ -1,11 +1,11 @@ -var _brand_check_foo = new WeakSet(); +var _brand_check_Foo = new WeakSet(); class Foo { #foo() { } test(other) { - return _brand_check_foo.has(other); + return _brand_check_Foo.has(other); } constructor(){ - _brand_check_foo.add(this); + _brand_check_Foo.add(this); } } diff --git a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js index 914a13edcec0..5aecb080fff3 100644 --- a/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js +++ b/ecmascript/transforms/proposal/tests/private-in-object/to-native-fields/multiple-checks/output.js @@ -1,15 +1,15 @@ -var _brand_check_x = new WeakSet(), _brand_check_m = new WeakSet(); +var _brand_check_x = new WeakSet(), _brand_check_A = new WeakSet(); class A { #x = void _brand_check_x.add(this); #m() { } test() { _brand_check_x.has(this); - _brand_check_m.has(this); + _brand_check_A.has(this); _brand_check_x.has(this); - _brand_check_m.has(this); + _brand_check_A.has(this); } constructor(){ - _brand_check_m.add(this); + _brand_check_A.add(this); } } From 885f83eb85a76a5138cc7f0feb981e0c45bf5d98 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:54:50 +0900 Subject: [PATCH 101/105] Bump version --- Cargo.lock | 2 +- package.json | 2 +- wasm/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7b6bc87a2805..4957fd642d93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3405,7 +3405,7 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm" -version = "1.2.91" +version = "1.2.92" dependencies = [ "anyhow", "console_error_panic_hook", diff --git a/package.json b/package.json index 532b96f94c8e..59632ad86bb5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@swc/core", - "version": "1.2.91", + "version": "1.2.92", "description": "Super-fast alternative for babel", "homepage": "https://swc.rs", "main": "./index.js", diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index eea26a3e07be..a4634cea21c9 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -6,7 +6,7 @@ license = "Apache-2.0 AND MIT" name = "wasm" publish = false repository = "https://github.com/swc-project/swc.git" -version = "1.2.91" +version = "1.2.92" [lib] crate-type = ["cdylib"] From 04a5cab1ddf56e75e21f0071b8a9f1d94b63bcab Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 15:55:19 +0900 Subject: [PATCH 102/105] Bump version --- Cargo.lock | 44 +++++++++---------- Cargo.toml | 20 ++++----- bundler/Cargo.toml | 10 ++--- ecmascript/Cargo.toml | 14 +++--- ecmascript/codegen/Cargo.toml | 4 +- ecmascript/dep-graph/Cargo.toml | 4 +- ecmascript/ext-transforms/Cargo.toml | 4 +- ecmascript/jsdoc/Cargo.toml | 4 +- ecmascript/minifier/Cargo.toml | 10 ++--- ecmascript/parser/Cargo.toml | 2 +- ecmascript/preset-env/Cargo.toml | 8 ++-- ecmascript/transforms/Cargo.toml | 22 +++++----- ecmascript/transforms/base/Cargo.toml | 6 +-- ecmascript/transforms/classes/Cargo.toml | 4 +- ecmascript/transforms/compat/Cargo.toml | 10 ++--- ecmascript/transforms/module/Cargo.toml | 10 ++--- ecmascript/transforms/optimization/Cargo.toml | 18 ++++---- ecmascript/transforms/proposal/Cargo.toml | 14 +++--- ecmascript/transforms/react/Cargo.toml | 14 +++--- ecmascript/transforms/testing/Cargo.toml | 8 ++-- ecmascript/transforms/typescript/Cargo.toml | 16 +++---- plugin/runner/Cargo.toml | 6 +-- plugin/testing/Cargo.toml | 4 +- 23 files changed, 128 insertions(+), 128 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4957fd642d93..88704e94de76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -939,7 +939,7 @@ dependencies = [ [[package]] name = "jsdoc" -version = "0.38.1" +version = "0.39.0" dependencies = [ "anyhow", "dashmap", @@ -2287,7 +2287,7 @@ checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "swc" -version = "0.56.1" +version = "0.57.0" dependencies = [ "ahash", "anyhow", @@ -2392,7 +2392,7 @@ dependencies = [ [[package]] name = "swc_bundler" -version = "0.59.0" +version = "0.60.0" dependencies = [ "ahash", "anyhow", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "swc_ecma_codegen" -version = "0.70.5" +version = "0.71.0" dependencies = [ "bitflags", "num-bigint", @@ -2583,7 +2583,7 @@ dependencies = [ [[package]] name = "swc_ecma_dep_graph" -version = "0.39.1" +version = "0.40.0" dependencies = [ "swc_atoms 0.2.7", "swc_common", @@ -2595,7 +2595,7 @@ dependencies = [ [[package]] name = "swc_ecma_ext_transforms" -version = "0.28.1" +version = "0.29.0" dependencies = [ "phf", "swc_atoms 0.2.7", @@ -2629,7 +2629,7 @@ dependencies = [ [[package]] name = "swc_ecma_minifier" -version = "0.28.0" +version = "0.29.0" dependencies = [ "ansi_term 0.12.1", "anyhow", @@ -2661,7 +2661,7 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.70.4" +version = "0.71.0" dependencies = [ "either", "enum_kind", @@ -2686,7 +2686,7 @@ dependencies = [ [[package]] name = "swc_ecma_preset_env" -version = "0.43.0" +version = "0.44.0" dependencies = [ "dashmap", "fxhash", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms" -version = "0.72.0" +version = "0.73.0" dependencies = [ "pretty_assertions 0.6.1", "sourcemap", @@ -2739,7 +2739,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "0.31.4" +version = "0.32.0" dependencies = [ "fxhash", "once_cell", @@ -2758,7 +2758,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_classes" -version = "0.17.1" +version = "0.18.0" dependencies = [ "swc_atoms 0.2.7", "swc_common", @@ -2770,7 +2770,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_compat" -version = "0.35.0" +version = "0.36.0" dependencies = [ "arrayvec", "fxhash", @@ -2806,7 +2806,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_module" -version = "0.39.0" +version = "0.40.0" dependencies = [ "Inflector", "anyhow", @@ -2829,7 +2829,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_optimization" -version = "0.42.0" +version = "0.43.0" dependencies = [ "dashmap", "fxhash", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_proposal" -version = "0.39.0" +version = "0.40.0" dependencies = [ "either", "fxhash", @@ -2881,7 +2881,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_react" -version = "0.40.0" +version = "0.41.0" dependencies = [ "base64 0.13.0", "dashmap", @@ -2907,7 +2907,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_testing" -version = "0.32.2" +version = "0.33.0" dependencies = [ "ansi_term 0.12.1", "anyhow", @@ -2926,7 +2926,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_typescript" -version = "0.41.0" +version = "0.42.0" dependencies = [ "fxhash", "serde", @@ -2973,7 +2973,7 @@ dependencies = [ [[package]] name = "swc_ecmascript" -version = "0.64.0" +version = "0.65.0" dependencies = [ "swc_ecma_ast", "swc_ecma_codegen", @@ -3065,7 +3065,7 @@ dependencies = [ [[package]] name = "swc_plugin_runner" -version = "0.4.1" +version = "0.5.0" dependencies = [ "abi_stable", "anyhow", @@ -3083,7 +3083,7 @@ dependencies = [ [[package]] name = "swc_plugin_testing" -version = "0.4.1" +version = "0.5.0" dependencies = [ "anyhow", "swc_atoms 0.2.7", diff --git a/Cargo.toml b/Cargo.toml index be82354e521b..898994ad89a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc" repository = "https://github.com/swc-project/swc.git" -version = "0.56.1" +version = "0.57.0" [lib] name = "swc" @@ -53,16 +53,16 @@ serde = {version = "1", features = ["derive"]} serde_json = "1" sourcemap = "6" swc_atoms = {version = "0.2", path = "./atoms"} -swc_bundler = {version = "0.59.0", path = "./bundler"} +swc_bundler = {version = "0.60.0", path = "./bundler"} swc_common = {version = "0.12.1", path = "./common", features = ["sourcemap", "concurrent"]} swc_ecma_ast = {version = "0.52.0", path = "./ecmascript/ast"} -swc_ecma_codegen = {version = "0.70.2", path = "./ecmascript/codegen"} -swc_ecma_ext_transforms = {version = "0.28.1", path = "./ecmascript/ext-transforms"} +swc_ecma_codegen = {version = "0.71.0", path = "./ecmascript/codegen"} +swc_ecma_ext_transforms = {version = "0.29.0", path = "./ecmascript/ext-transforms"} swc_ecma_loader = {version = "0.18.1", path = "./ecmascript/loader", features = ["lru", "node", "tsc"]} -swc_ecma_minifier = {version = "0.28.0", path = "./ecmascript/minifier"} -swc_ecma_parser = {version = "0.70.2", path = "./ecmascript/parser"} -swc_ecma_preset_env = {version = "0.43.0", path = "./ecmascript/preset-env"} -swc_ecma_transforms = {version = "0.72.0", path = "./ecmascript/transforms", features = [ +swc_ecma_minifier = {version = "0.29.0", path = "./ecmascript/minifier"} +swc_ecma_parser = {version = "0.71.0", path = "./ecmascript/parser"} +swc_ecma_preset_env = {version = "0.44.0", path = "./ecmascript/preset-env"} +swc_ecma_transforms = {version = "0.73.0", path = "./ecmascript/transforms", features = [ "compat", "module", "optimization", @@ -70,10 +70,10 @@ swc_ecma_transforms = {version = "0.72.0", path = "./ecmascript/transforms", fea "react", "typescript", ]} -swc_ecma_transforms_base = {version = "0.31.1", path = "./ecmascript/transforms/base"} +swc_ecma_transforms_base = {version = "0.32.0", path = "./ecmascript/transforms/base"} swc_ecma_utils = {version = "0.44.2", path = "./ecmascript/utils"} swc_ecma_visit = {version = "0.38.1", path = "./ecmascript/visit"} -swc_ecmascript = {version = "0.64.0", path = "./ecmascript"} +swc_ecmascript = {version = "0.65.0", path = "./ecmascript"} swc_visit = {version = "0.2.3", path = "./visit"} [dev-dependencies] diff --git a/bundler/Cargo.toml b/bundler/Cargo.toml index 34b6a928f734..38f66e0ecd11 100644 --- a/bundler/Cargo.toml +++ b/bundler/Cargo.toml @@ -9,7 +9,7 @@ include = ["Cargo.toml", "build.rs", "src/**/*.rs", "src/**/*.js"] license = "Apache-2.0/MIT" name = "swc_bundler" repository = "https://github.com/swc-project/swc.git" -version = "0.59.0" +version = "0.60.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] @@ -34,10 +34,10 @@ retain_mut = "0.1.2" swc_atoms = {version = "0.2.4", path = "../atoms"} swc_common = {version = "0.12.0", path = "../common"} swc_ecma_ast = {version = "0.52.0", path = "../ecmascript/ast"} -swc_ecma_codegen = {version = "0.70.2", path = "../ecmascript/codegen"} +swc_ecma_codegen = {version = "0.71.0", path = "../ecmascript/codegen"} swc_ecma_loader = {version = "0.18.1", path = "../ecmascript/loader"} -swc_ecma_parser = {version = "0.70.2", path = "../ecmascript/parser"} -swc_ecma_transforms = {version = "0.72.0", path = "../ecmascript/transforms", features = ["optimization"]} +swc_ecma_parser = {version = "0.71.0", path = "../ecmascript/parser"} +swc_ecma_transforms = {version = "0.73.0", path = "../ecmascript/transforms", features = ["optimization"]} swc_ecma_utils = {version = "0.44.2", path = "../ecmascript/utils"} swc_ecma_visit = {version = "0.38.1", path = "../ecmascript/visit"} @@ -46,7 +46,7 @@ hex = "0.4" ntest = "0.7.2" reqwest = {version = "0.11.4", features = ["blocking"]} sha-1 = "0.9" -swc_ecma_transforms = {version = "0.72.0", path = "../ecmascript/transforms", features = ["react", "typescript"]} +swc_ecma_transforms = {version = "0.73.0", path = "../ecmascript/transforms", features = ["react", "typescript"]} tempfile = "3.1.0" testing = {version = "0.13.0", path = "../testing"} url = "2.1.1" diff --git a/ecmascript/Cargo.toml b/ecmascript/Cargo.toml index 37f2b981512b..a40d79e35dba 100644 --- a/ecmascript/Cargo.toml +++ b/ecmascript/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecmascript" repository = "https://github.com/swc-project/swc.git" -version = "0.64.0" +version = "0.65.0" [package.metadata.docs.rs] all-features = true @@ -33,12 +33,12 @@ typescript = ["typescript-parser", "swc_ecma_transforms/typescript"] [dependencies] swc_ecma_ast = {version = "0.52.0", path = "./ast"} -swc_ecma_codegen = {version = "0.70.2", path = "./codegen", optional = true} -swc_ecma_dep_graph = {version = "0.39.1", path = "./dep-graph", optional = true} -swc_ecma_minifier = {version = "0.28.0", path = "./minifier", optional = true} -swc_ecma_parser = {version = "0.70.2", path = "./parser", optional = true, default-features = false} -swc_ecma_preset_env = {version = "0.43.0", path = "./preset-env", optional = true} -swc_ecma_transforms = {version = "0.72.0", path = "./transforms", optional = true} +swc_ecma_codegen = {version = "0.71.0", path = "./codegen", optional = true} +swc_ecma_dep_graph = {version = "0.40.0", path = "./dep-graph", optional = true} +swc_ecma_minifier = {version = "0.29.0", path = "./minifier", optional = true} +swc_ecma_parser = {version = "0.71.0", path = "./parser", optional = true, default-features = false} +swc_ecma_preset_env = {version = "0.44.0", path = "./preset-env", optional = true} +swc_ecma_transforms = {version = "0.73.0", path = "./transforms", optional = true} swc_ecma_utils = {version = "0.44.2", path = "./utils", optional = true} swc_ecma_visit = {version = "0.38.1", path = "./visit", optional = true} diff --git a/ecmascript/codegen/Cargo.toml b/ecmascript/codegen/Cargo.toml index fe3cbeaf9b3c..303a061ec6bb 100644 --- a/ecmascript/codegen/Cargo.toml +++ b/ecmascript/codegen/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs"] license = "Apache-2.0/MIT" name = "swc_ecma_codegen" repository = "https://github.com/swc-project/swc.git" -version = "0.70.5" +version = "0.71.0" [dependencies] bitflags = "1" @@ -17,7 +17,7 @@ swc_atoms = {version = "0.2", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../ast"} swc_ecma_codegen_macros = {version = "0.5.2", path = "./macros"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} [dev-dependencies] swc_common = {version = "0.12.0", path = "../../common", features = ["sourcemap"]} diff --git a/ecmascript/dep-graph/Cargo.toml b/ecmascript/dep-graph/Cargo.toml index e4361e38bff8..dec95bae581d 100644 --- a/ecmascript/dep-graph/Cargo.toml +++ b/ecmascript/dep-graph/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_dep_graph" repository = "https://github.com/swc-project/swc.git" -version = "0.39.1" +version = "0.40.0" [dependencies] swc_atoms = {version = "0.2", path = "../../atoms"} @@ -15,5 +15,5 @@ swc_ecma_ast = {version = "0.52.0", path = "../ast"} swc_ecma_visit = {version = "0.38.1", path = "../visit"} [dev-dependencies] -swc_ecma_parser = {version = "0.70.2", path = "../parser"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} testing = {version = "0.13.0", path = "../../testing"} diff --git a/ecmascript/ext-transforms/Cargo.toml b/ecmascript/ext-transforms/Cargo.toml index 54259d3d477f..9d2e13bb0c15 100644 --- a/ecmascript/ext-transforms/Cargo.toml +++ b/ecmascript/ext-transforms/Cargo.toml @@ -5,7 +5,7 @@ documentation = "https://rustdoc.swc.rs/swc_ecma_ext_transforms/" edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_ext_transforms" -version = "0.28.1" +version = "0.29.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -14,6 +14,6 @@ phf = {version = "0.8.0", features = ["macros"]} swc_atoms = {version = "0.2", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} swc_ecma_utils = {version = "0.44.2", path = "../utils"} swc_ecma_visit = {version = "0.38.1", path = "../visit"} diff --git a/ecmascript/jsdoc/Cargo.toml b/ecmascript/jsdoc/Cargo.toml index be95239d43a8..df9ec82e6592 100644 --- a/ecmascript/jsdoc/Cargo.toml +++ b/ecmascript/jsdoc/Cargo.toml @@ -5,7 +5,7 @@ documentation = "https://rustdoc.swc.rs/jsdoc/" edition = "2018" license = "Apache-2.0/MIT" name = "jsdoc" -version = "0.38.1" +version = "0.39.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -19,6 +19,6 @@ swc_common = {version = "0.12.0", path = "../../common"} anyhow = "1" dashmap = "4.0.2" swc_ecma_ast = {version = "0.52.0", path = "../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} testing = {version = "0.13.0", path = "../../testing"} walkdir = "2" diff --git a/ecmascript/minifier/Cargo.toml b/ecmascript/minifier/Cargo.toml index b81b87a4ddd7..2653c549daa2 100644 --- a/ecmascript/minifier/Cargo.toml +++ b/ecmascript/minifier/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs", "src/lists/*.json"] license = "Apache-2.0/MIT" name = "swc_ecma_minifier" repository = "https://github.com/swc-project/swc.git" -version = "0.28.0" +version = "0.29.0" [features] debug = [] @@ -27,10 +27,10 @@ serde_regex = "1.1.0" swc_atoms = {version = "0.2", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../ast"} -swc_ecma_codegen = {version = "0.70.2", path = "../codegen"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} -swc_ecma_transforms = {version = "0.72.0", path = "../transforms/", features = ["optimization"]} -swc_ecma_transforms_base = {version = "0.31.1", path = "../transforms/base"} +swc_ecma_codegen = {version = "0.71.0", path = "../codegen"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} +swc_ecma_transforms = {version = "0.73.0", path = "../transforms/", features = ["optimization"]} +swc_ecma_transforms_base = {version = "0.32.0", path = "../transforms/base"} swc_ecma_utils = {version = "0.44.2", path = "../utils"} swc_ecma_visit = {version = "0.38.1", path = "../visit"} unicode-xid = "0.2.2" diff --git a/ecmascript/parser/Cargo.toml b/ecmascript/parser/Cargo.toml index d9e284ca7556..3b19da45ac58 100644 --- a/ecmascript/parser/Cargo.toml +++ b/ecmascript/parser/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs", "examples/**/*.rs"] license = "Apache-2.0/MIT" name = "swc_ecma_parser" repository = "https://github.com/swc-project/swc.git" -version = "0.70.4" +version = "0.71.0" [package.metadata.docs.rs] all-features = true diff --git a/ecmascript/preset-env/Cargo.toml b/ecmascript/preset-env/Cargo.toml index e9fc89fbed9c..c623cb9962d3 100644 --- a/ecmascript/preset-env/Cargo.toml +++ b/ecmascript/preset-env/Cargo.toml @@ -5,7 +5,7 @@ documentation = "https://rustdoc.swc.rs/swc_ecma_preset_env/" edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_preset_env" -version = "0.43.0" +version = "0.44.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -22,13 +22,13 @@ string_enum = {version = "0.3.1", path = "../../macros/string_enum"} swc_atoms = {version = "0.2", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../ast"} -swc_ecma_transforms = {version = "0.72.0", path = "../transforms", features = ["compat", "proposal"]} +swc_ecma_transforms = {version = "0.73.0", path = "../transforms", features = ["compat", "proposal"]} swc_ecma_utils = {version = "0.44.2", path = "../utils"} swc_ecma_visit = {version = "0.38.1", path = "../visit"} walkdir = "2" [dev-dependencies] pretty_assertions = "0.6" -swc_ecma_codegen = {version = "0.70.2", path = "../codegen"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} +swc_ecma_codegen = {version = "0.71.0", path = "../codegen"} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} testing = {version = "0.13.0", path = "../../testing"} diff --git a/ecmascript/transforms/Cargo.toml b/ecmascript/transforms/Cargo.toml index be2dd18cc41c..8a1d72961a27 100644 --- a/ecmascript/transforms/Cargo.toml +++ b/ecmascript/transforms/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms" repository = "https://github.com/swc-project/swc.git" -version = "0.72.0" +version = "0.73.0" [package.metadata.docs.rs] all-features = true @@ -24,14 +24,14 @@ typescript = ["swc_ecma_transforms_typescript"] swc_atoms = {version = "0.2.0", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "./base"} -swc_ecma_transforms_compat = {version = "0.35.0", path = "./compat", optional = true} -swc_ecma_transforms_module = {version = "0.39.0", path = "./module", optional = true} -swc_ecma_transforms_optimization = {version = "0.42.0", path = "./optimization", optional = true} -swc_ecma_transforms_proposal = {version = "0.39.0", path = "./proposal", optional = true} -swc_ecma_transforms_react = {version = "0.40.0", path = "./react", optional = true} -swc_ecma_transforms_typescript = {version = "0.41.0", path = "./typescript", optional = true} +swc_ecma_parser = {version = "0.71.0", path = "../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "./base"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "./compat", optional = true} +swc_ecma_transforms_module = {version = "0.40.0", path = "./module", optional = true} +swc_ecma_transforms_optimization = {version = "0.43.0", path = "./optimization", optional = true} +swc_ecma_transforms_proposal = {version = "0.40.0", path = "./proposal", optional = true} +swc_ecma_transforms_react = {version = "0.41.0", path = "./react", optional = true} +swc_ecma_transforms_typescript = {version = "0.42.0", path = "./typescript", optional = true} swc_ecma_utils = {version = "0.44.2", path = "../utils"} swc_ecma_visit = {version = "0.38.1", path = "../visit"} unicode-xid = "0.2" @@ -39,8 +39,8 @@ unicode-xid = "0.2" [dev-dependencies] pretty_assertions = "0.6" sourcemap = "6" -swc_ecma_codegen = {version = "0.70.2", path = "../codegen"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "./testing"} +swc_ecma_codegen = {version = "0.71.0", path = "../codegen"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "./testing"} tempfile = "3" testing = {version = "0.13.0", path = "../../testing"} walkdir = "2" diff --git a/ecmascript/transforms/base/Cargo.toml b/ecmascript/transforms/base/Cargo.toml index 30392ec6fa33..a449f34d3c9c 100644 --- a/ecmascript/transforms/base/Cargo.toml +++ b/ecmascript/transforms/base/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_base" repository = "https://github.com/swc-project/swc.git" -version = "0.31.4" +version = "0.32.0" [dependencies] fxhash = "0.2.1" @@ -17,10 +17,10 @@ smallvec = "1.6.0" swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_codegen = {version = "0.70.2", path = "../../codegen"} +swc_ecma_codegen = {version = "0.71.0", path = "../../codegen"} testing = {version = "0.13.0", path = "../../../testing"} diff --git a/ecmascript/transforms/classes/Cargo.toml b/ecmascript/transforms/classes/Cargo.toml index 6affe9f60ce2..002dc993c6f8 100644 --- a/ecmascript/transforms/classes/Cargo.toml +++ b/ecmascript/transforms/classes/Cargo.toml @@ -6,12 +6,12 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_classes" repository = "https://github.com/swc-project/swc.git" -version = "0.17.1" +version = "0.18.0" [dependencies] swc_atoms = {version = "0.2.6", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} diff --git a/ecmascript/transforms/compat/Cargo.toml b/ecmascript/transforms/compat/Cargo.toml index 17e1d3b21f2e..f1d830d65517 100644 --- a/ecmascript/transforms/compat/Cargo.toml +++ b/ecmascript/transforms/compat/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_compat" repository = "https://github.com/swc-project/swc.git" -version = "0.35.0" +version = "0.36.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -21,13 +21,13 @@ smallvec = "1.6.0" swc_atoms = {version = "0.2.5", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} -swc_ecma_transforms_classes = {version = "0.17.1", path = "../classes"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} +swc_ecma_transforms_classes = {version = "0.18.0", path = "../classes"} swc_ecma_transforms_macros = {version = "0.2.1", path = "../macros"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing"} testing = {version = "0.13.0", path = "../../../testing"} diff --git a/ecmascript/transforms/module/Cargo.toml b/ecmascript/transforms/module/Cargo.toml index 35d4a9461edb..baa4e22a6853 100644 --- a/ecmascript/transforms/module/Cargo.toml +++ b/ecmascript/transforms/module/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_module" repository = "https://github.com/swc-project/swc.git" -version = "0.39.0" +version = "0.40.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -20,12 +20,12 @@ swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} swc_ecma_loader = {version = "0.18.1", path = "../../loader", features = ["node"]} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing/"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "../compat"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing/"} testing = {version = "0.13.0", path = "../../../testing/"} diff --git a/ecmascript/transforms/optimization/Cargo.toml b/ecmascript/transforms/optimization/Cargo.toml index 0aac62f2c177..fddf81db274b 100644 --- a/ecmascript/transforms/optimization/Cargo.toml +++ b/ecmascript/transforms/optimization/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_optimization" repository = "https://github.com/swc-project/swc.git" -version = "0.42.0" +version = "0.43.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -20,16 +20,16 @@ serde_json = "1.0.61" swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} -swc_ecma_transforms_proposal = {version = "0.39.0", path = "../proposal"} -swc_ecma_transforms_react = {version = "0.40.0", path = "../react"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} -swc_ecma_transforms_typescript = {version = "0.41.0", path = "../typescript"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.40.0", path = "../module"} +swc_ecma_transforms_proposal = {version = "0.40.0", path = "../proposal"} +swc_ecma_transforms_react = {version = "0.41.0", path = "../react"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing"} +swc_ecma_transforms_typescript = {version = "0.42.0", path = "../typescript"} testing = {version = "0.13.0", path = "../../../testing"} diff --git a/ecmascript/transforms/proposal/Cargo.toml b/ecmascript/transforms/proposal/Cargo.toml index 363244eee380..c97d77e5441e 100644 --- a/ecmascript/transforms/proposal/Cargo.toml +++ b/ecmascript/transforms/proposal/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_proposal" repository = "https://github.com/swc-project/swc.git" -version = "0.39.0" +version = "0.40.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -23,16 +23,16 @@ swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} swc_ecma_loader = {version = "0.18.1", path = "../../loader", optional = true} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} -swc_ecma_transforms_classes = {version = "0.17.1", path = "../classes"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} +swc_ecma_transforms_classes = {version = "0.18.0", path = "../classes"} swc_ecma_transforms_macros = {version = "0.2.1", path = "../macros"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] serde_json = "1.0.66" -swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.40.0", path = "../module"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing"} testing = {version = "0.13.0", path = "../../../testing"} diff --git a/ecmascript/transforms/react/Cargo.toml b/ecmascript/transforms/react/Cargo.toml index a5b298b3c34e..631d528ed2ac 100644 --- a/ecmascript/transforms/react/Cargo.toml +++ b/ecmascript/transforms/react/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs"] license = "Apache-2.0/MIT" name = "swc_ecma_transforms_react" repository = "https://github.com/swc-project/swc.git" -version = "0.40.0" +version = "0.41.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -22,14 +22,14 @@ string_enum = {version = "0.3.1", path = "../../../macros/string_enum"} swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_codegen = {version = "0.70.2", path = "../../codegen/"} -swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat/"} -swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing/"} +swc_ecma_codegen = {version = "0.71.0", path = "../../codegen/"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "../compat/"} +swc_ecma_transforms_module = {version = "0.40.0", path = "../module"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing/"} testing = {version = "0.13.0", path = "../../../testing"} diff --git a/ecmascript/transforms/testing/Cargo.toml b/ecmascript/transforms/testing/Cargo.toml index 80da9ad2cce2..d2ebd500c146 100644 --- a/ecmascript/transforms/testing/Cargo.toml +++ b/ecmascript/transforms/testing/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_testing" repository = "https://github.com/swc-project/swc.git" -version = "0.32.2" +version = "0.33.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -17,9 +17,9 @@ serde = "1" serde_json = "1" swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_codegen = {version = "0.70.2", path = "../../codegen"} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_codegen = {version = "0.71.0", path = "../../codegen"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} tempfile = "3.1.0" diff --git a/ecmascript/transforms/typescript/Cargo.toml b/ecmascript/transforms/typescript/Cargo.toml index 55123ed4b771..a338656e5041 100644 --- a/ecmascript/transforms/typescript/Cargo.toml +++ b/ecmascript/transforms/typescript/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_typescript" repository = "https://github.com/swc-project/swc.git" -version = "0.41.0" +version = "0.42.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -15,16 +15,16 @@ serde = {version = "1.0.118", features = ["derive"]} swc_atoms = {version = "0.2", path = "../../../atoms"} swc_common = {version = "0.12.0", path = "../../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ast"} -swc_ecma_parser = {version = "0.70.2", path = "../../parser"} -swc_ecma_transforms_base = {version = "0.31.1", path = "../base"} +swc_ecma_parser = {version = "0.71.0", path = "../../parser"} +swc_ecma_transforms_base = {version = "0.32.0", path = "../base"} swc_ecma_utils = {version = "0.44.2", path = "../../utils"} swc_ecma_visit = {version = "0.38.1", path = "../../visit"} [dev-dependencies] -swc_ecma_codegen = {version = "0.70.2", path = "../../codegen"} -swc_ecma_transforms_compat = {version = "0.35.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.39.0", path = "../module"} -swc_ecma_transforms_proposal = {version = "0.39.0", path = "../proposal/"} -swc_ecma_transforms_testing = {version = "0.32.1", path = "../testing"} +swc_ecma_codegen = {version = "0.71.0", path = "../../codegen"} +swc_ecma_transforms_compat = {version = "0.36.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.40.0", path = "../module"} +swc_ecma_transforms_proposal = {version = "0.40.0", path = "../proposal/"} +swc_ecma_transforms_testing = {version = "0.33.0", path = "../testing"} testing = {version = "0.13.0", path = "../../../testing"} walkdir = "2.3.1" diff --git a/plugin/runner/Cargo.toml b/plugin/runner/Cargo.toml index cfb09c1ba142..42d0bd0f3ad1 100644 --- a/plugin/runner/Cargo.toml +++ b/plugin/runner/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_plugin_runner" repository = "https://github.com/swc-project/swc.git" -version = "0.4.1" +version = "0.5.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -18,9 +18,9 @@ serde_json = "1.0.64" swc_atoms = "0.2.7" swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ecmascript/ast"} -swc_ecma_parser = {version = "0.70.2", path = "../../ecmascript/parser"} +swc_ecma_parser = {version = "0.71.0", path = "../../ecmascript/parser"} swc_plugin = {version = "0.4.1", path = "../"} [dev-dependencies] -swc_ecma_codegen = {version = "0.70.2", path = "../../ecmascript/codegen"} +swc_ecma_codegen = {version = "0.71.0", path = "../../ecmascript/codegen"} testing = {version = "0.13.0", path = "../../testing"} diff --git a/plugin/testing/Cargo.toml b/plugin/testing/Cargo.toml index e00d73eb3fb7..4ccb67c926e6 100644 --- a/plugin/testing/Cargo.toml +++ b/plugin/testing/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_plugin_testing" repository = "https://github.com/swc-project/swc.git" -version = "0.4.1" +version = "0.5.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -15,7 +15,7 @@ anyhow = "1.0.41" swc_atoms = {version = "0.2.7", path = "../../atoms"} swc_common = {version = "0.12.0", path = "../../common"} swc_ecma_ast = {version = "0.52.0", path = "../../ecmascript/ast"} -swc_ecma_codegen = {version = "0.70.2", path = "../../ecmascript/codegen"} +swc_ecma_codegen = {version = "0.71.0", path = "../../ecmascript/codegen"} swc_ecma_utils = {version = "0.44.2", path = "../../ecmascript/utils"} swc_ecma_visit = {version = "0.38.1", path = "../../ecmascript/visit"} swc_plugin = {version = "0.4.1", path = "../"} From 1cdaac4df877b79834d49363eb3caa4e08d3c1c3 Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 16:05:51 +0900 Subject: [PATCH 103/105] Fix parser --- ecmascript/parser/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecmascript/parser/src/lib.rs b/ecmascript/parser/src/lib.rs index 7c1f3dbcd20c..f2f7236a0c1a 100644 --- a/ecmascript/parser/src/lib.rs +++ b/ecmascript/parser/src/lib.rs @@ -384,10 +384,10 @@ pub struct EsConfig { #[serde(default)] pub import_assertions: bool, - #[serde(default)] - #[serde(rename = "staticBlocks")] + #[serde(default, rename = "staticBlocks")] pub static_blocks: bool, - #[serde(rename = "privateInObject")] + + #[serde(default, rename = "privateInObject")] pub private_in_object: bool, } From 40b912010bcd0d36fc47eb819e195c66e6452e4f Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 16:28:33 +0900 Subject: [PATCH 104/105] Update test refs --- .../transforms/typescript/tests/strip.rs | 62 +------------------ 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/ecmascript/transforms/typescript/tests/strip.rs b/ecmascript/transforms/typescript/tests/strip.rs index 2996fd66b098..6898598d773c 100644 --- a/ecmascript/transforms/typescript/tests/strip.rs +++ b/ecmascript/transforms/typescript/tests/strip.rs @@ -3269,10 +3269,10 @@ class C { "#, r#" class C { + x; + y = 0; // Output should not use `_initialiseProps` constructor(T) { - _defineProperty(this, "x", void 0); - _defineProperty(this, "y", 0); } } @@ -4077,27 +4077,6 @@ to!( " ); -to!( - issue_1122_1, - " -const identifier = 'bar'; - -class Foo { - [identifier] = 5; -} - - -", - " -const identifier = \"bar\"; -class Foo { - constructor(){ - this[identifier] = 5; - } -} - " -); - to!( issue_1122_2, " @@ -4117,43 +4096,6 @@ class Foo { " ); -to!( - issue_1122_3, - " -const identifier = 'bar'; - -class Foo { - ['identifier'] = 5; -} - ", - " -const identifier = \"bar\"; -class Foo { - constructor(){ - this[\"identifier\"] = 5; - } -} - " -); - -to!( - issue_1122_4, - " -const identifier = 'bar'; - -class Foo { - static [identifier] = 5; -} - ", - " -const identifier = \"bar\"; -class Foo { -} -Foo[identifier] = 5; - - " -); - to!( issue_1122_5, " From 03fb28fdda08d51177454c735a48ef91f216c0ef Mon Sep 17 00:00:00 2001 From: Donny Date: Mon, 27 Sep 2021 16:36:12 +0900 Subject: [PATCH 105/105] Update test refs --- ecmascript/transforms/compat/tests/es2020_class_properties.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ecmascript/transforms/compat/tests/es2020_class_properties.rs b/ecmascript/transforms/compat/tests/es2020_class_properties.rs index 3655f1a8b031..34acab12a2dd 100644 --- a/ecmascript/transforms/compat/tests/es2020_class_properties.rs +++ b/ecmascript/transforms/compat/tests/es2020_class_properties.rs @@ -5264,10 +5264,8 @@ class MyClass { } ", " - var _get = new WeakSet(); class MyClass { constructor(){ - _get.add(this); _classStaticPrivateMethodGet(MyClass, MyClass, get).call(MyClass, foo); } }