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) {
var left = node.left;
if (left) {
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") {
createScopeVariable.call(this, node, left);
scope.__define(left, new Definition("ComprehensionElement", left, 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]);
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 (node.right) {
this.visit(node.right);
if (block.right) {
this.visit(block.right);
}
}
if (node.filter) {
this.visit(block.filter);
}
this.visit(node.body);
this.close(node);
};
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([
"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 () {