From 3755a3ec8ae801a112d0a4bae6879dc7a9bc3df8 Mon Sep 17 00:00:00 2001 From: David Michon Date: Wed, 26 Feb 2025 04:03:47 -0800 Subject: [PATCH] fix: forward semicolons from meta.webpackAST (#19252) --- lib/javascript/JavascriptParser.js | 7 +++++++ test/cases/parsing/precreated-ast/ast-loader.js | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index 084292385..0ccf0a069 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -4379,6 +4379,13 @@ class JavascriptParser extends Parser { if (typeof source === "object") { ast = /** @type {Program} */ (source); comments = source.comments; + if (source.semicolons) { + // Forward semicolon information from the preparsed AST if present + // This ensures the output is consistent with that of a fresh AST + for (const pos of source.semicolons) { + semicolons.add(pos); + } + } } else { comments = []; ast = JavascriptParser._parse(source, { diff --git a/test/cases/parsing/precreated-ast/ast-loader.js b/test/cases/parsing/precreated-ast/ast-loader.js index e15037726..52ba5cc6e 100644 --- a/test/cases/parsing/precreated-ast/ast-loader.js +++ b/test/cases/parsing/precreated-ast/ast-loader.js @@ -7,12 +7,14 @@ const acornParser = acorn.Parser; module.exports = function (source) { const comments = []; + const semicolons = new Set(); const ast = acornParser.parse(source, { ranges: true, locations: true, ecmaVersion: 11, sourceType: "module", - onComment: comments + onComment: comments, + onInsertedSemicolon: (pos) => semicolons.add(pos) }); // change something to test if it's really used @@ -23,6 +25,8 @@ module.exports = function (source) { //@ts-ignore ast.comments = comments; + //@ts-ignore + ast.semicolons = semicolons; this.callback(null, source, null, { webpackAST: ast });