From 234fc91cd7023e147ebdba0c547a6c8d61ed2ad0 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Thu, 25 May 2023 17:33:58 +0300 Subject: [PATCH 1/4] fix: regression in inner graph --- lib/javascript/JavascriptParser.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index c56a556a558..0c1e483b3f9 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -3997,6 +3997,7 @@ class JavascriptParser extends Parser { case "FunctionExpression": case "ArrowFunctionExpression": case "Literal": + case "Identifier": case "PrivateIdentifier": return true; From b34ff83135e0ee84382fbb1b1a7b1bb146f282c6 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Thu, 25 May 2023 17:55:42 +0300 Subject: [PATCH 2/4] test: added --- test/cases/inner-graph/extend-class2/dep-decl.js | 10 ++++++++-- test/cases/inner-graph/extend-class2/dep-expr.js | 10 ++++++++-- test/cases/inner-graph/extend-class2/dep2.js | 2 ++ test/cases/inner-graph/extend-class2/dep3.js | 1 + test/cases/inner-graph/extend-class2/index.js | 9 ++++++++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js index 454aadd3d48..fb9c9659014 100644 --- a/test/cases/inner-graph/extend-class2/dep-decl.js +++ b/test/cases/inner-graph/extend-class2/dep-decl.js @@ -1,5 +1,5 @@ -import { A, B, getC, getD, getE, getF, Foo } from "./dep2?decl"; -import { A3, B3, C3, D3, E3, F3 } from "./dep3?decl"; +import { A, B, getC, getD, getE, getF, Foo, Pure } from "./dep2?decl"; +import { A3, B3, C3, D3, E3, F3, Pure3 } from "./dep3?decl"; export class A1 extends A { render() { @@ -133,6 +133,12 @@ export default class DefaultBar extends Foo { } } +export class ExtendsPure extends Pure { + render() { + return new Pure3(); + } +} + export class A2 extends A3 {} export class B2 extends B3 {} export class C2 extends C3 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js index afa476b438c..eafdefff736 100644 --- a/test/cases/inner-graph/extend-class2/dep-expr.js +++ b/test/cases/inner-graph/extend-class2/dep-expr.js @@ -1,5 +1,5 @@ -import { A, B, getC, getD, getE, getF } from "./dep2?expr"; -import { A3, B3, C3, D3, E3, F3 } from "./dep3?expr"; +import { A, B, getC, getD, getE, getF, Pure } from "./dep2?expr"; +import { A3, B3, C3, D3, E3, F3, Pure3} from "./dep3?expr"; export const A1 = class extends A { render() { @@ -39,6 +39,12 @@ export const F1 = class extends getF() { } }; +export const ExtendsPure = class extends Pure { + render() { + return new Pure3(); + } +}; + export const A2 = class extends A3 {}; export const B2 = class extends B3 {}; export const C2 = class extends C3 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js index 48e3af7edf5..07fd4ad09dd 100644 --- a/test/cases/inner-graph/extend-class2/dep2.js +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -5,6 +5,7 @@ export const getD = () => class D {}; export const getE = () => class E {}; export const getF = () => class F {}; export class Foo { static Bar = Foo; } +export class Pure {} export const exportsInfoForA = __webpack_exports_info__.A.used; export const exportsInfoForB = __webpack_exports_info__.B.used; @@ -13,3 +14,4 @@ export const exportsInfoForD = __webpack_exports_info__.getD.used; export const exportsInfoForE = __webpack_exports_info__.getE.used; export const exportsInfoForF = __webpack_exports_info__.getF.used; export const exportsInfoForFoo = __webpack_exports_info__.Foo.used; +export const exportsInfoForPure = __webpack_exports_info__.Pure.used; diff --git a/test/cases/inner-graph/extend-class2/dep3.js b/test/cases/inner-graph/extend-class2/dep3.js index 974ee9572d0..8f8ba61ff67 100644 --- a/test/cases/inner-graph/extend-class2/dep3.js +++ b/test/cases/inner-graph/extend-class2/dep3.js @@ -4,3 +4,4 @@ export class C3 {} export class D3 {} export class E3 {} export class F3 {} +export class Pure3 {} diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index ffc0fc23beb..dc3d9052b06 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -5,7 +5,8 @@ import { exportsInfoForD as declD, exportsInfoForE as declE, exportsInfoForF as declF, - exportsInfoForFoo as declFoo + exportsInfoForFoo as declFoo, + exportsInfoForPure as declPure } from "./dep2?decl"; import { exportsInfoForA as exprA, @@ -14,6 +15,7 @@ import { exportsInfoForD as exprD, exportsInfoForE as exprE, exportsInfoForF as exprF, + exportsInfoForPure as exprPure, } from "./dep2?expr"; it("should load module correctly", () => { @@ -51,6 +53,11 @@ it("E should be used", () => { }); it("F should be used", () => { + if (process.env.NODE_ENV === "production") { + expect(declPure).toBe(false); + expect(exprPure).toBe(false); + } + // Note: it has side-effects and is not affected by usage of the class expect(declF).toBe(true); expect(declFoo).toBe(true); From 0d8f4d0f3d4074af32aa7059648cd8fa041e1d3a Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Thu, 25 May 2023 18:17:36 +0300 Subject: [PATCH 3/4] test: added more --- test/cases/inner-graph/extend-class2/dep-decl.js | 9 ++++++++- test/cases/inner-graph/extend-class2/dep-expr.js | 9 ++++++++- test/cases/inner-graph/extend-class2/dep2.js | 7 +++++++ test/cases/inner-graph/extend-class2/index.js | 6 +++++- test/cases/inner-graph/extend-class2/module-decl.js | 4 ++-- test/cases/inner-graph/extend-class2/module-expr.js | 4 ++-- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js index fb9c9659014..3bbdec487dc 100644 --- a/test/cases/inner-graph/extend-class2/dep-decl.js +++ b/test/cases/inner-graph/extend-class2/dep-decl.js @@ -1,4 +1,4 @@ -import { A, B, getC, getD, getE, getF, Foo, Pure } from "./dep2?decl"; +import { A, B, getC, getD, getE, getF, Foo, Pure, DateFormatter } from "./dep2?decl"; import { A3, B3, C3, D3, E3, F3, Pure3 } from "./dep3?decl"; export class A1 extends A { @@ -139,6 +139,13 @@ export class ExtendsPure extends Pure { } } +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + export class A2 extends A3 {} export class B2 extends B3 {} export class C2 extends C3 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js index eafdefff736..c624cf78688 100644 --- a/test/cases/inner-graph/extend-class2/dep-expr.js +++ b/test/cases/inner-graph/extend-class2/dep-expr.js @@ -1,4 +1,4 @@ -import { A, B, getC, getD, getE, getF, Pure } from "./dep2?expr"; +import {A, B, DateFormatter, getC, getD, getE, getF, Pure} from "./dep2?expr"; import { A3, B3, C3, D3, E3, F3, Pure3} from "./dep3?expr"; export const A1 = class extends A { @@ -45,6 +45,13 @@ export const ExtendsPure = class extends Pure { } }; +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + export const A2 = class extends A3 {}; export const B2 = class extends B3 {}; export const C2 = class extends C3 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js index 07fd4ad09dd..0520f7f6b6b 100644 --- a/test/cases/inner-graph/extend-class2/dep2.js +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -6,6 +6,12 @@ export const getE = () => class E {}; export const getF = () => class F {}; export class Foo { static Bar = Foo; } export class Pure {} +export class DateFormatter extends Date { + constructor() { + super(); + this.date = this.getDate(); + } +} export const exportsInfoForA = __webpack_exports_info__.A.used; export const exportsInfoForB = __webpack_exports_info__.B.used; @@ -15,3 +21,4 @@ export const exportsInfoForE = __webpack_exports_info__.getE.used; export const exportsInfoForF = __webpack_exports_info__.getF.used; export const exportsInfoForFoo = __webpack_exports_info__.Foo.used; export const exportsInfoForPure = __webpack_exports_info__.Pure.used; +export const exportsInfoForDateFormatter = __webpack_exports_info__.DateFormatter.used; diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index dc3d9052b06..308d5133807 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -6,7 +6,8 @@ import { exportsInfoForE as declE, exportsInfoForF as declF, exportsInfoForFoo as declFoo, - exportsInfoForPure as declPure + exportsInfoForPure as declPure, + exportsInfoForDateFormatter as declDateFormatter } from "./dep2?decl"; import { exportsInfoForA as exprA, @@ -16,6 +17,7 @@ import { exportsInfoForE as exprE, exportsInfoForF as exprF, exportsInfoForPure as exprPure, + exportsInfoForDateFormatter as exprDateFormatter } from "./dep2?expr"; it("should load module correctly", () => { @@ -62,4 +64,6 @@ it("F should be used", () => { expect(declF).toBe(true); expect(declFoo).toBe(true); expect(exprF).toBe(true); + expect(declDateFormatter).toBe(true); + expect(exprDateFormatter).toBe(true); }); diff --git a/test/cases/inner-graph/extend-class2/module-decl.js b/test/cases/inner-graph/extend-class2/module-decl.js index 7d164adb26a..9ca859760f3 100644 --- a/test/cases/inner-graph/extend-class2/module-decl.js +++ b/test/cases/inner-graph/extend-class2/module-decl.js @@ -1,3 +1,3 @@ -import { A1, C1, E1 } from "./dep-decl"; +import { A1, C1, E1, DateBar } from "./dep-decl"; -export default [new A1().render(), new C1().render(), new E1().render()]; +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; diff --git a/test/cases/inner-graph/extend-class2/module-expr.js b/test/cases/inner-graph/extend-class2/module-expr.js index 4395782a890..b04d26a339a 100644 --- a/test/cases/inner-graph/extend-class2/module-expr.js +++ b/test/cases/inner-graph/extend-class2/module-expr.js @@ -1,3 +1,3 @@ -import { A1, C1, E1 } from "./dep-expr"; +import { A1, C1, E1, DateBar } from "./dep-expr"; -export default [new A1().render(), new C1().render(), new E1().render()]; +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; From 9d97d8981c952d21b5937ae68ffc06394b5c8f18 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Thu, 25 May 2023 18:59:08 +0300 Subject: [PATCH 4/4] fix: handle more cases --- lib/javascript/JavascriptParser.js | 9 +++++++++ test/cases/inner-graph/extend-class2/dep-decl.js | 16 ++++++++++++++-- test/cases/inner-graph/extend-class2/dep-expr.js | 14 +++++++++++++- test/cases/inner-graph/extend-class2/dep2.js | 4 ++++ test/cases/inner-graph/extend-class2/dep3.js | 2 ++ test/cases/inner-graph/extend-class2/index.js | 12 ++++++++++-- 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index 0c1e483b3f9..cf62790267a 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -3956,6 +3956,7 @@ class JavascriptParser extends Parser { .call(expr, commentsStartPos); if (typeof result === "boolean") return result; switch (expr.type) { + // TODO handle more cases case "ClassDeclaration": case "ClassExpression": { if (expr.body.type !== "ClassBody") return false; @@ -3996,7 +3997,9 @@ class JavascriptParser extends Parser { case "FunctionDeclaration": case "FunctionExpression": case "ArrowFunctionExpression": + case "ThisExpression": case "Literal": + case "TemplateLiteral": case "Identifier": case "PrivateIdentifier": return true; @@ -4013,6 +4016,12 @@ class JavascriptParser extends Parser { this.isPure(expr.alternate, expr.consequent.range[1]) ); + case "LogicalExpression": + return ( + this.isPure(expr.left, commentsStartPos) && + this.isPure(expr.right, expr.left.range[1]) + ); + case "SequenceExpression": return expr.expressions.every(expr => { const pureFlag = this.isPure(expr, commentsStartPos); diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js index 3bbdec487dc..bcce7df94ae 100644 --- a/test/cases/inner-graph/extend-class2/dep-decl.js +++ b/test/cases/inner-graph/extend-class2/dep-decl.js @@ -1,5 +1,5 @@ -import { A, B, getC, getD, getE, getF, Foo, Pure, DateFormatter } from "./dep2?decl"; -import { A3, B3, C3, D3, E3, F3, Pure3 } from "./dep3?decl"; +import { A, B, getC, getD, getE, getF, Foo, Pure, DateFormatter, ConditionalExpression, LogicalExpression } from "./dep2?decl"; +import { A3, B3, C3, D3, E3, F3, Pure3, ConditionalExpression3, LogicalExpression3 } from "./dep3?decl"; export class A1 extends A { render() { @@ -146,6 +146,18 @@ export class DateBar extends DateFormatter { render() {} } +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + export class A2 extends A3 {} export class B2 extends B3 {} export class C2 extends C3 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js index c624cf78688..957b59d98ce 100644 --- a/test/cases/inner-graph/extend-class2/dep-expr.js +++ b/test/cases/inner-graph/extend-class2/dep-expr.js @@ -1,4 +1,4 @@ -import {A, B, DateFormatter, getC, getD, getE, getF, Pure} from "./dep2?expr"; +import {A, B, DateFormatter, getC, getD, getE, getF, Pure, ConditionalExpression, LogicalExpression} from "./dep2?expr"; import { A3, B3, C3, D3, E3, F3, Pure3} from "./dep3?expr"; export const A1 = class extends A { @@ -52,6 +52,18 @@ export class DateBar extends DateFormatter { render() {} } +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + export const A2 = class extends A3 {}; export const B2 = class extends B3 {}; export const C2 = class extends C3 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js index 0520f7f6b6b..5581cdd2199 100644 --- a/test/cases/inner-graph/extend-class2/dep2.js +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -12,6 +12,8 @@ export class DateFormatter extends Date { this.date = this.getDate(); } } +export class ConditionalExpression extends (true ? A : B) {} +export class LogicalExpression extends (A || B) {} export const exportsInfoForA = __webpack_exports_info__.A.used; export const exportsInfoForB = __webpack_exports_info__.B.used; @@ -22,3 +24,5 @@ export const exportsInfoForF = __webpack_exports_info__.getF.used; export const exportsInfoForFoo = __webpack_exports_info__.Foo.used; export const exportsInfoForPure = __webpack_exports_info__.Pure.used; export const exportsInfoForDateFormatter = __webpack_exports_info__.DateFormatter.used; +export const exportsInfoForConditionalExpression = __webpack_exports_info__.ConditionalExpression.used; +export const exportsInfoForLogicalExpression = __webpack_exports_info__.LogicalExpression.used; diff --git a/test/cases/inner-graph/extend-class2/dep3.js b/test/cases/inner-graph/extend-class2/dep3.js index 8f8ba61ff67..74377293433 100644 --- a/test/cases/inner-graph/extend-class2/dep3.js +++ b/test/cases/inner-graph/extend-class2/dep3.js @@ -5,3 +5,5 @@ export class D3 {} export class E3 {} export class F3 {} export class Pure3 {} +export class ConditionalExpression3 extends (true ? A3 : B3) {} +export class LogicalExpression3 extends (A3 || B3) {} diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index 308d5133807..87322d5f5b3 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -7,7 +7,9 @@ import { exportsInfoForF as declF, exportsInfoForFoo as declFoo, exportsInfoForPure as declPure, - exportsInfoForDateFormatter as declDateFormatter + exportsInfoForDateFormatter as declDateFormatter, + exportsInfoForConditionalExpression as declConditionalExpression, + exportsInfoForLogicalExpression as declLogicalExpression } from "./dep2?decl"; import { exportsInfoForA as exprA, @@ -17,7 +19,9 @@ import { exportsInfoForE as exprE, exportsInfoForF as exprF, exportsInfoForPure as exprPure, - exportsInfoForDateFormatter as exprDateFormatter + exportsInfoForDateFormatter as exprDateFormatter, + exportsInfoForConditionalExpression as exprConditionalExpression, + exportsInfoForLogicalExpression as exprLogicalExpression } from "./dep2?expr"; it("should load module correctly", () => { @@ -58,6 +62,10 @@ it("F should be used", () => { if (process.env.NODE_ENV === "production") { expect(declPure).toBe(false); expect(exprPure).toBe(false); + expect(declConditionalExpression).toBe(false); + expect(exprConditionalExpression).toBe(false); + expect(declLogicalExpression).toBe(false); + expect(exprLogicalExpression).toBe(false); } // Note: it has side-effects and is not affected by usage of the class