From 83d878d34ce9e9677bb95a02013b1376391c14cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 9 May 2024 15:05:11 +0200 Subject: [PATCH 1/2] Rename builder esprima fixtures to babel f724ae98a1c0859885083448e2cbc3f3d4c31cf1 changed the build script to use Babel, so this commit updates the file names accordingly --- .eslintignore | 2 +- .prettierignore | 2 +- .stylelintignore | 2 +- .../{fixtures_esprima => fixtures_babel}/blocks-expected.js | 0 .../builder/{fixtures_esprima => fixtures_babel}/blocks.js | 0 .../{fixtures_esprima => fixtures_babel}/comments-expected.js | 0 .../builder/{fixtures_esprima => fixtures_babel}/comments.js | 0 .../constants-expected.js | 0 .../builder/{fixtures_esprima => fixtures_babel}/constants.js | 0 .../{fixtures_esprima => fixtures_babel}/deadcode-expected.js | 0 .../builder/{fixtures_esprima => fixtures_babel}/deadcode.js | 0 .../{fixtures_esprima => fixtures_babel}/evals-expected.js | 0 .../builder/{fixtures_esprima => fixtures_babel}/evals.js | 2 +- .../builder/{fixtures_esprima => fixtures_babel}/evals.json | 0 .../{fixtures_esprima => fixtures_babel}/ifs-expected.js | 0 external/builder/{fixtures_esprima => fixtures_babel}/ifs.js | 0 .../importalias-expected.js | 0 .../{fixtures_esprima => fixtures_babel}/importalias.js | 0 .../{test-fixtures_esprima.mjs => test-fixtures_babel.mjs} | 4 ++-- gulpfile.mjs | 4 ++-- 20 files changed, 8 insertions(+), 8 deletions(-) rename external/builder/{fixtures_esprima => fixtures_babel}/blocks-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/blocks.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/comments-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/comments.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/constants-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/constants.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/deadcode-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/deadcode.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/evals-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/evals.js (85%) rename external/builder/{fixtures_esprima => fixtures_babel}/evals.json (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/ifs-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/ifs.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/importalias-expected.js (100%) rename external/builder/{fixtures_esprima => fixtures_babel}/importalias.js (100%) rename external/builder/{test-fixtures_esprima.mjs => test-fixtures_babel.mjs} (93%) diff --git a/.eslintignore b/.eslintignore index 31317afd2..a1279de75 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,7 +4,7 @@ docs/ node_modules/ external/bcmaps/ external/builder/fixtures/ -external/builder/fixtures_esprima/ +external/builder/fixtures_babel/ external/quickjs/ external/openjpeg/ test/tmp/ diff --git a/.prettierignore b/.prettierignore index 05172be1e..e33594bd7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,7 +4,7 @@ docs/ node_modules/ external/bcmaps/ external/builder/fixtures/ -external/builder/fixtures_esprima/ +external/builder/fixtures_babel/ external/quickjs/ test/tmp/ test/pdfs/ diff --git a/.stylelintignore b/.stylelintignore index 05172be1e..e33594bd7 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -4,7 +4,7 @@ docs/ node_modules/ external/bcmaps/ external/builder/fixtures/ -external/builder/fixtures_esprima/ +external/builder/fixtures_babel/ external/quickjs/ test/tmp/ test/pdfs/ diff --git a/external/builder/fixtures_esprima/blocks-expected.js b/external/builder/fixtures_babel/blocks-expected.js similarity index 100% rename from external/builder/fixtures_esprima/blocks-expected.js rename to external/builder/fixtures_babel/blocks-expected.js diff --git a/external/builder/fixtures_esprima/blocks.js b/external/builder/fixtures_babel/blocks.js similarity index 100% rename from external/builder/fixtures_esprima/blocks.js rename to external/builder/fixtures_babel/blocks.js diff --git a/external/builder/fixtures_esprima/comments-expected.js b/external/builder/fixtures_babel/comments-expected.js similarity index 100% rename from external/builder/fixtures_esprima/comments-expected.js rename to external/builder/fixtures_babel/comments-expected.js diff --git a/external/builder/fixtures_esprima/comments.js b/external/builder/fixtures_babel/comments.js similarity index 100% rename from external/builder/fixtures_esprima/comments.js rename to external/builder/fixtures_babel/comments.js diff --git a/external/builder/fixtures_esprima/constants-expected.js b/external/builder/fixtures_babel/constants-expected.js similarity index 100% rename from external/builder/fixtures_esprima/constants-expected.js rename to external/builder/fixtures_babel/constants-expected.js diff --git a/external/builder/fixtures_esprima/constants.js b/external/builder/fixtures_babel/constants.js similarity index 100% rename from external/builder/fixtures_esprima/constants.js rename to external/builder/fixtures_babel/constants.js diff --git a/external/builder/fixtures_esprima/deadcode-expected.js b/external/builder/fixtures_babel/deadcode-expected.js similarity index 100% rename from external/builder/fixtures_esprima/deadcode-expected.js rename to external/builder/fixtures_babel/deadcode-expected.js diff --git a/external/builder/fixtures_esprima/deadcode.js b/external/builder/fixtures_babel/deadcode.js similarity index 100% rename from external/builder/fixtures_esprima/deadcode.js rename to external/builder/fixtures_babel/deadcode.js diff --git a/external/builder/fixtures_esprima/evals-expected.js b/external/builder/fixtures_babel/evals-expected.js similarity index 100% rename from external/builder/fixtures_esprima/evals-expected.js rename to external/builder/fixtures_babel/evals-expected.js diff --git a/external/builder/fixtures_esprima/evals.js b/external/builder/fixtures_babel/evals.js similarity index 85% rename from external/builder/fixtures_esprima/evals.js rename to external/builder/fixtures_babel/evals.js index db03ab047..94ec543b0 100644 --- a/external/builder/fixtures_esprima/evals.js +++ b/external/builder/fixtures_babel/evals.js @@ -5,7 +5,7 @@ var d = PDFJSDev.test('FALSE'); var e = PDFJSDev.eval('TRUE'); var f = PDFJSDev.eval('TEXT'); var g = PDFJSDev.eval('OBJ'); -var h = PDFJSDev.json('$ROOT/external/builder/fixtures_esprima/evals.json'); +var h = PDFJSDev.json('$ROOT/external/builder/fixtures_babel/evals.json'); var i = typeof PDFJSDev === 'undefined' ? PDFJSDev.eval('FALSE') : '0'; var j = typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('OBJ.obj') : '0'; var k = !PDFJSDev.test('TRUE'); diff --git a/external/builder/fixtures_esprima/evals.json b/external/builder/fixtures_babel/evals.json similarity index 100% rename from external/builder/fixtures_esprima/evals.json rename to external/builder/fixtures_babel/evals.json diff --git a/external/builder/fixtures_esprima/ifs-expected.js b/external/builder/fixtures_babel/ifs-expected.js similarity index 100% rename from external/builder/fixtures_esprima/ifs-expected.js rename to external/builder/fixtures_babel/ifs-expected.js diff --git a/external/builder/fixtures_esprima/ifs.js b/external/builder/fixtures_babel/ifs.js similarity index 100% rename from external/builder/fixtures_esprima/ifs.js rename to external/builder/fixtures_babel/ifs.js diff --git a/external/builder/fixtures_esprima/importalias-expected.js b/external/builder/fixtures_babel/importalias-expected.js similarity index 100% rename from external/builder/fixtures_esprima/importalias-expected.js rename to external/builder/fixtures_babel/importalias-expected.js diff --git a/external/builder/fixtures_esprima/importalias.js b/external/builder/fixtures_babel/importalias.js similarity index 100% rename from external/builder/fixtures_esprima/importalias.js rename to external/builder/fixtures_babel/importalias.js diff --git a/external/builder/test-fixtures_esprima.mjs b/external/builder/test-fixtures_babel.mjs similarity index 93% rename from external/builder/test-fixtures_esprima.mjs rename to external/builder/test-fixtures_babel.mjs index 5eccb66c0..e7afa4de4 100644 --- a/external/builder/test-fixtures_esprima.mjs +++ b/external/builder/test-fixtures_babel.mjs @@ -7,7 +7,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); let errors = 0; -const baseDir = path.join(__dirname, "fixtures_esprima"); +const baseDir = path.join(__dirname, "fixtures_babel"); const files = fs .readdirSync(baseDir) .filter(function (name) { @@ -49,7 +49,7 @@ files.forEach(function (expectationFilename) { errors++; // Allow regenerating the expected output using - // OVERWRITE=true node ./external/builder/test-fixtures_esprima.mjs + // OVERWRITE=true node ./external/builder/test-fixtures_babel.mjs if (process.env.OVERWRITE) { fs.writeFileSync(expectationFilename, out + "\n"); } diff --git a/gulpfile.mjs b/gulpfile.mjs index 4f3af9d64..4b624942d 100644 --- a/gulpfile.mjs +++ b/gulpfile.mjs @@ -2414,8 +2414,8 @@ gulp.task("externaltest", function (done) { }); console.log(); - console.log("### Running test-fixtures_esprima.js"); - safeSpawnSync("node", ["external/builder/test-fixtures_esprima.mjs"], { + console.log("### Running test-fixtures_babel.js"); + safeSpawnSync("node", ["external/builder/test-fixtures_babel.mjs"], { stdio: "inherit", }); done(); 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 2/2] 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; + } + } +}