From 8063fde0d8c23826c7ee5d8b07887e100f974b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 12 Feb 2021 14:33:23 +0100 Subject: [PATCH] Reuse the `readOnlyError` helper for private methods (#12792) --- .../src/fields.js | 4 +++- packages/babel-helpers/src/helpers.js | 13 ++++++++----- .../fixtures/accessors/set-only-getter/output.js | 2 +- .../test/fixtures/private-method/read-only/exec.js | 9 +++++++++ .../fixtures/private-method/read-only/input.js | 7 +++++++ .../fixtures/private-method/read-only/output.js | 14 ++++++++++++++ 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index aca3cfa755..438335e5b9 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -294,7 +294,9 @@ const privateNameHandlerSpec = { value, ]); } - return t.callExpression(file.addHelper("classPrivateMethodSet"), []); + return t.callExpression(file.addHelper("readOnlyError"), [ + t.stringLiteral(`#${name}`), + ]); } return t.callExpression(file.addHelper("classPrivateFieldSet"), [ this.receiver(member), diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index f05e23bcc4..9eec007db4 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -2092,11 +2092,14 @@ helpers.classPrivateMethodGet = helper("7.1.6")` } `; -helpers.classPrivateMethodSet = helper("7.1.6")` - export default function _classPrivateMethodSet() { - throw new TypeError("attempted to reassign private method"); - } -`; +if (!process.env.BABEL_8_BREAKING) { + // Use readOnlyError instead + helpers.classPrivateMethodSet = helper("7.1.6")` + export default function _classPrivateMethodSet() { + throw new TypeError("attempted to reassign private method"); + } + `; +} helpers.wrapRegExp = helper("7.2.6")` import wrapNativeSuper from "wrapNativeSuper"; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js index f6bb09d910..7fe1e2be6f 100644 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors/set-only-getter/output.js @@ -14,7 +14,7 @@ class Cl { value: 0 }); - babelHelpers.classPrivateMethodSet(); + babelHelpers.readOnlyError("#privateFieldValue"); } } diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js new file mode 100644 index 0000000000..4bdbb3b3ac --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/exec.js @@ -0,0 +1,9 @@ +class A { + #method() {} + + run() { + this.#method = 2; + } +} + +expect(() => new A().run()).toThrow(TypeError); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js new file mode 100644 index 0000000000..6667af5411 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/input.js @@ -0,0 +1,7 @@ +class A { + #method() {} + + run() { + this.#method = 2; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js new file mode 100644 index 0000000000..72ecfd2576 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method/read-only/output.js @@ -0,0 +1,14 @@ +var _method = new WeakSet(); + +class A { + constructor() { + _method.add(this); + } + + run() { + babelHelpers.readOnlyError("#method"); + } + +} + +var _method2 = function _method2() {};