From c5e3b6d4bc6ff21cfe4ffbfb1e7446f68e07880e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 23 Aug 2018 00:54:28 +0200 Subject: [PATCH] [decorators] Don't set writable on accessors (#8513) --- packages/babel-helpers/src/helpers.js | 4 +++- .../static-property-tdz/decorator-interop/output.js | 2 +- .../method-decorators/output.mjs | 2 +- .../test/fixtures/legacy-regression/8041/output.mjs | 2 +- .../test/fixtures/legacy-regression/8512/exec.js | 8 ++++++++ .../test/fixtures/legacy-regression/8512/options.json | 5 +++++ 6 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/exec.js create mode 100644 packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/options.json diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 2960143099..eda37ef983 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -978,7 +978,9 @@ helpers.applyDecoratedDescriptor = helper("7.0.0-beta.0")` }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; - desc.writable = !!desc.writable; + if ('value' in desc || desc.initializer){ + desc.writable = true; + } desc = decorators.slice().reverse().reduce(function(desc, decorator){ return decorator(target, property, desc) || desc; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/static-property-tdz/decorator-interop/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/static-property-tdz/decorator-interop/output.js index c3417c3e98..70334680ce 100644 --- a/packages/babel-plugin-proposal-class-properties/test/fixtures/static-property-tdz/decorator-interop/output.js +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/static-property-tdz/decorator-interop/output.js @@ -8,7 +8,7 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; desc.writable = !!desc.writable; desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and set to use loose mode. ' + 'To use proposal-class-properties in spec mode with decorators, wait for ' + 'the next major version of decorators in stage 2.'); } diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs index 1dcda22f4f..27b1191153 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-decl-to-expression/method-decorators/output.mjs @@ -1,6 +1,6 @@ var _class, _class2; -function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; desc.writable = !!desc.writable; desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } let A = (_class2 = class A { foo() {} diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8041/output.mjs b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8041/output.mjs index 85211269c5..f35dc48db9 100644 --- a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8041/output.mjs +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8041/output.mjs @@ -1,6 +1,6 @@ var _class2; -function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; desc.writable = !!desc.writable; desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } let _class = (_class2 = class { bar() {} diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/exec.js b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/exec.js new file mode 100644 index 0000000000..93e39c5153 --- /dev/null +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/exec.js @@ -0,0 +1,8 @@ +function dec(Class, key, desc) { + return desc; +} + +class Foo { + @dec + get bar() {} +} diff --git a/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/options.json b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/options.json new file mode 100644 index 0000000000..211ac2f514 --- /dev/null +++ b/packages/babel-plugin-proposal-decorators/test/fixtures/legacy-regression/8512/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["proposal-decorators", { "legacy": true }] + ] +}