Skip to content

Commit

Permalink
* Properly treat mutations of the results of logical expressions
Browse files Browse the repository at this point in the history
* Resolve #1599
  • Loading branch information
lukastaegert committed Aug 31, 2017
1 parent 7148ed5 commit a83b309
Show file tree
Hide file tree
Showing 9 changed files with 191 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/ast/nodes/Literal.js
Expand Up @@ -9,6 +9,10 @@ export default class Literal extends Node {
values.add( this );
}

hasEffectsWhenMutated () {
return false;
}

render ( code ) {
if ( typeof this.value === 'string' ) {
code.indentExclusionRanges.push( [ this.start + 1, this.end - 1 ] );
Expand Down
11 changes: 11 additions & 0 deletions src/ast/nodes/LogicalExpression.js
Expand Up @@ -16,4 +16,15 @@ export default class LogicalExpression extends Node {

return operators[ this.operator ]( leftValue, rightValue );
}

hasEffectsWhenMutated ( options ) {
const leftValue = this.left.getValue();
if ( leftValue === UNKNOWN_VALUE ) {
return this.left.hasEffectsWhenMutated( options ) || this.right.hasEffectsWhenMutated( options );
}
if ((leftValue && this.operator === '||') || (!leftValue && this.operator === '&&')) {
return this.left.hasEffectsWhenMutated( options );
}
return this.right.hasEffectsWhenMutated( options );
}
}
4 changes: 4 additions & 0 deletions test/form/samples/mutate-logical-expression/_config.js
@@ -0,0 +1,4 @@
module.exports = {
description: 'properly handle the results of mutating logical expressions',
options: { name: 'bundle' }
};
26 changes: 26 additions & 0 deletions test/form/samples/mutate-logical-expression/_expected/amd.js
@@ -0,0 +1,26 @@
define(['exports'], function (exports) { 'use strict';

var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

var bExp = {};
var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

var eExp = {};

exports.aExp = aExp;
exports.bExp = bExp;
exports.cExp = cExp;
exports.dExp = dExp;
exports.eExp = eExp;

Object.defineProperty(exports, '__esModule', { value: true });

});
24 changes: 24 additions & 0 deletions test/form/samples/mutate-logical-expression/_expected/cjs.js
@@ -0,0 +1,24 @@
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

var bExp = {};
var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

var eExp = {};

exports.aExp = aExp;
exports.bExp = bExp;
exports.cExp = cExp;
exports.dExp = dExp;
exports.eExp = eExp;
16 changes: 16 additions & 0 deletions test/form/samples/mutate-logical-expression/_expected/es.js
@@ -0,0 +1,16 @@
var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

var bExp = {};
var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

var eExp = {};

export { aExp, bExp, cExp, dExp, eExp };
27 changes: 27 additions & 0 deletions test/form/samples/mutate-logical-expression/_expected/iife.js
@@ -0,0 +1,27 @@
var bundle = (function (exports) {
'use strict';

var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

var bExp = {};
var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

var eExp = {};

exports.aExp = aExp;
exports.bExp = bExp;
exports.cExp = cExp;
exports.dExp = dExp;
exports.eExp = eExp;

return exports;

}({}));
30 changes: 30 additions & 0 deletions test/form/samples/mutate-logical-expression/_expected/umd.js
@@ -0,0 +1,30 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.bundle = {})));
}(this, (function (exports) { 'use strict';

var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

var bExp = {};
var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

var eExp = {};

exports.aExp = aExp;
exports.bExp = bExp;
exports.cExp = cExp;
exports.dExp = dExp;
exports.eExp = eExp;

Object.defineProperty(exports, '__esModule', { value: true });

})));
49 changes: 49 additions & 0 deletions test/form/samples/mutate-logical-expression/main.js
@@ -0,0 +1,49 @@
var a = {};
var logicalA = a || true;
logicalA.bar = 1;

var aExp = {};
var logicalAExp = aExp || true;
logicalAExp.bar = 1;

export {aExp}

var b = {};
var logicalB = true || b;
logicalB.bar = 1;

var bExp = {};
var logicalBExp = true || bExp;
logicalBExp.bar = 1;

export {bExp}

var c = {};
var logicalC = false || c;
logicalC.bar = 1;

var cExp = {};
var logicalCExp = false || cExp;
logicalCExp.bar = 1;

export {cExp}

var d = {};
var logicalD = true && d;
logicalD.bar = 1;

var dExp = {};
var logicalDExp = true && dExp;
logicalDExp.bar = 1;

export {dExp}

var e = {};
var logicalE = false && e;
logicalE.bar = 1;

var eExp = {};
var logicalEExp = false && eExp;
logicalEExp.bar = 1;

export {eExp}

0 comments on commit a83b309

Please sign in to comment.