Merge pull request babel/babel-eslint#140 from hzoo/i-138

create scope for each comprehension - fixes babel/babel-eslint#138
This commit is contained in:
Henry Zhu 2015-06-29 13:48:19 -04:00
parent 1502bf6a2d
commit dee7261bbe
2 changed files with 57 additions and 14 deletions

View File

@ -300,22 +300,41 @@ function monkeypatch() {
} }
}; };
referencer.prototype.ComprehensionBlock = function(node) { referencer.prototype.ComprehensionExpression = function(node) {
var left = node.left; for (var i = 0; i < node.blocks.length; i++) {
if (left) { 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") { if (left.type === "Identifier") {
createScopeVariable.call(this, node, left); scope.__define(left, new Definition("ComprehensionElement", left, left));
} else if (left.type === "ArrayPattern") { } else if (left.type === "ArrayPattern") {
for (var i = 0; i < left.elements.length; i++) { for (var i = 0; i < left.elements.length; i++) {
if (left.elements[i]) { var name = left.elements[i];
createScopeVariable.call(this, left.elements, 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 (node.right) { if (block.right) {
this.visit(node.right); this.visit(block.right);
} }
}
if (node.filter) {
this.visit(block.filter);
}
this.visit(node.body);
this.close(node);
}; };
referencer.prototype.DeclareModule = referencer.prototype.DeclareModule =

View File

@ -1017,7 +1017,7 @@ describe("verify", function () {
); );
}); });
it("expression, if statement, multiple blocks", function () { it("generator, if statement, multiple blocks", function () {
verifyAndAssertMessages([ verifyAndAssertMessages([
"let arr = [1, 2, 3];", "let arr = [1, 2, 3];",
"let arr2 = [1, 2, 3];", "let arr2 = [1, 2, 3];",
@ -1031,13 +1031,37 @@ describe("verify", function () {
it("ArrayPattern", function () { it("ArrayPattern", function () {
verifyAndAssertMessages([ verifyAndAssertMessages([
"let arr = [1, 2, 3];", "let arr = [1, 2, 3];",
"let arr2 = [1, 2, 3];", "[for ([,x] of arr) x]"
"[for ([,x] of arr) for ({[start.x]: x, [start.y]: y} of arr2) x]"
].join("\n"), ].join("\n"),
{ "no-unused-vars": 1, "no-undef": 1 }, { "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 () { describe("decorators #72", function () {