diff --git a/src/ast/analyse.js b/src/ast/analyse.js index d6735d9..63bf42a 100644 --- a/src/ast/analyse.js +++ b/src/ast/analyse.js @@ -145,19 +145,27 @@ export default function analyse ( ast, magicString, module ) { } function checkForWrites ( node ) { - if ( node.type === 'AssignmentExpression' ) { - let assignee = node.left; - - while ( assignee.type === 'MemberExpression' ) { - assignee = assignee.object; + function addNode ( node ) { + while ( node.type === 'MemberExpression' ) { + node = node.object; } - if ( assignee.type !== 'Identifier' ) { // could be a ThisExpression + if ( node.type !== 'Identifier' ) { return; } - statement._modifies[ assignee.name ] = true; + statement._modifies[ node.name ] = true; + } + + if ( node.type === 'AssignmentExpression' ) { + addNode( node.left ); + } + + else if ( node.type === 'CallExpression' ) { + node.arguments.forEach( addNode ); } + + // TODO UpdateExpression } walk( statement, { diff --git a/test/samples/function-side-effects/_config.js b/test/samples/function-side-effects/_config.js new file mode 100644 index 0000000..853c190 --- /dev/null +++ b/test/samples/function-side-effects/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'assumes functions may mutate objects passed in' +}; \ No newline at end of file diff --git a/test/samples/function-side-effects/main.js b/test/samples/function-side-effects/main.js new file mode 100644 index 0000000..9eda262 --- /dev/null +++ b/test/samples/function-side-effects/main.js @@ -0,0 +1,3 @@ +import object from './object'; +assert.ok( object.mutated ); + diff --git a/test/samples/function-side-effects/mutate.js b/test/samples/function-side-effects/mutate.js new file mode 100644 index 0000000..606657b --- /dev/null +++ b/test/samples/function-side-effects/mutate.js @@ -0,0 +1,3 @@ +export default function mutate ( object ) { + object.mutated = true; +} \ No newline at end of file diff --git a/test/samples/function-side-effects/object.js b/test/samples/function-side-effects/object.js new file mode 100644 index 0000000..75bbf50 --- /dev/null +++ b/test/samples/function-side-effects/object.js @@ -0,0 +1,6 @@ +import mutate from './mutate'; + +var object = {}; +mutate( object ); + +export default object; \ No newline at end of file