From d0a965b71f867f2b617e4cdfe1e3dc02cd53ec76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 1 Feb 2021 20:16:10 +0100 Subject: [PATCH] Throw when compiling spread in `super()` but not classes (#12722) * Throw when compiling spread in `super()` but not classes * Add comment --- .../babel-plugin-transform-spread/src/index.js | 8 +++++++- .../spread/super-classes-plugin-after/input.js | 5 +++++ .../spread/super-classes-plugin-after/options.json | 7 +++++++ .../spread/super-classes-plugin-after/output.js | 14 ++++++++++++++ .../spread/super-classes-plugin-before/input.js | 5 +++++ .../super-classes-plugin-before/options.json | 7 +++++++ .../spread/super-classes-plugin-before/output.js | 14 ++++++++++++++ .../spread/super-no-classes-plugin/input.js | 5 +++++ .../spread/super-no-classes-plugin/options.json | 7 +++++++ 9 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index dcd933a1fa7e..3bacc1f677fc 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -97,7 +97,13 @@ export default declare((api, options) => { const calleePath = skipTransparentExprWrappers(path.get("callee")); - if (calleePath.isSuper()) return; + if (calleePath.isSuper()) { + // NOTE: spread and classes have almost the same compat data, so this is very unlikely to happen in practice. + throw path.buildCodeFrameError( + "It's not possible to compile spread arguments in `super()` without compiling classes.\n" + + "Please add '@babel/plugin-transform-classes' to your Babel configuration.", + ); + } let contextLiteral = scope.buildUndefinedNode(); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json new file mode 100644 index 000000000000..1271efa2901b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-spread", + "transform-classes" + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js new file mode 100644 index 000000000000..8b058b76862a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-after/output.js @@ -0,0 +1,14 @@ +let A = /*#__PURE__*/function (_B) { + "use strict"; + + babelHelpers.inherits(A, _B); + + var _super = babelHelpers.createSuper(A); + + function A() { + babelHelpers.classCallCheck(this, A); + return _super.call.apply(_super, [this].concat(babelHelpers.toConsumableArray(foo))); + } + + return A; +}(B); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json new file mode 100644 index 000000000000..b99834520858 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-classes", + "transform-spread" + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js new file mode 100644 index 000000000000..8b058b76862a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-classes-plugin-before/output.js @@ -0,0 +1,14 @@ +let A = /*#__PURE__*/function (_B) { + "use strict"; + + babelHelpers.inherits(A, _B); + + var _super = babelHelpers.createSuper(A); + + function A() { + babelHelpers.classCallCheck(this, A); + return _super.call.apply(_super, [this].concat(babelHelpers.toConsumableArray(foo))); + } + + return A; +}(B); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js new file mode 100644 index 000000000000..d68270209a6b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/input.js @@ -0,0 +1,5 @@ +class A extends B { + constructor() { + super(...foo); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json new file mode 100644 index 000000000000..9286e543ef3a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/super-no-classes-plugin/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-spread" + ], + "throws": "It's not possible to compile spread arguments in `super()` without compiling classes." +}