fixed detection of free vars while evaluating

This commit is contained in:
Tobias Koppers 2014-10-07 15:15:09 +02:00
parent a648f115fa
commit 27b23c0302
2 changed files with 33 additions and 15 deletions

View File

@ -167,21 +167,26 @@ Parser.prototype.initializeEvaluating = function() {
this.plugin("evaluate UnaryExpression", function(expr) {
if(expr.operator === "typeof") {
if(expr.argument.type === "Identifier") {
var res = this.applyPluginsBailResult("evaluate typeof " + expr.argument.name, expr);
if(res !== undefined) return res;
var name = this.scope.renames["$"+expr.argument.name] || expr.argument.name;
if(this.scope.definitions.indexOf(name) === -1) {
var res = this.applyPluginsBailResult("evaluate typeof " + name, expr);
if(res !== undefined) return res;
}
}
if(expr.argument.type === "MemberExpression") {
var expression = expr.argument;
var exprName = [];
while(expression.type === "MemberExpression" && expression.property.type === "Identifier") {
exprName.unshift(expression.property.name);
exprName.unshift(this.scope.renames["$"+expression.property.name] || expression.property.name);
expression = expression.object;
}
if(expression.type === "Identifier" && this.scope.definitions.indexOf(expression.name) === -1) {
if(expression.type === "Identifier") {
exprName.unshift(this.scope.renames["$"+expression.name] || expression.name);
exprName = exprName.join(".");
var res = this.applyPluginsBailResult("evaluate typeof " + exprName, expr);
if(res !== undefined) return res;
if(this.scope.definitions.indexOf(name) === -1) {
exprName = exprName.join(".");
var res = this.applyPluginsBailResult("evaluate typeof " + exprName, expr);
if(res !== undefined) return res;
}
}
}
if(expr.argument.type === "FunctionExpression") {
@ -222,14 +227,17 @@ Parser.prototype.initializeEvaluating = function() {
expr = expr.object;
}
if(expr.type === "Identifier") {
exprName.unshift(this.scope.renames["$"+expr.name] || expr.name);
exprName = exprName.join(".");
if(this.scope.definitions.indexOf(expr.name) === -1) {
var result = this.applyPluginsBailResult("evaluate Identifier " + exprName, expression);
if(result) return result;
return new BasicEvaluatedExpression().setIdentifier(exprName).setRange(expression.range);
} else {
return this.applyPluginsBailResult("evaluate defined Identifier " + exprName, expression);
var name = this.scope.renames["$"+expr.name] || expr.name;
if(this.scope.definitions.indexOf(name) === -1) {
exprName.unshift(name);
exprName = exprName.join(".");
if(this.scope.definitions.indexOf(expr.name) === -1) {
var result = this.applyPluginsBailResult("evaluate Identifier " + exprName, expression);
if(result) return result;
return new BasicEvaluatedExpression().setIdentifier(exprName).setRange(expression.range);
} else {
return this.applyPluginsBailResult("evaluate defined Identifier " + exprName, expression);
}
}
}
});

View File

@ -0,0 +1,10 @@
var fn = function(module) {
if (typeof module !== 'number') {
throw new Error("module should be a number");
}
(typeof module).should.be.eql("number");
};
it("should hide a free var by function argument", function() {
fn(1);
});