From ef676b4081a670d51d61ee8ef29009389e1915bc Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Thu, 8 Sep 2016 09:12:57 -0400 Subject: [PATCH] disregard effects in dead branches --- src/ast/nodes/ConditionalExpression.js | 12 +++++------ src/ast/nodes/IfStatement.js | 26 ++++------------------- test/form/side-effect-q/_config.js | 3 +++ test/form/side-effect-q/_expected/amd.js | 5 +++++ test/form/side-effect-q/_expected/cjs.js | 2 ++ test/form/side-effect-q/_expected/es.js | 0 test/form/side-effect-q/_expected/iife.js | 6 ++++++ test/form/side-effect-q/_expected/umd.js | 9 ++++++++ test/form/side-effect-q/main.js | 5 +++++ 9 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 test/form/side-effect-q/_config.js create mode 100644 test/form/side-effect-q/_expected/amd.js create mode 100644 test/form/side-effect-q/_expected/cjs.js create mode 100644 test/form/side-effect-q/_expected/es.js create mode 100644 test/form/side-effect-q/_expected/iife.js create mode 100644 test/form/side-effect-q/_expected/umd.js create mode 100644 test/form/side-effect-q/main.js diff --git a/src/ast/nodes/ConditionalExpression.js b/src/ast/nodes/ConditionalExpression.js index 6a6c803..c5e336d 100644 --- a/src/ast/nodes/ConditionalExpression.js +++ b/src/ast/nodes/ConditionalExpression.js @@ -4,13 +4,13 @@ import { UNKNOWN } from '../values.js'; export default class ConditionalExpression extends Node { initialise ( scope ) { if ( this.module.bundle.treeshake ) { - const testValue = this.test.getValue(); + this.testValue = this.test.getValue(); - if ( testValue === UNKNOWN ) { + if ( this.testValue === UNKNOWN ) { super.initialise( scope ); } - else if ( testValue ) { + else if ( this.testValue ) { this.consequent.initialise( scope ); this.alternate = null; } else if ( this.alternate ) { @@ -47,13 +47,11 @@ export default class ConditionalExpression extends Node { } else { - const testValue = this.test.getValue(); - - if ( testValue === UNKNOWN ) { + if ( this.testValue === UNKNOWN ) { super.render( code, es ); } - else if ( testValue ) { + else if ( this.testValue ) { code.remove( this.start, this.consequent.start ); code.remove( this.consequent.end, this.end ); } else { diff --git a/src/ast/nodes/IfStatement.js b/src/ast/nodes/IfStatement.js index baccbd5..1a5c184 100644 --- a/src/ast/nodes/IfStatement.js +++ b/src/ast/nodes/IfStatement.js @@ -3,26 +3,6 @@ import { UNKNOWN } from '../values.js'; // TODO DRY this out export default class IfStatement extends Node { - bind ( scope ) { - if ( this.module.bundle.treeshake ) { - if ( this.testValue === UNKNOWN ) { - super.bind( scope ); - } - - else if ( this.testValue ) { - this.consequent.bind( scope ); - this.alternate = null; - } else if ( this.alternate ) { - this.alternate.bind( scope ); - this.consequent = null; - } - } - - else { - super.bind( scope ); - } - } - initialise ( scope ) { this.testValue = this.test.getValue(); @@ -33,8 +13,10 @@ export default class IfStatement extends Node { else if ( this.testValue ) { this.consequent.initialise( scope ); - } else if ( this.alternate ) { - this.alternate.initialise( scope ); + this.alternate = null; + } else { + if ( this.alternate ) this.alternate.initialise( scope ); + this.consequent = null; } } diff --git a/test/form/side-effect-q/_config.js b/test/form/side-effect-q/_config.js new file mode 100644 index 0000000..944a58a --- /dev/null +++ b/test/form/side-effect-q/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'discards effects in conditional expressions with known test values' +}; diff --git a/test/form/side-effect-q/_expected/amd.js b/test/form/side-effect-q/_expected/amd.js new file mode 100644 index 0000000..ec759b1 --- /dev/null +++ b/test/form/side-effect-q/_expected/amd.js @@ -0,0 +1,5 @@ +define(function () { 'use strict'; + + + +}); \ No newline at end of file diff --git a/test/form/side-effect-q/_expected/cjs.js b/test/form/side-effect-q/_expected/cjs.js new file mode 100644 index 0000000..eb109ab --- /dev/null +++ b/test/form/side-effect-q/_expected/cjs.js @@ -0,0 +1,2 @@ +'use strict'; + diff --git a/test/form/side-effect-q/_expected/es.js b/test/form/side-effect-q/_expected/es.js new file mode 100644 index 0000000..e69de29 diff --git a/test/form/side-effect-q/_expected/iife.js b/test/form/side-effect-q/_expected/iife.js new file mode 100644 index 0000000..f3d1016 --- /dev/null +++ b/test/form/side-effect-q/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + + +}()); \ No newline at end of file diff --git a/test/form/side-effect-q/_expected/umd.js b/test/form/side-effect-q/_expected/umd.js new file mode 100644 index 0000000..d561e69 --- /dev/null +++ b/test/form/side-effect-q/_expected/umd.js @@ -0,0 +1,9 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + (factory()); +}(this, (function () { 'use strict'; + + + +}))); \ No newline at end of file diff --git a/test/form/side-effect-q/main.js b/test/form/side-effect-q/main.js new file mode 100644 index 0000000..2272edb --- /dev/null +++ b/test/form/side-effect-q/main.js @@ -0,0 +1,5 @@ +var x = true ? foo () : bar(); + +function foo () { + return 'should be removed, because x is unused'; +}