fix for-head duplication testing and replacement - fixes #162

This commit is contained in:
Sebastian McKenzie 2014-11-15 02:50:05 +11:00
parent 58fac2e2be
commit 85c2de57e4
4 changed files with 42 additions and 11 deletions

View File

@ -145,11 +145,25 @@ LetScoping.prototype.noClosure = function () {
if (_.isEmpty(replacements)) return;
traverse(block, function (node, parent) {
var replace = function (node, parent) {
if (!t.isIdentifier(node)) return;
if (!t.isReferenced(node, parent)) return;
node.name = replacements[node.name] || node.name;
});
};
var traverseReplace = function (node, parent) {
replace(node, parent);
traverse(node, replace);
};
var forParent = this.forParent;
if (forParent) {
traverseReplace(forParent.right, forParent);
traverseReplace(forParent.test, forParent);
traverseReplace(forParent.update, forParent);
}
traverse(block, replace);
};
/**
@ -181,10 +195,23 @@ LetScoping.prototype.getInfo = function () {
keys: []
};
var duplicates = function (id, key) {
var has = scope.parentGet(key);
if (has && has !== id) {
// there's a variable with this exact name in an upper scope so we need
// to generate a new name
opts.duplicates[key] = id.name = file.generateUid(key, scope);
}
};
_.each(opts.declarators, function (declar) {
opts.declarators.push(declar);
var keys = t.getIds(declar);
var keys = t.getIds(declar, true);
_.each(keys, duplicates);
keys = _.keys(keys);
opts.outsideKeys = opts.outsideKeys.concat(keys);
opts.keys = opts.keys.concat(keys);
});
@ -193,14 +220,7 @@ LetScoping.prototype.getInfo = function () {
if (!isLet(declar)) return;
_.each(t.getIds(declar, true), function (id, key) {
var has = scope.parentGet(key);
if (has && has !== id) {
// there's a variable with this exact name in an upper scope so we need
// to generate a new name
opts.duplicates[key] = id.name = file.generateUid(key, scope);
}
duplicates(id, key);
opts.keys.push(key);
});
});

View File

@ -0,0 +1,6 @@
let x = 1;
{
let x = 2;
assert.equal(x, 2);
}
assert.equal(x, 1);

View File

@ -0,0 +1,5 @@
assert.equal((function(){
let a = 1;
for (let a = 0; a < 8; a++) {}
return a;
}()), 1);