From 57ed7e3d448befa2221d820370182cc3af7c1355 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sun, 16 Aug 2020 07:29:47 +0200 Subject: [PATCH] Prevent unintended ASI for nested conditionals (#3732) --- src/ast/nodes/ConditionalExpression.ts | 1 + src/ast/nodes/LogicalExpression.ts | 1 + src/ast/nodes/YieldExpression.ts | 2 +- .../samples/prevent-tree-shaking-asi/main.js | 16 +++++++++++++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ast/nodes/ConditionalExpression.ts b/src/ast/nodes/ConditionalExpression.ts index d1df1f77f25..1a498e4dbe6 100644 --- a/src/ast/nodes/ConditionalExpression.ts +++ b/src/ast/nodes/ConditionalExpression.ts @@ -187,6 +187,7 @@ export default class ConditionalExpression extends NodeBase implements Deoptimiz isCalleeOfRenderedParent: renderedParentType ? isCalleeOfRenderedParent : (this.parent as CallExpression).callee === this, + preventASI: true, renderedParentType: renderedParentType || this.parent.type }); } else { diff --git a/src/ast/nodes/LogicalExpression.ts b/src/ast/nodes/LogicalExpression.ts index 0d3976a0928..d6c37ddc08b 100644 --- a/src/ast/nodes/LogicalExpression.ts +++ b/src/ast/nodes/LogicalExpression.ts @@ -180,6 +180,7 @@ export default class LogicalExpression extends NodeBase implements Deoptimizable isCalleeOfRenderedParent: renderedParentType ? isCalleeOfRenderedParent : (this.parent as CallExpression).callee === this, + preventASI, renderedParentType: renderedParentType || this.parent.type }); } else { diff --git a/src/ast/nodes/YieldExpression.ts b/src/ast/nodes/YieldExpression.ts index ff0a96c3a6d..d322951c8fd 100644 --- a/src/ast/nodes/YieldExpression.ts +++ b/src/ast/nodes/YieldExpression.ts @@ -26,7 +26,7 @@ export default class YieldExpression extends NodeBase { render(code: MagicString, options: RenderOptions) { if (this.argument) { - this.argument.render(code, options); + this.argument.render(code, options, { preventASI: true }); if (this.argument.start === this.start + 5 /* 'yield'.length */) { code.prependLeft(this.start + 5, ' '); } diff --git a/test/function/samples/prevent-tree-shaking-asi/main.js b/test/function/samples/prevent-tree-shaking-asi/main.js index 8b91e02a84c..51deb9f78b9 100644 --- a/test/function/samples/prevent-tree-shaking-asi/main.js +++ b/test/function/samples/prevent-tree-shaking-asi/main.js @@ -2,7 +2,9 @@ function test1() { return true ? /* kept */ - 'expected' : + true ? + 'expected' : + 'unexpected' : 'unexpected'; } assert.strictEqual(test1(), 'expected'); @@ -12,7 +14,9 @@ function test2() { 'unexpected' : /* kept */ - 'expected'; + false ? + 'unexpected' : + 'expected'; } assert.strictEqual(test2(), 'expected'); @@ -20,7 +24,7 @@ function test3() { return true && /* kept */ - 'expected'; + 'expected' || false; } assert.strictEqual(test3(), 'expected'); @@ -40,3 +44,9 @@ try { } catch (err) { assert.strictEqual(err.message, 'expected'); } + +function* test5() { + yield false || + 'expected' +} +assert.strictEqual(test5().next().value, 'expected');