diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index c56a556a558..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,10 @@ class JavascriptParser extends Parser { case "FunctionDeclaration": case "FunctionExpression": case "ArrowFunctionExpression": + case "ThisExpression": case "Literal": + case "TemplateLiteral": + case "Identifier": case "PrivateIdentifier": return true; @@ -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); diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js index 454aadd3d48..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 } 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() { @@ -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 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js index afa476b438c..957b59d98ce 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, 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() { @@ -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 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js index 48e3af7edf5..5581cdd2199 100644 --- a/test/cases/inner-graph/extend-class2/dep2.js +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -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; @@ -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; diff --git a/test/cases/inner-graph/extend-class2/dep3.js b/test/cases/inner-graph/extend-class2/dep3.js index 974ee9572d0..74377293433 100644 --- a/test/cases/inner-graph/extend-class2/dep3.js +++ b/test/cases/inner-graph/extend-class2/dep3.js @@ -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) {} diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index ffc0fc23beb..87322d5f5b3 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -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, @@ -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", () => { @@ -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); }); 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()];