Skip to content

Commit

Permalink
Merge pull request #1604 from lukastaegert/use-paranoid-defaults
Browse files Browse the repository at this point in the history
Assume we always have all of the new effects unless specified otherwise
  • Loading branch information
Rich-Harris committed Sep 8, 2017
2 parents 0c85e2c + dd1db1e commit edc8ac6
Show file tree
Hide file tree
Showing 37 changed files with 432 additions and 37 deletions.
4 changes: 2 additions & 2 deletions src/ast/Node.js
Expand Up @@ -38,11 +38,11 @@ export default class Node {
}

hasEffectsWhenAssigned () {
return false;
return true;
}

hasEffectsWhenMutated () {
return false;
return true;
}

includeDeclaration () {
Expand Down
4 changes: 0 additions & 4 deletions src/ast/nodes/AssignmentExpression.js
Expand Up @@ -15,8 +15,4 @@ export default class AssignmentExpression extends Node {
hasEffectsAsExpressionStatement ( options ) {
return this.hasEffects( options );
}

hasEffectsWhenMutated () {
return true;
}
}
7 changes: 7 additions & 0 deletions src/ast/nodes/AssignmentPattern.js
@@ -0,0 +1,7 @@
import Node from '../Node.js';

export default class AssignmentPattern extends Node {
hasEffectsWhenAssigned ( options ) {
return this.left.hasEffectsWhenAssigned( options );
}
}
4 changes: 0 additions & 4 deletions src/ast/nodes/BinaryExpression.js
Expand Up @@ -38,8 +38,4 @@ export default class BinaryExpression extends Node {

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

hasEffectsWhenMutated () {
return true;
}
}
4 changes: 0 additions & 4 deletions src/ast/nodes/CallExpression.js
Expand Up @@ -34,8 +34,4 @@ export default class CallExpression extends Node {
hasEffectsAsExpressionStatement ( options ) {
return this.hasEffects( options );
}

hasEffectsWhenMutated () {
return true;
}
}
4 changes: 0 additions & 4 deletions src/ast/nodes/ConditionalExpression.js
Expand Up @@ -37,10 +37,6 @@ export default class ConditionalExpression extends Node {
return testValue ? this.consequent.getValue() : this.alternate.getValue();
}

hasEffectsWhenMutated () {
return true;
}

render ( code, es ) {
if ( !this.module.bundle.treeshake ) {
super.render( code, es );
Expand Down
4 changes: 4 additions & 0 deletions src/ast/nodes/Identifier.js
Expand Up @@ -36,6 +36,10 @@ export default class Identifier extends Node {
}
}

hasEffectsAsExpressionStatement ( options ) {
return this.hasEffects( options ) || this.declaration.isGlobal;
}

hasEffectsWhenAssigned () {
return this.declaration && this.declaration.included;
}
Expand Down
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: 0 additions & 4 deletions src/ast/nodes/MemberExpression.js
Expand Up @@ -83,10 +83,6 @@ export default class MemberExpression extends Node {
return this.object.hasEffectsWhenMutated( options );
}

hasEffectsWhenMutated () {
return true;
}

includeInBundle () {
let addedNewNodes = super.includeInBundle();
if ( this.declaration && !this.declaration.included ) {
Expand Down
7 changes: 7 additions & 0 deletions src/ast/nodes/ObjectExpression.js
@@ -0,0 +1,7 @@
import Node from '../Node.js';

export default class ObjectExpression extends Node {
hasEffectsWhenMutated () {
return false;
}
}
4 changes: 0 additions & 4 deletions src/ast/nodes/ThisExpression.js
@@ -1,10 +1,6 @@
import Node from '../Node.js';

export default class ThisExpression extends Node {
hasEffectsWhenMutated () {
return true;
}

initialiseNode () {
const lexicalBoundary = this.scope.findLexicalBoundary();

Expand Down
8 changes: 0 additions & 8 deletions src/ast/nodes/UnknownNode.js
Expand Up @@ -4,12 +4,4 @@ export default class UnknownNode extends Node {
hasEffects () {
return true;
}

hasEffectsWhenAssigned () {
return true;
}

hasEffectsWhenMutated () {
return true;
}
}
6 changes: 4 additions & 2 deletions src/ast/nodes/index.js
@@ -1,6 +1,7 @@
import ArrayPattern from './ArrayPattern.js';
import ArrowFunctionExpression from './ArrowFunctionExpression.js';
import AssignmentExpression from './AssignmentExpression.js';
import AssignmentPattern from './AssignmentPattern.js';
import AwaitExpression from './AwaitExpression.js';
import BinaryExpression from './BinaryExpression.js';
import BlockStatement from './BlockStatement.js';
Expand Down Expand Up @@ -28,6 +29,7 @@ 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';
import ObjectPattern from './ObjectPattern.js';
import Property from './Property.js';
import RestElement from './RestElement.js';
Expand All @@ -52,7 +54,7 @@ export default {
ArrayPattern,
ArrowFunctionExpression,
AssignmentExpression,
AssignmentPattern: Node,
AssignmentPattern,
AwaitExpression,
BinaryExpression,
BlockStatement,
Expand Down Expand Up @@ -80,7 +82,7 @@ export default {
LogicalExpression,
MemberExpression,
NewExpression,
ObjectExpression: Node,
ObjectExpression,
ObjectPattern,
Property,
RestElement,
Expand Down
2 changes: 1 addition & 1 deletion src/ast/nodes/shared/pureFunctions.js
Expand Up @@ -26,7 +26,7 @@ simdTypes.forEach( t => {
'ArrayBuffer', 'ArrayBuffer.isView',
'DataView',
'JSON.parse', 'JSON.stringify',
'Promise', 'Promise.all', 'Promise.race', 'Promise.reject', 'Promise.resolve',
'Promise.all', 'Promise.race', 'Promise.resolve',
'Intl.Collator', 'Intl.Collator.supportedLocalesOf', 'Intl.DateTimeFormat', 'Intl.DateTimeFormat.supportedLocalesOf', 'Intl.NumberFormat', 'Intl.NumberFormat.supportedLocalesOf'

// TODO properties of e.g. window...
Expand Down
4 changes: 4 additions & 0 deletions test/form/samples/assignment-to-array-buffer-view/_config.js
@@ -0,0 +1,4 @@
module.exports = {
description: 'assignment to views of buffers should be kept',
options: { name: 'bundle' }
};
14 changes: 14 additions & 0 deletions test/form/samples/assignment-to-array-buffer-view/_expected/amd.js
@@ -0,0 +1,14 @@
define(['exports'], function (exports) { 'use strict';

var buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

exports.view8 = view8;

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

});
12 changes: 12 additions & 0 deletions test/form/samples/assignment-to-array-buffer-view/_expected/cjs.js
@@ -0,0 +1,12 @@
'use strict';

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

var buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

exports.view8 = view8;
@@ -0,0 +1,8 @@
var buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

export { view8 };
@@ -0,0 +1,15 @@
var bundle = (function (exports) {
'use strict';

var buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

exports.view8 = view8;

return exports;

}({}));
18 changes: 18 additions & 0 deletions test/form/samples/assignment-to-array-buffer-view/_expected/umd.js
@@ -0,0 +1,18 @@
(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 buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

exports.view8 = view8;

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

})));
8 changes: 8 additions & 0 deletions test/form/samples/assignment-to-array-buffer-view/main.js
@@ -0,0 +1,8 @@
var buffer = new ArrayBuffer( 8 );

var view8 = new Int8Array( buffer );
var view16 = new Int16Array( buffer );

view16[ 0 ] = 3;

export { view8 };
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;

}({}));

0 comments on commit edc8ac6

Please sign in to comment.