Skip to content

Commit cc93080

Browse files
committed
more similar bugs with testcases
fixed webpack#626
1 parent a1ceccf commit cc93080

2 files changed

Lines changed: 21 additions & 6 deletions

File tree

lib/Parser.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ Parser.prototype.initializeEvaluating = function() {
176176
if(expr.argument.type === "MemberExpression") {
177177
var expression = expr.argument;
178178
var exprName = [];
179-
while(expression.type === "MemberExpression" && expression.property.type === "Identifier") {
179+
while(expression.type === "MemberExpression" && !expression.computed) {
180180
exprName.unshift(this.scope.renames["$"+expression.property.name] || expression.property.name);
181181
expression = expression.object;
182182
}
@@ -222,7 +222,7 @@ Parser.prototype.initializeEvaluating = function() {
222222
this.plugin("evaluate MemberExpression", function(expression) {
223223
var expr = expression;
224224
var exprName = [];
225-
while(expr.type === "MemberExpression" && expr.property.type === "Identifier") {
225+
while(expr.type === "MemberExpression" && !expr.computed) {
226226
exprName.unshift(expr.property.name);
227227
expr = expr.object;
228228
}
@@ -243,7 +243,7 @@ Parser.prototype.initializeEvaluating = function() {
243243
});
244244
this.plugin("evaluate CallExpression", function(expr) {
245245
if(expr.callee.type !== "MemberExpression") return;
246-
if(expr.callee.property.type !== "Identifier") return;
246+
if(expr.callee.computed) return;
247247
var param = this.evaluateExpression(expr.callee.object);
248248
if(!param) return;
249249
return this.applyPluginsBailResult("evaluate CallExpression ." + expr.callee.property.name, expr, param);
@@ -539,7 +539,7 @@ Parser.prototype.walkUnaryExpression = function walkUnaryExpression(expression)
539539
if(expression.operator === "typeof") {
540540
var expr = expression.argument;
541541
var exprName = [];
542-
while(expr.type === "MemberExpression" && expr.property.type === "Identifier") {
542+
while(expr.type === "MemberExpression" && !expr.computed) {
543543
exprName.unshift(expr.property.name);
544544
expr = expr.object;
545545
}
@@ -630,7 +630,7 @@ Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
630630
this.walkExpression(functionExpression.body);
631631
}.bind(this));
632632
}
633-
if(expression.callee.type === "MemberExpression" && expression.callee.object.type === "FunctionExpression" && expression.callee.property.type === "Identifier" && ["call", "bind"].indexOf(expression.callee.property.name) >= 0 && expression.arguments && expression.arguments.length > 1) {
633+
if(expression.callee.type === "MemberExpression" && expression.callee.object.type === "FunctionExpression" && !expression.callee.computed && ["call", "bind"].indexOf(expression.callee.property.name) >= 0 && expression.arguments && expression.arguments.length > 1) {
634634
// (function(...) { }.call/bind(?, ...))
635635
walkIIFE.call(this, expression.callee.object, expression.arguments.slice(1));
636636
this.walkExpression(expression.arguments[0]);
@@ -656,7 +656,7 @@ Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
656656
Parser.prototype.walkMemberExpression = function walkMemberExpression(expression) {
657657
var expr = expression;
658658
var exprName = [];
659-
while(expr.type === "MemberExpression" && expr.property.type === "Identifier") {
659+
while(expr.type === "MemberExpression" && !expr.computed) {
660660
exprName.unshift(expr.property.name);
661661
expr = expr.object;
662662
}

test/Parser.test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var should = require("should");
22

33
var Parser = require("../lib/Parser");
4+
var BasicEvaluatedExpression = require("../lib/BasicEvaluatedExpression");
45

56
describe("Parser", function() {
67
var testCases = {
@@ -202,6 +203,12 @@ describe("Parser", function() {
202203
parser.plugin("call test", function(expr) {
203204
this.state.result = this.evaluateExpression(expr.arguments[0]);
204205
});
206+
parser.plugin("evaluate Identifier aString", function(expr) {
207+
return new BasicEvaluatedExpression().setString("aString").setRange(expr.range);
208+
});
209+
parser.plugin("evaluate Identifier b.Number", function(expr) {
210+
return new BasicEvaluatedExpression().setNumber(123).setRange(expr.range);
211+
});
205212
return parser.parse("test(" + source + ");").result;
206213
}
207214

@@ -228,6 +235,14 @@ describe("Parser", function() {
228235
"a ? 'o1' : b ? 'o2' : c ? 'o3' : 'o4'": "options=['o1' string=o1],['o2' string=o2],['o3' string=o3],['o4' string=o4]",
229236
"a ? 'o1' : b ? b : c ? 'o3' : c": "options=['o1' string=o1],[b],['o3' string=o3],[c]",
230237
"['i1', 'i2', 3, a, b ? 4 : 5]": "items=['i1' string=i1],['i2' string=i2],[3 number=3],[a],[b ? 4 : 5 options=[4 number=4],[5 number=5]]",
238+
"typeof 'str'": "string=string",
239+
"typeof aString": "string=string",
240+
"typeof b.Number": "string=number",
241+
"typeof b[Number]": "",
242+
"b.Number": "number=123",
243+
"b[Number]": "",
244+
"'abc'.substr(1)": "string=bc",
245+
"'abc'[substr](1)": "",
231246
};
232247

233248
Object.keys(testCases).forEach(function(key) {

0 commit comments

Comments
 (0)