From e08f71c0ef30610d33d4ac5f47b6d69788bcd23a Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 17 Sep 2018 14:58:55 +0200 Subject: [PATCH] keep/restore comments in export default fixes #8039 --- .../HarmonyExportDependencyParserPlugin.js | 17 ++++++++++++++++- .../HarmonyExportExpressionDependency.js | 9 +++++++-- .../harmony-pure-default/index.js | 11 +++++++++++ .../harmony-pure-default/module1.js | 9 +++++++++ .../harmony-pure-default/module2.js | 9 +++++++++ .../harmony-pure-default/module3.js | 9 +++++++++ .../harmony-pure-default/module4.js | 15 +++++++++++++++ .../harmony-pure-default/webpack.config.js | 7 +++++++ 8 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 test/configCases/code-generation/harmony-pure-default/index.js create mode 100644 test/configCases/code-generation/harmony-pure-default/module1.js create mode 100644 test/configCases/code-generation/harmony-pure-default/module2.js create mode 100644 test/configCases/code-generation/harmony-pure-default/module3.js create mode 100644 test/configCases/code-generation/harmony-pure-default/module4.js create mode 100644 test/configCases/code-generation/harmony-pure-default/webpack.config.js diff --git a/lib/dependencies/HarmonyExportDependencyParserPlugin.js b/lib/dependencies/HarmonyExportDependencyParserPlugin.js index de2d9c257e2..6ab0c0fe154 100644 --- a/lib/dependencies/HarmonyExportDependencyParserPlugin.js +++ b/lib/dependencies/HarmonyExportDependencyParserPlugin.js @@ -54,10 +54,25 @@ module.exports = class HarmonyExportDependencyParserPlugin { parser.hooks.exportExpression.tap( "HarmonyExportDependencyParserPlugin", (statement, expr) => { + const comments = parser.getComments([ + statement.range[0], + expr.range[0] + ]); const dep = new HarmonyExportExpressionDependency( parser.state.module, expr.range, - statement.range + statement.range, + comments + .map(c => { + switch (c.type) { + case "Block": + return `/*${c.value}*/`; + case "Line": + return `//${c.value}\n`; + } + return ""; + }) + .join("") ); dep.loc = Object.create(statement.loc); dep.loc.index = -1; diff --git a/lib/dependencies/HarmonyExportExpressionDependency.js b/lib/dependencies/HarmonyExportExpressionDependency.js index 1f12f9d76ef..dfb499add64 100644 --- a/lib/dependencies/HarmonyExportExpressionDependency.js +++ b/lib/dependencies/HarmonyExportExpressionDependency.js @@ -6,11 +6,12 @@ const NullDependency = require("./NullDependency"); class HarmonyExportExpressionDependency extends NullDependency { - constructor(originModule, range, rangeStatement) { + constructor(originModule, range, rangeStatement, prefix) { super(); this.originModule = originModule; this.range = range; this.rangeStatement = rangeStatement; + this.prefix = prefix; } get type() { @@ -31,7 +32,11 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla const content = this.getContent(dep.originModule, used); if (dep.range) { - source.replace(dep.rangeStatement[0], dep.range[0] - 1, content + "("); + source.replace( + dep.rangeStatement[0], + dep.range[0] - 1, + content + "(" + dep.prefix + ); source.replace(dep.range[1], dep.rangeStatement[1] - 1, ");"); return; } diff --git a/test/configCases/code-generation/harmony-pure-default/index.js b/test/configCases/code-generation/harmony-pure-default/index.js new file mode 100644 index 00000000000..118a3f377a4 --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/index.js @@ -0,0 +1,11 @@ +import { value as v1 } from "./module1"; +import { value as v2 } from "./module2"; +import { value as v3 } from "./module3"; +import { value as v4 } from "./module4"; + +it("should not execute exports when annotated with pure comment", () => { + expect(v1).toBe(42); + expect(v2).toBe(42); + expect(v3).toBe(42); + expect(v4).toBe(42); +}); diff --git a/test/configCases/code-generation/harmony-pure-default/module1.js b/test/configCases/code-generation/harmony-pure-default/module1.js new file mode 100644 index 00000000000..ff5746bdac4 --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/module1.js @@ -0,0 +1,9 @@ +let value = 42; + +const inc = () => { + value++; +}; + +export default /*#__PURE__*/inc(); + +export { value }; diff --git a/test/configCases/code-generation/harmony-pure-default/module2.js b/test/configCases/code-generation/harmony-pure-default/module2.js new file mode 100644 index 00000000000..cf69c28f83d --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/module2.js @@ -0,0 +1,9 @@ +let value = 42; + +const inc = () => { + value++; +}; + +export default (/*#__PURE__*/inc()); + +export { value }; diff --git a/test/configCases/code-generation/harmony-pure-default/module3.js b/test/configCases/code-generation/harmony-pure-default/module3.js new file mode 100644 index 00000000000..e7e874cd6d3 --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/module3.js @@ -0,0 +1,9 @@ +let value = 42; + +const inc = () => { + value++; +}; + +export default /*#__PURE__*/(inc()); + +export { value }; diff --git a/test/configCases/code-generation/harmony-pure-default/module4.js b/test/configCases/code-generation/harmony-pure-default/module4.js new file mode 100644 index 00000000000..c312ca1772a --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/module4.js @@ -0,0 +1,15 @@ +let value = 42; + +const inc = () => { + value++; +}; + +export +// hello +default +// world +/*#__PURE__*/ +inc() +; + +export { value }; diff --git a/test/configCases/code-generation/harmony-pure-default/webpack.config.js b/test/configCases/code-generation/harmony-pure-default/webpack.config.js new file mode 100644 index 00000000000..94fea42dc99 --- /dev/null +++ b/test/configCases/code-generation/harmony-pure-default/webpack.config.js @@ -0,0 +1,7 @@ +module.exports = { + mode: "production", + optimization: { + minimize: true, + concatenateModules: false + } +};