From dee7261bbead22e9c22cac30e62d40d1283fc0fc Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Mon, 29 Jun 2015 13:48:19 -0400 Subject: [PATCH] Merge pull request babel/babel-eslint#140 from hzoo/i-138 create scope for each comprehension - fixes babel/babel-eslint#138 --- eslint/babel-eslint-parser/index.js | 41 ++++++++++++++----- .../test/non-regression.js | 30 ++++++++++++-- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/eslint/babel-eslint-parser/index.js b/eslint/babel-eslint-parser/index.js index 7d09ca5043..44893c80e4 100644 --- a/eslint/babel-eslint-parser/index.js +++ b/eslint/babel-eslint-parser/index.js @@ -300,22 +300,41 @@ function monkeypatch() { } }; - referencer.prototype.ComprehensionBlock = function(node) { - var left = node.left; - if (left) { - if (left.type === "Identifier") { - createScopeVariable.call(this, node, left); - } else if (left.type === "ArrayPattern") { - for (var i = 0; i < left.elements.length; i++) { - if (left.elements[i]) { - createScopeVariable.call(this, left.elements, left.elements[i]); + referencer.prototype.ComprehensionExpression = function(node) { + for (var i = 0; i < node.blocks.length; i++) { + var block = node.blocks[i]; + if (block.left) { + var scope = new escope.Scope(this.scopeManager, "comprehensions", this.currentScope(), node, false); + this.scopeManager.__nestScope(scope); + + var left = block.left; + if (left.type === "Identifier") { + scope.__define(left, new Definition("ComprehensionElement", left, left)); + } else if (left.type === "ArrayPattern") { + for (var i = 0; i < left.elements.length; i++) { + var name = left.elements[i]; + if (name) { + scope.__define(name, new Definition("ComprehensionElement", name, name)); + } + } + } else if (left.type === "ObjectPattern") { + for (var i = 0; i < left.properties.length; i++) { + var name = left.properties[i]; + if (name && name.key && name.key.type === 'Identifier') { + scope.__define(name.key, new Definition("ComprehensionElement", name.key, name.key)); + } } } } + if (block.right) { + this.visit(block.right); + } } - if (node.right) { - this.visit(node.right); + if (node.filter) { + this.visit(block.filter); } + this.visit(node.body); + this.close(node); }; referencer.prototype.DeclareModule = diff --git a/eslint/babel-eslint-parser/test/non-regression.js b/eslint/babel-eslint-parser/test/non-regression.js index c9d4aeb886..6be4343f42 100644 --- a/eslint/babel-eslint-parser/test/non-regression.js +++ b/eslint/babel-eslint-parser/test/non-regression.js @@ -1017,7 +1017,7 @@ describe("verify", function () { ); }); - it("expression, if statement, multiple blocks", function () { + it("generator, if statement, multiple blocks", function () { verifyAndAssertMessages([ "let arr = [1, 2, 3];", "let arr2 = [1, 2, 3];", @@ -1031,13 +1031,37 @@ describe("verify", function () { it("ArrayPattern", function () { verifyAndAssertMessages([ "let arr = [1, 2, 3];", - "let arr2 = [1, 2, 3];", - "[for ([,x] of arr) for ({[start.x]: x, [start.y]: y} of arr2) x]" + "[for ([,x] of arr) x]" ].join("\n"), { "no-unused-vars": 1, "no-undef": 1 }, [] ); }); + + it("ObjectPattern", function () { + verifyAndAssertMessages([ + "let arr = [{x: 1, y: 2}, {x: 2, y: 3}];", + "[for ({x, y} of arr) x + y]" + ].join("\n"), + { "no-unused-vars": 1, "no-undef": 1 }, + [] + ); + }); + + it("multiple comprehensions #138", function () { + verifyAndAssertMessages([ + "function test() {", + "let items;", + "return {", + "a: [for (i of items) i],", + "b: [for (i of items) i]", + "};", + "} test;" + ].join("\n"), + { "no-unused-vars": 1, "no-undef": 1, "no-redeclare": 1 }, + [] + ); + }); }); describe("decorators #72", function () {