From 47d3daf9a5275e35492e7b3552cfc62838234fff Mon Sep 17 00:00:00 2001 From: Rich-Harris Date: Thu, 29 Dec 2016 07:56:54 -0500 Subject: [PATCH] statically analyse LogicalExpression nodes (#1061) --- src/ast/nodes/LogicalExpression.js | 19 +++++++++++++++++++ src/ast/nodes/index.js | 2 ++ test/form/skips-dead-branches-i/_config.js | 2 +- test/form/skips-dead-branches-j/_config.js | 3 +++ .../skips-dead-branches-j/_expected/amd.js | 7 +++++++ .../skips-dead-branches-j/_expected/cjs.js | 5 +++++ .../skips-dead-branches-j/_expected/es.js | 3 +++ .../skips-dead-branches-j/_expected/iife.js | 8 ++++++++ .../skips-dead-branches-j/_expected/umd.js | 11 +++++++++++ test/form/skips-dead-branches-j/main.js | 5 +++++ 10 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/ast/nodes/LogicalExpression.js create mode 100644 test/form/skips-dead-branches-j/_config.js create mode 100644 test/form/skips-dead-branches-j/_expected/amd.js create mode 100644 test/form/skips-dead-branches-j/_expected/cjs.js create mode 100644 test/form/skips-dead-branches-j/_expected/es.js create mode 100644 test/form/skips-dead-branches-j/_expected/iife.js create mode 100644 test/form/skips-dead-branches-j/_expected/umd.js create mode 100644 test/form/skips-dead-branches-j/main.js diff --git a/src/ast/nodes/LogicalExpression.js b/src/ast/nodes/LogicalExpression.js new file mode 100644 index 0000000..4f81d3b --- /dev/null +++ b/src/ast/nodes/LogicalExpression.js @@ -0,0 +1,19 @@ +import Node from '../Node.js'; +import { UNKNOWN } from '../values.js'; + +const operators = { + '&&': ( left, right ) => left && right, + '||': ( left, right ) => left || right +}; + +export default class LogicalExpression extends Node { + getValue () { + const leftValue = this.left.getValue(); + if ( leftValue === UNKNOWN ) return UNKNOWN; + + const rightValue = this.right.getValue(); + if ( rightValue === UNKNOWN ) return UNKNOWN; + + return operators[ this.operator ]( leftValue, rightValue ); + } +} diff --git a/src/ast/nodes/index.js b/src/ast/nodes/index.js index 1c3ba4c..2c59ee4 100644 --- a/src/ast/nodes/index.js +++ b/src/ast/nodes/index.js @@ -21,6 +21,7 @@ import Identifier from './Identifier.js'; import IfStatement from './IfStatement.js'; import ImportDeclaration from './ImportDeclaration.js'; import Literal from './Literal.js'; +import LogicalExpression from './LogicalExpression.js'; import MemberExpression from './MemberExpression.js'; import NewExpression from './NewExpression.js'; import ObjectExpression from './ObjectExpression.js'; @@ -59,6 +60,7 @@ export default { IfStatement, ImportDeclaration, Literal, + LogicalExpression, MemberExpression, NewExpression, ObjectExpression, diff --git a/test/form/skips-dead-branches-i/_config.js b/test/form/skips-dead-branches-i/_config.js index 85e8fbe..95aa942 100644 --- a/test/form/skips-dead-branches-i/_config.js +++ b/test/form/skips-dead-branches-i/_config.js @@ -1,3 +1,3 @@ module.exports = { - description: 'skips a dead branch (h)' + description: 'skips a dead branch (i)' }; diff --git a/test/form/skips-dead-branches-j/_config.js b/test/form/skips-dead-branches-j/_config.js new file mode 100644 index 0000000..b9abe10 --- /dev/null +++ b/test/form/skips-dead-branches-j/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'skips a dead branch (j)' +}; diff --git a/test/form/skips-dead-branches-j/_expected/amd.js b/test/form/skips-dead-branches-j/_expected/amd.js new file mode 100644 index 0000000..9ee9589 --- /dev/null +++ b/test/form/skips-dead-branches-j/_expected/amd.js @@ -0,0 +1,7 @@ +define(function () { 'use strict'; + + { + console.log( 'true' ); + } + +}); diff --git a/test/form/skips-dead-branches-j/_expected/cjs.js b/test/form/skips-dead-branches-j/_expected/cjs.js new file mode 100644 index 0000000..f71d9f9 --- /dev/null +++ b/test/form/skips-dead-branches-j/_expected/cjs.js @@ -0,0 +1,5 @@ +'use strict'; + +{ + console.log( 'true' ); +} diff --git a/test/form/skips-dead-branches-j/_expected/es.js b/test/form/skips-dead-branches-j/_expected/es.js new file mode 100644 index 0000000..bbd290a --- /dev/null +++ b/test/form/skips-dead-branches-j/_expected/es.js @@ -0,0 +1,3 @@ +{ + console.log( 'true' ); +} diff --git a/test/form/skips-dead-branches-j/_expected/iife.js b/test/form/skips-dead-branches-j/_expected/iife.js new file mode 100644 index 0000000..c506520 --- /dev/null +++ b/test/form/skips-dead-branches-j/_expected/iife.js @@ -0,0 +1,8 @@ +(function () { + 'use strict'; + + { + console.log( 'true' ); + } + +}()); diff --git a/test/form/skips-dead-branches-j/_expected/umd.js b/test/form/skips-dead-branches-j/_expected/umd.js new file mode 100644 index 0000000..2f6e70a --- /dev/null +++ b/test/form/skips-dead-branches-j/_expected/umd.js @@ -0,0 +1,11 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + (factory()); +}(this, (function () { 'use strict'; + + { + console.log( 'true' ); + } + +}))); diff --git a/test/form/skips-dead-branches-j/main.js b/test/form/skips-dead-branches-j/main.js new file mode 100644 index 0000000..afc8c67 --- /dev/null +++ b/test/form/skips-dead-branches-j/main.js @@ -0,0 +1,5 @@ +if ( true && true ) { + console.log( 'true' ); +} else { + console.log( 'false' ); +}