diff --git a/src/ast/nodes/ArrayExpression.ts b/src/ast/nodes/ArrayExpression.ts index e076c8eda59..60b4049ad9a 100644 --- a/src/ast/nodes/ArrayExpression.ts +++ b/src/ast/nodes/ArrayExpression.ts @@ -5,7 +5,8 @@ import { getMemberReturnExpressionWhenCalled, hasMemberEffectWhenCalled, ObjectPath, - UNKNOWN_EXPRESSION + UNKNOWN_EXPRESSION, + UNKNOWN_PATH } from '../values'; import * as NodeType from './NodeType'; import { ExpressionNode, NodeBase } from './shared/Node'; @@ -15,6 +16,13 @@ export default class ArrayExpression extends NodeBase { type: NodeType.tArrayExpression; elements: (ExpressionNode | SpreadElement | null)[]; + bind() { + super.bind(); + for (const element of this.elements) { + if (element !== null) element.reassignPath(UNKNOWN_PATH); + } + } + getReturnExpressionWhenCalledAtPath(path: ObjectPath) { if (path.length !== 1) return UNKNOWN_EXPRESSION; return getMemberReturnExpressionWhenCalled(arrayMembers, path[0]); diff --git a/test/function/samples/reassign-array-literal-elements/_config.js b/test/function/samples/reassign-array-literal-elements/_config.js new file mode 100644 index 00000000000..cba1867556a --- /dev/null +++ b/test/function/samples/reassign-array-literal-elements/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'makes sure reassignments of array elements are tracked' +}; diff --git a/test/function/samples/reassign-array-literal-elements/main.js b/test/function/samples/reassign-array-literal-elements/main.js new file mode 100644 index 00000000000..63c3147ec43 --- /dev/null +++ b/test/function/samples/reassign-array-literal-elements/main.js @@ -0,0 +1,8 @@ +var foo = {x: true}; +var bar = {x: true}; +var baz = [foo, bar]; + +baz[0].x = false; +baz[1].x = false; + +if (foo.x) assert.fail('foo was not reassigned');