make let scoping collision detection much more reliable
This commit is contained in:
parent
ddd59b94b0
commit
320c78b815
@ -162,21 +162,32 @@ LetScoping.prototype.noClosure = function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
LetScoping.prototype.remap = function () {
|
LetScoping.prototype.remap = function () {
|
||||||
var replacements = this.info.duplicates;
|
var duplicates = this.info.duplicates;
|
||||||
var block = this.block;
|
var block = this.block;
|
||||||
|
var scope = this.scope;
|
||||||
|
|
||||||
if (!this.info.hasDuplicates) return;
|
if (!this.info.hasDuplicates) return;
|
||||||
|
|
||||||
var replace = function (node, parent, scope, context, replacements) {
|
var replace = function (node, parent, scope, context, duplicates) {
|
||||||
if (!t.isIdentifier(node)) return;
|
if (!t.isIdentifier(node)) return;
|
||||||
if (!t.isReferenced(node, parent)) return;
|
if (!t.isReferenced(node, parent)) return;
|
||||||
if (scope && scope.hasOwn(node.name)) return;
|
|
||||||
node.name = replacements[node.name] || node.name;
|
var duplicate = duplicates[node.name];
|
||||||
|
if (!duplicate) return;
|
||||||
|
|
||||||
|
var own = scope.get(node.name, true);
|
||||||
|
if (own === duplicate.node) {
|
||||||
|
node.name = duplicate.uid;
|
||||||
|
} else {
|
||||||
|
// scope already has it's own declaration that doesn't
|
||||||
|
// match the one we have a stored replacement for
|
||||||
|
context.skip();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var traverseReplace = function (node, parent) {
|
var traverseReplace = function (node, parent) {
|
||||||
replace(node, parent);
|
replace(node, parent);
|
||||||
traverse(node, { enter: replace }, null, replacements);
|
traverse(node, { enter: replace }, scope, duplicates);
|
||||||
};
|
};
|
||||||
|
|
||||||
var loopParent = this.loopParent;
|
var loopParent = this.loopParent;
|
||||||
@ -186,7 +197,7 @@ LetScoping.prototype.remap = function () {
|
|||||||
traverseReplace(loopParent.update, loopParent);
|
traverseReplace(loopParent.update, loopParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
traverse(block, { enter: replace }, null, replacements);
|
traverse(block, { enter: replace }, scope, duplicates);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -221,12 +232,14 @@ LetScoping.prototype.getInfo = function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var duplicates = function (id, key) {
|
var duplicates = function (id, key) {
|
||||||
var has = scope.parentGet(key);
|
// there's a variable with this exact name in an upper scope so we need
|
||||||
|
// to generate a new name
|
||||||
if (has && has !== id) {
|
if (scope.parentHas(key, true)) {
|
||||||
// there's a variable with this exact name in an upper scope so we need
|
var duplicate = opts.duplicates[key] = {
|
||||||
// to generate a new name
|
uid: file.generateUidIdentifier(key, scope).name,
|
||||||
opts.duplicates[key] = id.name = file.generateUidIdentifier(key, scope).name;
|
node: id
|
||||||
|
};
|
||||||
|
id.name = duplicate.uid;
|
||||||
opts.hasDuplicates = true;
|
opts.hasDuplicates = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -305,7 +318,7 @@ LetScoping.prototype.checkLoop = function () {
|
|||||||
|
|
||||||
if (replace) return t.inherits(replace, node);
|
if (replace) return t.inherits(replace, node);
|
||||||
}
|
}
|
||||||
}, null, has);
|
}, this.scope, has);
|
||||||
|
|
||||||
return has;
|
return has;
|
||||||
};
|
};
|
||||||
@ -332,7 +345,7 @@ LetScoping.prototype.hoistVarDeclarations = function () {
|
|||||||
return context.skip();
|
return context.skip();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, null, this);
|
}, this.scope, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -347,7 +360,8 @@ LetScoping.prototype.getParams = function (params) {
|
|||||||
var info = this.info;
|
var info = this.info;
|
||||||
params = _.cloneDeep(params);
|
params = _.cloneDeep(params);
|
||||||
_.each(params, function (param) {
|
_.each(params, function (param) {
|
||||||
param.name = info.duplicates[param.name] || param.name;
|
var duplicate = info.duplicates[param.name];
|
||||||
|
if (duplicate) param.name = duplicate.uid;
|
||||||
});
|
});
|
||||||
return params;
|
return params;
|
||||||
};
|
};
|
||||||
@ -388,12 +402,12 @@ LetScoping.prototype.getLetReferences = function () {
|
|||||||
// push this badboy
|
// push this badboy
|
||||||
state.self.letReferences[node.name] = node;
|
state.self.letReferences[node.name] = node;
|
||||||
}
|
}
|
||||||
}, null, state);
|
}, scope, state);
|
||||||
|
|
||||||
return context.skip();
|
return context.skip();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, null, state);
|
}, this.scope, state);
|
||||||
|
|
||||||
return state.closurify;
|
return state.closurify;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,19 +4,19 @@ var A = new WeakMap();
|
|||||||
var B = new WeakMap(),
|
var B = new WeakMap(),
|
||||||
C = new WeakMap();
|
C = new WeakMap();
|
||||||
var D = (function () {
|
var D = (function () {
|
||||||
var F = new WeakMap(),
|
var _F = new WeakMap(),
|
||||||
G = new WeakMap();
|
_G = new WeakMap();
|
||||||
var E = new WeakMap();
|
var _E = new WeakMap();
|
||||||
function D() {}
|
function D() {}
|
||||||
|
|
||||||
return D;
|
return D;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
var H = (function () {
|
var H = (function () {
|
||||||
var J = new WeakMap(),
|
var _J = new WeakMap(),
|
||||||
K = new WeakMap();
|
_K = new WeakMap();
|
||||||
var I = new WeakMap();
|
var _I = new WeakMap();
|
||||||
function H() {}
|
function H() {}
|
||||||
|
|
||||||
return H;
|
return H;
|
||||||
})();
|
})();
|
||||||
@ -4,9 +4,9 @@ var arr = (function () {
|
|||||||
var _arr = [];
|
var _arr = [];
|
||||||
|
|
||||||
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
||||||
var _i = _step.value;
|
var i = _step.value;
|
||||||
if (_i > 1) {
|
if (i > 1) {
|
||||||
_arr.push(_i * _i);
|
_arr.push(i * i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,9 @@ var seattlers = (function () {
|
|||||||
for (var _iterator = countries[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
for (var _iterator = countries[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
||||||
var customers = _step.value;
|
var customers = _step.value;
|
||||||
for (var _iterator2 = customers[Symbol.iterator](), _step2; !(_step2 = _iterator2.next()).done;) {
|
for (var _iterator2 = customers[Symbol.iterator](), _step2; !(_step2 = _iterator2.next()).done;) {
|
||||||
var _c = _step2.value;
|
var c = _step2.value;
|
||||||
if (_c.city == "Seattle") {
|
if (c.city == "Seattle") {
|
||||||
_seattlers.push({ name: _c.name, age: _c.age });
|
_seattlers.push({ name: c.name, age: c.age });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,9 +4,9 @@ var arr = (function () {
|
|||||||
var _arr = [];
|
var _arr = [];
|
||||||
|
|
||||||
for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
|
||||||
var _i = _step.value;
|
var i = _step.value;
|
||||||
if (_i > 1) {
|
if (i > 1) {
|
||||||
_arr.push(_i * _i);
|
_arr.push(i * i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
21
test/fixtures/transformation/es7-exponentian-operator/comprehensive/exec.js
vendored
Normal file
21
test/fixtures/transformation/es7-exponentian-operator/comprehensive/exec.js
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
assert.equal(8, 2 ** 3);
|
||||||
|
assert.equal(24, 3 * 2 ** 3);
|
||||||
|
var x = 2;
|
||||||
|
assert.equal(8, 2 ** ++x);
|
||||||
|
assert.equal(1, (2 ** -1) * 2);
|
||||||
|
|
||||||
|
var calls = 0;
|
||||||
|
var q = {q: 3};
|
||||||
|
var o = {
|
||||||
|
get p() {
|
||||||
|
calls++;
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
o.p.q **= 2;
|
||||||
|
assert.equal(1, calls);
|
||||||
|
assert.equal(9, o.p.q);
|
||||||
|
|
||||||
|
assert.equal(512, 2 ** (3 ** 2));
|
||||||
|
assert.equal(512, 2 ** 3 ** 2);
|
||||||
Loading…
x
Reference in New Issue
Block a user