From 10148c6356e16997db220c41799c0bb23a73f517 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Wed, 2 Jun 2021 06:54:56 +0200 Subject: [PATCH] Respect propertyReadSideEffects in spread elements --- src/ast/nodes/SpreadElement.ts | 8 ++++++- .../main.js | 24 ++++++++++++++++--- .../_expected.js | 18 ++++++++++++++ .../keep-property-access-side-effects/main.js | 18 ++++++++++++++ 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/ast/nodes/SpreadElement.ts b/src/ast/nodes/SpreadElement.ts index 742eaa848a4..794436ee8a4 100644 --- a/src/ast/nodes/SpreadElement.ts +++ b/src/ast/nodes/SpreadElement.ts @@ -1,3 +1,4 @@ +import { NormalizedTreeshakingOptions } from '../../rollup/types'; import { HasEffectsContext } from '../ExecutionContext'; import { NodeEvent } from '../NodeEvents'; import { ObjectPath, PathTracker, UNKNOWN_PATH, UnknownKey } from '../utils/PathTracker'; @@ -27,9 +28,14 @@ export default class SpreadElement extends NodeBase { } hasEffects(context: HasEffectsContext): boolean { + if (!this.deoptimized) this.applyDeoptimizations(); + const { propertyReadSideEffects } = this.context.options + .treeshake as NormalizedTreeshakingOptions; return ( this.argument.hasEffects(context) || - this.argument.hasEffectsWhenAccessedAtPath(UNKNOWN_PATH, context) + (propertyReadSideEffects && + (propertyReadSideEffects === 'always' || + this.argument.hasEffectsWhenAccessedAtPath(UNKNOWN_PATH, context))) ); } diff --git a/test/form/samples/ignore-property-access-side-effects/main.js b/test/form/samples/ignore-property-access-side-effects/main.js index a501b27ef3f..de7558b2ef0 100644 --- a/test/form/samples/ignore-property-access-side-effects/main.js +++ b/test/form/samples/ignore-property-access-side-effects/main.js @@ -1,6 +1,6 @@ const getter = { - get foo () { - console.log( 'effect' ); + get foo() { + console.log('effect'); } }; const foo1 = getter.foo; @@ -13,4 +13,22 @@ function accessArg(arg) { } accessArg(null); -const foo4 = globalThis.globalThis.unknown.unknownProperty; +const foo4 = globalThis.unknown.unknownProperty; + +const foo5 = { + ...{ + get prop() { + console.log('effect'); + } + } +}; + +const foo6 = (async function () { + await { + get then() { + console.log('effect'); + return () => {}; + } + }; + return { then() {} }; +})(); diff --git a/test/form/samples/keep-property-access-side-effects/_expected.js b/test/form/samples/keep-property-access-side-effects/_expected.js index cf72b049414..79d250893d1 100644 --- a/test/form/samples/keep-property-access-side-effects/_expected.js +++ b/test/form/samples/keep-property-access-side-effects/_expected.js @@ -14,3 +14,21 @@ function accessArg(arg) { accessArg(null); globalThis.unknown.unknownProperty; + +({ + ...{ + get prop() { + console.log('effect'); + } + } +}); + +((async function () { + await { + get then() { + console.log('effect'); + return () => {}; + } + }; + return { then() {} }; +}))(); diff --git a/test/form/samples/keep-property-access-side-effects/main.js b/test/form/samples/keep-property-access-side-effects/main.js index 79c0b9bf78d..6125631a94d 100644 --- a/test/form/samples/keep-property-access-side-effects/main.js +++ b/test/form/samples/keep-property-access-side-effects/main.js @@ -14,3 +14,21 @@ function accessArg(arg) { accessArg(null); const foo4 = globalThis.unknown.unknownProperty; + +const foo5 = { + ...{ + get prop() { + console.log('effect'); + } + } +}; + +const foo6 = (async function () { + await { + get then() { + console.log('effect'); + return () => {}; + } + }; + return { then() {} }; +})();