From 7361f7af34ab03f6558cfd9bb22f85ea10def271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 31 Jan 2021 01:19:10 +0100 Subject: [PATCH] Implement `noCallClass` assumption --- .../src/config/validation/options.js | 1 + .../src/index.js | 2 ++ .../src/transformClass.js | 3 ++- .../assumption-noCallClass/class/input.js | 1 + .../assumption-noCallClass/class/output.js | 3 +++ .../assumption-noCallClass/options.json | 12 +++++++++++ .../with-constructor/input.js | 11 ++++++++++ .../with-constructor/output.js | 19 ++++++++++++++++++ .../with-superClass/input.js | 8 ++++++++ .../with-superClass/output.js | 20 +++++++++++++++++++ 10 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/output.js diff --git a/packages/babel-core/src/config/validation/options.js b/packages/babel-core/src/config/validation/options.js index ae9f8b14e6d2..02db36ed7867 100644 --- a/packages/babel-core/src/config/validation/options.js +++ b/packages/babel-core/src/config/validation/options.js @@ -341,6 +341,7 @@ export const assumptionsNames = new Set([ "iterableIsArray", "mutableTemplateObject", "newableArrowFunctions", + "noCallClass", "noDocumentAll", "objectRestNoSymbols", "privateFieldsAsProperties", diff --git a/packages/babel-plugin-transform-classes/src/index.js b/packages/babel-plugin-transform-classes/src/index.js index e7254d5cee62..b7942762d8a3 100644 --- a/packages/babel-plugin-transform-classes/src/index.js +++ b/packages/babel-plugin-transform-classes/src/index.js @@ -25,6 +25,7 @@ export default declare((api, options) => { const constantSuper = api.assumption("constantSuper") ?? options.loose; const superIsCallableConstructor = api.assumption("superIsCallableConstructor") ?? options.loose; + const noCallClass = api.assumption("noCallClass") ?? options.loose; // todo: investigate traversal requeueing const VISITED = Symbol(); @@ -67,6 +68,7 @@ export default declare((api, options) => { setClassMethods, constantSuper, superIsCallableConstructor, + noCallClass, }), ); diff --git a/packages/babel-plugin-transform-classes/src/transformClass.js b/packages/babel-plugin-transform-classes/src/transformClass.js index f3e74076b4fa..908b09a25c91 100644 --- a/packages/babel-plugin-transform-classes/src/transformClass.js +++ b/packages/babel-plugin-transform-classes/src/transformClass.js @@ -16,6 +16,7 @@ type ClassAssumptions = { setClassMethods: boolean, constantSuper: boolean, superIsCallableConstructor: boolean, + noCallClass: boolean, }; function buildConstructor(classRef, constructorBody, node) { @@ -650,7 +651,7 @@ export default function transformClass( buildBody(); // make sure this class isn't directly called (with A() instead new A()) - if (!classState.isLoose) { + if (!assumptions.noCallClass) { constructorBody.body.unshift( t.expressionStatement( t.callExpression(classState.file.addHelper("classCallCheck"), [ diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/input.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/input.js new file mode 100644 index 000000000000..a869c2849526 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/input.js @@ -0,0 +1 @@ +class A {} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/output.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/output.js new file mode 100644 index 000000000000..60718092a600 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/class/output.js @@ -0,0 +1,3 @@ +var A = function A() { + "use strict"; +}; diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/options.json b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/options.json new file mode 100644 index 000000000000..a84727399b4c --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/options.json @@ -0,0 +1,12 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "transform-function-name", + "transform-classes", + ["transform-spread", { "loose": true }], + "transform-block-scoping" + ], + "assumptions": { + "noCallClass": true + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/input.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/input.js new file mode 100644 index 000000000000..9da66478b288 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/input.js @@ -0,0 +1,11 @@ +class A { + constructor() { + console.log('a'); + } +} + +class B { + b() { + console.log('b'); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/output.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/output.js new file mode 100644 index 000000000000..a9666614fef8 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-constructor/output.js @@ -0,0 +1,19 @@ +var A = function A() { + "use strict"; + + console.log('a'); +}; + +var B = /*#__PURE__*/function () { + "use strict"; + + function B() {} + + babelHelpers.createClass(B, [{ + key: "b", + value: function b() { + console.log('b'); + } + }]); + return B; +}(); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/input.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/input.js new file mode 100644 index 000000000000..76bb1ebddfbf --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/input.js @@ -0,0 +1,8 @@ +class B {} + +class A extends B { + constructor(track) { + if (track !== undefined) super(track); + else super(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/output.js b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/output.js new file mode 100644 index 000000000000..1d09fd08d8e6 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/assumption-noCallClass/with-superClass/output.js @@ -0,0 +1,20 @@ +var B = function B() { + "use strict"; +}; + +var A = /*#__PURE__*/function (_B) { + "use strict"; + + babelHelpers.inherits(A, _B); + + var _super = babelHelpers.createSuper(A); + + function A(track) { + var _this; + + if (track !== undefined) _this = _super.call(this, track);else _this = _super.call(this); + return babelHelpers.possibleConstructorReturn(_this); + } + + return A; +}(B);