Skip to content

Commit 7af71d4

Browse files
committed
allow a['b'] instead of a.b
fixed webpack#2228
1 parent fd5b896 commit 7af71d4

2 files changed

Lines changed: 32 additions & 8 deletions

File tree

lib/Parser.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,10 @@ Parser.prototype.initializeEvaluating = function() {
234234
this.plugin("evaluate MemberExpression", function(expression) {
235235
var expr = expression;
236236
var exprName = [];
237-
while(expr.type === "MemberExpression" && !expr.computed) {
238-
exprName.unshift(expr.property.name);
237+
while(expr.type === "MemberExpression" &&
238+
expr.property.type === (expr.computed ? "Literal" : "Identifier")
239+
) {
240+
exprName.unshift(expr.property.name || expr.property.value);
239241
expr = expr.object;
240242
}
241243
if(expr.type === "Identifier") {
@@ -255,10 +257,11 @@ Parser.prototype.initializeEvaluating = function() {
255257
});
256258
this.plugin("evaluate CallExpression", function(expr) {
257259
if(expr.callee.type !== "MemberExpression") return;
258-
if(expr.callee.computed) return;
260+
if(expr.callee.property.type !== (expr.callee.computed ? "Literal" : "Identifier")) return;
259261
var param = this.evaluateExpression(expr.callee.object);
260262
if(!param) return;
261-
return this.applyPluginsBailResult("evaluate CallExpression ." + expr.callee.property.name, expr, param);
263+
var property = expr.callee.property.name || expr.callee.property.value;
264+
return this.applyPluginsBailResult("evaluate CallExpression ." + property, expr, param);
262265
});
263266
this.plugin("evaluate CallExpression .replace", function(expr, param) {
264267
if(!param.isString()) return;
@@ -683,8 +686,10 @@ Parser.prototype.walkUnaryExpression = function walkUnaryExpression(expression)
683686
if(expression.operator === "typeof") {
684687
var expr = expression.argument;
685688
var exprName = [];
686-
while(expr.type === "MemberExpression" && !expr.computed) {
687-
exprName.unshift(expr.property.name);
689+
while(expr.type === "MemberExpression" &&
690+
expr.property.type === (expr.computed ? "Literal" : "Identifier")
691+
) {
692+
exprName.unshift(expr.property.name || expr.property.value);
688693
expr = expr.object;
689694
}
690695
if(expr.type === "Identifier" && this.scope.definitions.indexOf(expr.name) === -1) {
@@ -821,8 +826,10 @@ Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
821826
Parser.prototype.walkMemberExpression = function walkMemberExpression(expression) {
822827
var expr = expression;
823828
var exprName = [];
824-
while(expr.type === "MemberExpression" && !expr.computed) {
825-
exprName.unshift(expr.property.name);
829+
while(expr.type === "MemberExpression" &&
830+
expr.property.type === (expr.computed ? "Literal" : "Identifier")
831+
) {
832+
exprName.unshift(expr.property.name || expr.property.value);
826833
expr = expr.object;
827834
}
828835
if(expr.type === "Identifier" && this.scope.definitions.indexOf(expr.name) === -1) {

test/Parser.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,27 @@ describe("Parser", function() {
1919
cdeabc: ["membertest"]
2020
}
2121
],
22+
"call member using bracket notation": [
23+
function() {
24+
cde["abc"]("membertest");
25+
}, {
26+
cdeabc: ["membertest"]
27+
}
28+
],
2229
"call inner member": [
2330
function() {
2431
cde.ddd.abc("inner");
2532
}, {
2633
cdedddabc: ["inner"]
2734
}
2835
],
36+
"call inner member using bracket notation": [
37+
function() {
38+
cde.ddd["abc"]("inner");
39+
}, {
40+
cdedddabc: ["inner"]
41+
}
42+
],
2943
"expression": [
3044
function() {
3145
fgh;
@@ -227,10 +241,13 @@ describe("Parser", function() {
227241
"typeof 'str'": "string=string",
228242
"typeof aString": "string=string",
229243
"typeof b.Number": "string=number",
244+
"typeof b['Number']": "string=number",
230245
"typeof b[Number]": "",
231246
"b.Number": "number=123",
247+
"b['Number']": "number=123",
232248
"b[Number]": "",
233249
"'abc'.substr(1)": "string=bc",
250+
"'abc'[\"substr\"](1)": "string=bc",
234251
"'abc'[substr](1)": "",
235252
};
236253

0 commit comments

Comments
 (0)