Skip to content

Commit

Permalink
Merge pull request #17265 from webpack/issue-17264
Browse files Browse the repository at this point in the history
fix: regression in inner graph
  • Loading branch information
TheLarkInn committed May 25, 2023
2 parents c0542dd + 9d97d89 commit 1b78f62
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 9 deletions.
10 changes: 10 additions & 0 deletions lib/javascript/JavascriptParser.js
Expand Up @@ -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;
Expand Down Expand Up @@ -3996,7 +3997,10 @@ class JavascriptParser extends Parser {
case "FunctionDeclaration":
case "FunctionExpression":
case "ArrowFunctionExpression":
case "ThisExpression":
case "Literal":
case "TemplateLiteral":
case "Identifier":
case "PrivateIdentifier":
return true;

Expand All @@ -4012,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);
Expand Down
29 changes: 27 additions & 2 deletions 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, 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() {
Expand Down Expand Up @@ -133,6 +133,31 @@ export default class DefaultBar extends Foo {
}
}

export class ExtendsPure extends Pure {
render() {
return new Pure3();
}
}

export class DateBar extends DateFormatter {
constructor() {
super();
}
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 {}
Expand Down
29 changes: 27 additions & 2 deletions 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, 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 {
render() {
Expand Down Expand Up @@ -39,6 +39,31 @@ export const F1 = class extends getF() {
}
};

export const ExtendsPure = class extends Pure {
render() {
return new Pure3();
}
};

export class DateBar extends DateFormatter {
constructor() {
super();
}
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 {};
Expand Down
13 changes: 13 additions & 0 deletions test/cases/inner-graph/extend-class2/dep2.js
Expand Up @@ -5,6 +5,15 @@ 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 class DateFormatter extends Date {
constructor() {
super();
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;
Expand All @@ -13,3 +22,7 @@ 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;
export const exportsInfoForDateFormatter = __webpack_exports_info__.DateFormatter.used;
export const exportsInfoForConditionalExpression = __webpack_exports_info__.ConditionalExpression.used;
export const exportsInfoForLogicalExpression = __webpack_exports_info__.LogicalExpression.used;
3 changes: 3 additions & 0 deletions test/cases/inner-graph/extend-class2/dep3.js
Expand Up @@ -4,3 +4,6 @@ export class C3 {}
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) {}
21 changes: 20 additions & 1 deletion test/cases/inner-graph/extend-class2/index.js
Expand Up @@ -5,7 +5,11 @@ import {
exportsInfoForD as declD,
exportsInfoForE as declE,
exportsInfoForF as declF,
exportsInfoForFoo as declFoo
exportsInfoForFoo as declFoo,
exportsInfoForPure as declPure,
exportsInfoForDateFormatter as declDateFormatter,
exportsInfoForConditionalExpression as declConditionalExpression,
exportsInfoForLogicalExpression as declLogicalExpression
} from "./dep2?decl";
import {
exportsInfoForA as exprA,
Expand All @@ -14,6 +18,10 @@ import {
exportsInfoForD as exprD,
exportsInfoForE as exprE,
exportsInfoForF as exprF,
exportsInfoForPure as exprPure,
exportsInfoForDateFormatter as exprDateFormatter,
exportsInfoForConditionalExpression as exprConditionalExpression,
exportsInfoForLogicalExpression as exprLogicalExpression
} from "./dep2?expr";

it("should load module correctly", () => {
Expand Down Expand Up @@ -51,8 +59,19 @@ it("E should be used", () => {
});

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
expect(declF).toBe(true);
expect(declFoo).toBe(true);
expect(exprF).toBe(true);
expect(declDateFormatter).toBe(true);
expect(exprDateFormatter).toBe(true);
});
4 changes: 2 additions & 2 deletions 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()];
4 changes: 2 additions & 2 deletions 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()];

0 comments on commit 1b78f62

Please sign in to comment.