From 5c37051938532156a3d1dcd0ffacac22b9d831f9 Mon Sep 17 00:00:00 2001 From: Lukas Taegert Date: Sat, 18 Nov 2017 08:58:50 +0100 Subject: [PATCH] * Raise maximum path depth again * Re-add tests cases that were previously removed --- src/ast/variables/LocalVariable.js | 14 ++++++------ .../samples/cyclic-assignments/_config.js | 3 --- .../cyclic-assignments/_expected/amd.js | 14 ------------ .../cyclic-assignments/_expected/cjs.js | 12 ---------- .../cyclic-assignments/_expected/es.js | 10 --------- .../cyclic-assignments/_expected/iife.js | 15 ------------- .../cyclic-assignments/_expected/umd.js | 18 --------------- .../_expected/amd.js | 9 ++++++++ .../_expected/cjs.js | 9 ++++++++ .../_expected/es.js | 9 ++++++++ .../_expected/iife.js | 9 ++++++++ .../_expected/umd.js | 9 ++++++++ .../side-effects-getters-and-setters/main.js | 9 ++++++++ .../_expected/amd.js | 9 +++----- .../_expected/cjs.js | 9 +++----- .../_expected/es.js | 9 +++----- .../_expected/iife.js | 9 +++----- .../_expected/umd.js | 9 +++----- .../main.js | 22 +++++++++++-------- .../samples/cyclic-assignments/_config.js | 3 +++ .../samples/cyclic-assignments/main.js | 0 21 files changed, 92 insertions(+), 118 deletions(-) delete mode 100644 test/form/samples/cyclic-assignments/_config.js delete mode 100644 test/form/samples/cyclic-assignments/_expected/amd.js delete mode 100644 test/form/samples/cyclic-assignments/_expected/cjs.js delete mode 100644 test/form/samples/cyclic-assignments/_expected/es.js delete mode 100644 test/form/samples/cyclic-assignments/_expected/iife.js delete mode 100644 test/form/samples/cyclic-assignments/_expected/umd.js create mode 100644 test/function/samples/cyclic-assignments/_config.js rename test/{form => function}/samples/cyclic-assignments/main.js (100%) diff --git a/src/ast/variables/LocalVariable.js b/src/ast/variables/LocalVariable.js index ac2ce0020b4..3c7c80fc024 100644 --- a/src/ast/variables/LocalVariable.js +++ b/src/ast/variables/LocalVariable.js @@ -2,7 +2,7 @@ import Variable from './Variable'; import VariableReassignmentTracker from './VariableReassignmentTracker'; // To avoid infinite recursions -const MAX_PATH_LENGTH = 6; +const MAX_PATH_DEPTH = 7; export default class LocalVariable extends Variable { constructor ( name, declarator, init ) { @@ -18,7 +18,7 @@ export default class LocalVariable extends Variable { } reassignPath ( path, options ) { - if ( path.length > MAX_PATH_LENGTH ) return; + if ( path.length > MAX_PATH_DEPTH ) return; if ( path.length === 0 ) { this.isReassigned = true; } @@ -28,7 +28,7 @@ export default class LocalVariable extends Variable { } forEachReturnExpressionWhenCalledAtPath ( path, callOptions, callback, options ) { - if ( path.length > MAX_PATH_LENGTH ) return; + if ( path.length > MAX_PATH_DEPTH ) return; this.boundExpressions.forEachAtPath( path, ( relativePath, node ) => !options.hasNodeBeenCalledAtPathWithOptions( relativePath, node, callOptions ) && node .forEachReturnExpressionWhenCalledAtPath( relativePath, callOptions, callback, @@ -43,7 +43,7 @@ export default class LocalVariable extends Variable { } hasEffectsWhenAccessedAtPath ( path, options ) { - return path.length > MAX_PATH_LENGTH + return path.length > MAX_PATH_DEPTH || this.boundExpressions.someAtPath( path, ( relativePath, node ) => relativePath.length > 0 && !options.hasNodeBeenAccessedAtPath( relativePath, node ) @@ -52,7 +52,7 @@ export default class LocalVariable extends Variable { hasEffectsWhenAssignedAtPath ( path, options ) { return this.included - || path.length > MAX_PATH_LENGTH + || path.length > MAX_PATH_DEPTH || this.boundExpressions.someAtPath( path, ( relativePath, node ) => relativePath.length > 0 && !options.hasNodeBeenAssignedAtPath( relativePath, node ) && node @@ -61,7 +61,7 @@ export default class LocalVariable extends Variable { } hasEffectsWhenCalledAtPath ( path, callOptions, options ) { - return path.length > MAX_PATH_LENGTH + return path.length > MAX_PATH_DEPTH || (this.included && path.length > 0) || this.boundExpressions.someAtPath( path, ( relativePath, node ) => !options.hasNodeBeenCalledAtPathWithOptions( relativePath, node, callOptions ) && node @@ -77,7 +77,7 @@ export default class LocalVariable extends Variable { } someReturnExpressionWhenCalledAtPath ( path, callOptions, predicateFunction, options ) { - return path.length > MAX_PATH_LENGTH + return path.length > MAX_PATH_DEPTH || (this.included && path.length > 0) || this.boundExpressions.someAtPath( path, ( relativePath, node ) => !options.hasNodeBeenCalledAtPathWithOptions( relativePath, node, callOptions ) && node diff --git a/test/form/samples/cyclic-assignments/_config.js b/test/form/samples/cyclic-assignments/_config.js deleted file mode 100644 index 31a5b6a2a7b..00000000000 --- a/test/form/samples/cyclic-assignments/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - description: 'properly remove cyclic assignments without side-effects' -}; diff --git a/test/form/samples/cyclic-assignments/_expected/amd.js b/test/form/samples/cyclic-assignments/_expected/amd.js deleted file mode 100644 index 6838b8b1a0b..00000000000 --- a/test/form/samples/cyclic-assignments/_expected/amd.js +++ /dev/null @@ -1,14 +0,0 @@ -define(function () { 'use strict'; - - let a = { foo: () => {}, bar: () => () => {} }; - let b = a; - a = b; - a.foo = () => {}; - a.foo(); - - b = b; - b.bar = () => () => {}; - - b.bar()(); - -}); diff --git a/test/form/samples/cyclic-assignments/_expected/cjs.js b/test/form/samples/cyclic-assignments/_expected/cjs.js deleted file mode 100644 index 7540cd3825e..00000000000 --- a/test/form/samples/cyclic-assignments/_expected/cjs.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -let a = { foo: () => {}, bar: () => () => {} }; -let b = a; -a = b; -a.foo = () => {}; -a.foo(); - -b = b; -b.bar = () => () => {}; - -b.bar()(); diff --git a/test/form/samples/cyclic-assignments/_expected/es.js b/test/form/samples/cyclic-assignments/_expected/es.js deleted file mode 100644 index 943b5a6f9ab..00000000000 --- a/test/form/samples/cyclic-assignments/_expected/es.js +++ /dev/null @@ -1,10 +0,0 @@ -let a = { foo: () => {}, bar: () => () => {} }; -let b = a; -a = b; -a.foo = () => {}; -a.foo(); - -b = b; -b.bar = () => () => {}; - -b.bar()(); diff --git a/test/form/samples/cyclic-assignments/_expected/iife.js b/test/form/samples/cyclic-assignments/_expected/iife.js deleted file mode 100644 index 062a0cea0e2..00000000000 --- a/test/form/samples/cyclic-assignments/_expected/iife.js +++ /dev/null @@ -1,15 +0,0 @@ -(function () { - 'use strict'; - - let a = { foo: () => {}, bar: () => () => {} }; - let b = a; - a = b; - a.foo = () => {}; - a.foo(); - - b = b; - b.bar = () => () => {}; - - b.bar()(); - -}()); diff --git a/test/form/samples/cyclic-assignments/_expected/umd.js b/test/form/samples/cyclic-assignments/_expected/umd.js deleted file mode 100644 index 4882a13c2c7..00000000000 --- a/test/form/samples/cyclic-assignments/_expected/umd.js +++ /dev/null @@ -1,18 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory() : - typeof define === 'function' && define.amd ? define(factory) : - (factory()); -}(this, (function () { 'use strict'; - - let a = { foo: () => {}, bar: () => () => {} }; - let b = a; - a = b; - a.foo = () => {}; - a.foo(); - - b = b; - b.bar = () => () => {}; - - b.bar()(); - -}))); diff --git a/test/form/samples/side-effects-getters-and-setters/_expected/amd.js b/test/form/samples/side-effects-getters-and-setters/_expected/amd.js index 797e7c4bd43..aaaa2022694 100644 --- a/test/form/samples/side-effects-getters-and-setters/_expected/amd.js +++ b/test/form/samples/side-effects-getters-and-setters/_expected/amd.js @@ -11,6 +11,7 @@ define(function () { 'use strict'; }; const retained1b = retained1a.effect; + const retained1c = retained1a[ 'eff' + 'ect' ]; const retained3 = { set effect ( value ) { @@ -20,6 +21,14 @@ define(function () { 'use strict'; retained3.effect = 'retained'; + const retained4 = { + set effect ( value ) { + console.log( value ); + } + }; + + retained4[ 'eff' + 'ect' ] = 'retained'; + const retained7 = { foo: () => {}, get foo () { diff --git a/test/form/samples/side-effects-getters-and-setters/_expected/cjs.js b/test/form/samples/side-effects-getters-and-setters/_expected/cjs.js index 9f78dba83d2..9eb023475b9 100644 --- a/test/form/samples/side-effects-getters-and-setters/_expected/cjs.js +++ b/test/form/samples/side-effects-getters-and-setters/_expected/cjs.js @@ -11,6 +11,7 @@ const retained1a = { }; const retained1b = retained1a.effect; +const retained1c = retained1a[ 'eff' + 'ect' ]; const retained3 = { set effect ( value ) { @@ -20,6 +21,14 @@ const retained3 = { retained3.effect = 'retained'; +const retained4 = { + set effect ( value ) { + console.log( value ); + } +}; + +retained4[ 'eff' + 'ect' ] = 'retained'; + const retained7 = { foo: () => {}, get foo () { diff --git a/test/form/samples/side-effects-getters-and-setters/_expected/es.js b/test/form/samples/side-effects-getters-and-setters/_expected/es.js index ba3a271ce36..8362292d56c 100644 --- a/test/form/samples/side-effects-getters-and-setters/_expected/es.js +++ b/test/form/samples/side-effects-getters-and-setters/_expected/es.js @@ -9,6 +9,7 @@ const retained1a = { }; const retained1b = retained1a.effect; +const retained1c = retained1a[ 'eff' + 'ect' ]; const retained3 = { set effect ( value ) { @@ -18,6 +19,14 @@ const retained3 = { retained3.effect = 'retained'; +const retained4 = { + set effect ( value ) { + console.log( value ); + } +}; + +retained4[ 'eff' + 'ect' ] = 'retained'; + const retained7 = { foo: () => {}, get foo () { diff --git a/test/form/samples/side-effects-getters-and-setters/_expected/iife.js b/test/form/samples/side-effects-getters-and-setters/_expected/iife.js index 063390ac239..aec39303724 100644 --- a/test/form/samples/side-effects-getters-and-setters/_expected/iife.js +++ b/test/form/samples/side-effects-getters-and-setters/_expected/iife.js @@ -12,6 +12,7 @@ }; const retained1b = retained1a.effect; + const retained1c = retained1a[ 'eff' + 'ect' ]; const retained3 = { set effect ( value ) { @@ -21,6 +22,14 @@ retained3.effect = 'retained'; + const retained4 = { + set effect ( value ) { + console.log( value ); + } + }; + + retained4[ 'eff' + 'ect' ] = 'retained'; + const retained7 = { foo: () => {}, get foo () { diff --git a/test/form/samples/side-effects-getters-and-setters/_expected/umd.js b/test/form/samples/side-effects-getters-and-setters/_expected/umd.js index d1ab058c0d2..f9d03f83955 100644 --- a/test/form/samples/side-effects-getters-and-setters/_expected/umd.js +++ b/test/form/samples/side-effects-getters-and-setters/_expected/umd.js @@ -15,6 +15,7 @@ }; const retained1b = retained1a.effect; + const retained1c = retained1a[ 'eff' + 'ect' ]; const retained3 = { set effect ( value ) { @@ -24,6 +25,14 @@ retained3.effect = 'retained'; + const retained4 = { + set effect ( value ) { + console.log( value ); + } + }; + + retained4[ 'eff' + 'ect' ] = 'retained'; + const retained7 = { foo: () => {}, get foo () { diff --git a/test/form/samples/side-effects-getters-and-setters/main.js b/test/form/samples/side-effects-getters-and-setters/main.js index bbe91ad00bb..b3ce3d4a9b6 100644 --- a/test/form/samples/side-effects-getters-and-setters/main.js +++ b/test/form/samples/side-effects-getters-and-setters/main.js @@ -10,6 +10,7 @@ const retained1a = { const removed1 = retained1a.noEffect; const retained1b = retained1a.effect; +const retained1c = retained1a[ 'eff' + 'ect' ]; const removed2a = { get shadowedEffect () { @@ -33,6 +34,14 @@ const retained3 = { retained3.effect = 'retained'; +const retained4 = { + set effect ( value ) { + console.log( value ); + } +}; + +retained4[ 'eff' + 'ect' ] = 'retained'; + const removed5 = { set noEffect ( value ) { const x = value; diff --git a/test/form/samples/side-effects-object-literal-mutation/_expected/amd.js b/test/form/samples/side-effects-object-literal-mutation/_expected/amd.js index c8d2cca8be5..7d706cf2c6f 100644 --- a/test/form/samples/side-effects-object-literal-mutation/_expected/amd.js +++ b/test/form/samples/side-effects-object-literal-mutation/_expected/amd.js @@ -11,12 +11,10 @@ define(['exports'], function (exports) { 'use strict'; delete retained3.x; retained3.x.y = 2; - const retained4 = { x: {} }; - retained4.x = undefined; + const retained4 = { x: undefined }; retained4.x.y = 2; - const retained5 = { x: {} }; - retained5.x = null; + const retained5 = { x: null }; retained5.x.y = 2; const retained6 = { x: { y: {} } }; @@ -24,8 +22,7 @@ define(['exports'], function (exports) { 'use strict'; retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; - const retained8 = { x: { y: {} } }; - retained8.x = retained7.x; + const retained8 = { x: retained7.x }; retained8.x.y.z = 3; exports.retained1 = retained1; diff --git a/test/form/samples/side-effects-object-literal-mutation/_expected/cjs.js b/test/form/samples/side-effects-object-literal-mutation/_expected/cjs.js index fba914234d2..0629a3d2883 100644 --- a/test/form/samples/side-effects-object-literal-mutation/_expected/cjs.js +++ b/test/form/samples/side-effects-object-literal-mutation/_expected/cjs.js @@ -13,12 +13,10 @@ const retained3 = { x: {} }; delete retained3.x; retained3.x.y = 2; -const retained4 = { x: {} }; -retained4.x = undefined; +const retained4 = { x: undefined }; retained4.x.y = 2; -const retained5 = { x: {} }; -retained5.x = null; +const retained5 = { x: null }; retained5.x.y = 2; const retained6 = { x: { y: {} } }; @@ -26,8 +24,7 @@ retained6.x = {}; retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; -const retained8 = { x: { y: {} } }; -retained8.x = retained7.x; +const retained8 = { x: retained7.x }; retained8.x.y.z = 3; exports.retained1 = retained1; diff --git a/test/form/samples/side-effects-object-literal-mutation/_expected/es.js b/test/form/samples/side-effects-object-literal-mutation/_expected/es.js index a65f9857c49..393144c9da4 100644 --- a/test/form/samples/side-effects-object-literal-mutation/_expected/es.js +++ b/test/form/samples/side-effects-object-literal-mutation/_expected/es.js @@ -9,12 +9,10 @@ const retained3 = { x: {} }; delete retained3.x; retained3.x.y = 2; -const retained4 = { x: {} }; -retained4.x = undefined; +const retained4 = { x: undefined }; retained4.x.y = 2; -const retained5 = { x: {} }; -retained5.x = null; +const retained5 = { x: null }; retained5.x.y = 2; const retained6 = { x: { y: {} } }; @@ -22,8 +20,7 @@ retained6.x = {}; retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; -const retained8 = { x: { y: {} } }; -retained8.x = retained7.x; +const retained8 = { x: retained7.x }; retained8.x.y.z = 3; export { retained1 }; diff --git a/test/form/samples/side-effects-object-literal-mutation/_expected/iife.js b/test/form/samples/side-effects-object-literal-mutation/_expected/iife.js index b3747927b47..64a2bffe83d 100644 --- a/test/form/samples/side-effects-object-literal-mutation/_expected/iife.js +++ b/test/form/samples/side-effects-object-literal-mutation/_expected/iife.js @@ -12,12 +12,10 @@ var bundle = (function (exports) { delete retained3.x; retained3.x.y = 2; - const retained4 = { x: {} }; - retained4.x = undefined; + const retained4 = { x: undefined }; retained4.x.y = 2; - const retained5 = { x: {} }; - retained5.x = null; + const retained5 = { x: null }; retained5.x.y = 2; const retained6 = { x: { y: {} } }; @@ -25,8 +23,7 @@ var bundle = (function (exports) { retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; - const retained8 = { x: { y: {} } }; - retained8.x = retained7.x; + const retained8 = { x: retained7.x }; retained8.x.y.z = 3; exports.retained1 = retained1; diff --git a/test/form/samples/side-effects-object-literal-mutation/_expected/umd.js b/test/form/samples/side-effects-object-literal-mutation/_expected/umd.js index a73414962fe..1ed1a9cb205 100644 --- a/test/form/samples/side-effects-object-literal-mutation/_expected/umd.js +++ b/test/form/samples/side-effects-object-literal-mutation/_expected/umd.js @@ -15,12 +15,10 @@ delete retained3.x; retained3.x.y = 2; - const retained4 = { x: {} }; - retained4.x = undefined; + const retained4 = { x: undefined }; retained4.x.y = 2; - const retained5 = { x: {} }; - retained5.x = null; + const retained5 = { x: null }; retained5.x.y = 2; const retained6 = { x: { y: {} } }; @@ -28,8 +26,7 @@ retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; - const retained8 = { x: { y: {} } }; - retained8.x = retained7.x; + const retained8 = { x: retained7.x }; retained8.x.y.z = 3; exports.retained1 = retained1; diff --git a/test/form/samples/side-effects-object-literal-mutation/main.js b/test/form/samples/side-effects-object-literal-mutation/main.js index 115a8386993..e5ae1d89cac 100644 --- a/test/form/samples/side-effects-object-literal-mutation/main.js +++ b/test/form/samples/side-effects-object-literal-mutation/main.js @@ -2,9 +2,6 @@ const removed1 = { x: {} }; removed1.y = 1; removed1.x.y = 2; -const removed2 = { x: 99 }; -removed2.x.y = 2; - export const retained1 = { x: {} }; retained1.y = 1; retained1.x.y = 2; @@ -16,19 +13,26 @@ const retained3 = { x: {} }; delete retained3.x; retained3.x.y = 2; -const retained4 = { x: {} }; -retained4.x = undefined; +const retained4 = { x: undefined }; retained4.x.y = 2; -const retained5 = { x: {} }; -retained5.x = null; +const retained5 = { x: null }; retained5.x.y = 2; +const removed2 = { x: 99 }; +removed2.x.y = 2; + +const removed3 = { x: { y: {} } }; +removed3.x.y.z = 3; + const retained6 = { x: { y: {} } }; retained6.x = {}; retained6.x.y.z = 3; const retained7 = { x: { y: globalVar } }; -const retained8 = { x: { y: {} } }; -retained8.x = retained7.x; +const retained8 = { x: retained7.x }; retained8.x.y.z = 3; + +const removed4 = { a: { x: { y: globalVar } } }; +const removed5 = { x: removed4.a.x }; +removed5.x.y = 2; diff --git a/test/function/samples/cyclic-assignments/_config.js b/test/function/samples/cyclic-assignments/_config.js new file mode 100644 index 00000000000..725db0e2db3 --- /dev/null +++ b/test/function/samples/cyclic-assignments/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'does not fail fo cyclic assignments' +}; diff --git a/test/form/samples/cyclic-assignments/main.js b/test/function/samples/cyclic-assignments/main.js similarity index 100% rename from test/form/samples/cyclic-assignments/main.js rename to test/function/samples/cyclic-assignments/main.js