From 46626ac64a7de87423c5b2879d6a3c998135d400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 9 May 2024 15:11:59 +0200 Subject: [PATCH] Update the Babel plugin to remove empty class constructors This only happens when it's safe to do so. The exceptions are: - when the class extends another subclass: removing the constructor would remove the error about the missing super() call - when there are default parameters, that could have side effects - when there are destructured prameters, that could have side effects --- .../babel-plugin-pdfjs-preprocessor.mjs | 20 ++++++++++ .../fixtures_babel/constructors-expected.js | 23 ++++++++++++ .../builder/fixtures_babel/constructors.js | 37 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 external/builder/fixtures_babel/constructors-expected.js create mode 100644 external/builder/fixtures_babel/constructors.js diff --git a/external/builder/babel-plugin-pdfjs-preprocessor.mjs b/external/builder/babel-plugin-pdfjs-preprocessor.mjs index 945d22c47..8c5254e73 100644 --- a/external/builder/babel-plugin-pdfjs-preprocessor.mjs +++ b/external/builder/babel-plugin-pdfjs-preprocessor.mjs @@ -234,6 +234,26 @@ function babelPluginPDFJSPreprocessor(babel, ctx) { } }, }, + ClassMethod: { + exit(path) { + const { + node, + parentPath: { parent: classNode }, + } = path; + if ( + // Remove empty constructors. We only do this for + // base classes, as the default constructor of derived + // classes is not empty (and an empty constructor + // must throw at runtime when constructed). + node.kind === "constructor" && + node.body.body.length === 0 && + node.params.every(p => p.type === "Identifier") && + !classNode.superClass + ) { + path.remove(); + } + }, + }, }, }; } diff --git a/external/builder/fixtures_babel/constructors-expected.js b/external/builder/fixtures_babel/constructors-expected.js new file mode 100644 index 000000000..841e53851 --- /dev/null +++ b/external/builder/fixtures_babel/constructors-expected.js @@ -0,0 +1,23 @@ +class A { + constructor() { + console.log("Hi!"); + } +} +class B { + constructor(x = console.log("Hi!")) {} +} +class C { + constructor({ + x + }) {} +} +class D {} +class E extends A { + constructor() {} +} +class F { + constructor() { + var a = 0; + } +} +class G {} diff --git a/external/builder/fixtures_babel/constructors.js b/external/builder/fixtures_babel/constructors.js new file mode 100644 index 000000000..8d7f41216 --- /dev/null +++ b/external/builder/fixtures_babel/constructors.js @@ -0,0 +1,37 @@ +class A { + constructor() { + console.log("Hi!"); + } +} + +class B { + constructor(x = console.log("Hi!")) {} +} + +class C { + constructor({ x }) {} +} + +class D { + constructor(x, y, z) {} +} + +class E extends A { + constructor() {} +} + +class F { + constructor() { + if (PDFJSDev.test('TRUE')) { + var a = 0; + } + } +} + +class G { + constructor() { + if (PDFJSDev.test('FALSE')) { + var a = 0; + } + } +}