diff --git a/src/ast/nodes/AssignmentExpression.ts b/src/ast/nodes/AssignmentExpression.ts index 44bbc3de7d2..3b0f57aa7b7 100644 --- a/src/ast/nodes/AssignmentExpression.ts +++ b/src/ast/nodes/AssignmentExpression.ts @@ -1,7 +1,9 @@ import MagicString from 'magic-string'; +import { BLANK } from '../../utils/blank'; import { findFirstOccurrenceOutsideComment, findNonWhiteSpace, + NodeRenderOptions, RenderOptions } from '../../utils/renderHelpers'; import { getSystemExportFunctionLeft } from '../../utils/systemJsRendering'; @@ -62,11 +64,18 @@ export default class AssignmentExpression extends NodeBase { this.right.include(context, includeChildrenRecursively); } - render(code: MagicString, options: RenderOptions) { - this.right.render(code, options); + render( + code: MagicString, + options: RenderOptions, + { renderedParentType }: NodeRenderOptions = BLANK + ) { if (this.left.included) { this.left.render(code, options); + this.right.render(code, options); } else { + this.right.render(code, options, { + renderedParentType: renderedParentType || this.parent.type + }); code.remove(this.start, this.right.start); } if (options.format === 'system') { diff --git a/test/function/samples/tree-shake-object-expression-assignment/_config.js b/test/function/samples/tree-shake-object-expression-assignment/_config.js new file mode 100644 index 00000000000..04340104ccd --- /dev/null +++ b/test/function/samples/tree-shake-object-expression-assignment/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: + 'renders valid code when the target of an object expression with side-effects is tree-shaken' +}; diff --git a/test/function/samples/tree-shake-object-expression-assignment/main.js b/test/function/samples/tree-shake-object-expression-assignment/main.js new file mode 100644 index 00000000000..fc5a6e09be2 --- /dev/null +++ b/test/function/samples/tree-shake-object-expression-assignment/main.js @@ -0,0 +1,6 @@ +const result = {}; + +let foo; +foo = { [(result.x = 1)]: (result.y = 2) }; + +assert.deepStrictEqual(result, { x: 1, y: 2 });