Skip to content

Commit 758f1eb

Browse files
committed
Merge branch 'master' into next
2 parents d526d5f + 6ff0fbd commit 758f1eb

File tree

4 files changed

+86
-1
lines changed

4 files changed

+86
-1
lines changed

lib/Parser.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,15 @@ class Parser extends Tapable {
278278
res.setNumber(left.number / right.number);
279279
res.setRange(expr.range);
280280
return res;
281+
} else if(expr.operator === "**") {
282+
left = this.evaluateExpression(expr.left);
283+
right = this.evaluateExpression(expr.right);
284+
if(!left || !right) return;
285+
if(!left.isNumber() || !right.isNumber()) return;
286+
res = new BasicEvaluatedExpression();
287+
res.setNumber(Math.pow(left.number, right.number));
288+
res.setRange(expr.range);
289+
return res;
281290
} else if(expr.operator === "==" || expr.operator === "===") {
282291
left = this.evaluateExpression(expr.left);
283292
right = this.evaluateExpression(expr.right);
@@ -304,6 +313,60 @@ class Parser extends Tapable {
304313
} else if(left.isBoolean() && right.isBoolean()) {
305314
return res.setBoolean(left.bool !== right.bool);
306315
}
316+
} else if(expr.operator === "&") {
317+
left = this.evaluateExpression(expr.left);
318+
right = this.evaluateExpression(expr.right);
319+
if(!left || !right) return;
320+
if(!left.isNumber() || !right.isNumber()) return;
321+
res = new BasicEvaluatedExpression();
322+
res.setNumber(left.number & right.number);
323+
res.setRange(expr.range);
324+
return res;
325+
} else if(expr.operator === "|") {
326+
left = this.evaluateExpression(expr.left);
327+
right = this.evaluateExpression(expr.right);
328+
if(!left || !right) return;
329+
if(!left.isNumber() || !right.isNumber()) return;
330+
res = new BasicEvaluatedExpression();
331+
res.setNumber(left.number | right.number);
332+
res.setRange(expr.range);
333+
return res;
334+
} else if(expr.operator === "^") {
335+
left = this.evaluateExpression(expr.left);
336+
right = this.evaluateExpression(expr.right);
337+
if(!left || !right) return;
338+
if(!left.isNumber() || !right.isNumber()) return;
339+
res = new BasicEvaluatedExpression();
340+
res.setNumber(left.number ^ right.number);
341+
res.setRange(expr.range);
342+
return res;
343+
} else if(expr.operator === ">>>") {
344+
left = this.evaluateExpression(expr.left);
345+
right = this.evaluateExpression(expr.right);
346+
if(!left || !right) return;
347+
if(!left.isNumber() || !right.isNumber()) return;
348+
res = new BasicEvaluatedExpression();
349+
res.setNumber(left.number >>> right.number);
350+
res.setRange(expr.range);
351+
return res;
352+
} else if(expr.operator === ">>") {
353+
left = this.evaluateExpression(expr.left);
354+
right = this.evaluateExpression(expr.right);
355+
if(!left || !right) return;
356+
if(!left.isNumber() || !right.isNumber()) return;
357+
res = new BasicEvaluatedExpression();
358+
res.setNumber(left.number >> right.number);
359+
res.setRange(expr.range);
360+
return res;
361+
} else if(expr.operator === "<<") {
362+
left = this.evaluateExpression(expr.left);
363+
right = this.evaluateExpression(expr.right);
364+
if(!left || !right) return;
365+
if(!left.isNumber() || !right.isNumber()) return;
366+
res = new BasicEvaluatedExpression();
367+
res.setNumber(left.number << right.number);
368+
res.setRange(expr.range);
369+
return res;
307370
}
308371
});
309372
this.plugin("evaluate UnaryExpression", expr => {
@@ -352,6 +415,14 @@ class Parser extends Tapable {
352415
} else if(argument.isNumber()) {
353416
return new BasicEvaluatedExpression().setBoolean(!argument.number).setRange(expr.range);
354417
}
418+
} else if(expr.operator === "~") {
419+
const argument = this.evaluateExpression(expr.argument);
420+
if(!argument) return;
421+
if(!argument.isNumber()) return;
422+
const res = new BasicEvaluatedExpression();
423+
res.setNumber(~argument.number);
424+
res.setRange(expr.range);
425+
return res;
355426
}
356427
});
357428
this.plugin("evaluate typeof undefined", expr => {

schemas/WebpackOptions.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,10 @@
10061006
}
10071007
]
10081008
},
1009+
"ident": {
1010+
"description": "Unique loader identifier",
1011+
"type": "string"
1012+
},
10091013
"query": {
10101014
"description": "Loader query",
10111015
"anyOf": [

test/Parser.unittest.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,16 @@ describe("Parser", () => {
311311
"1": "number=1",
312312
"1 + 3": "number=4",
313313
"3 - 1": "number=2",
314+
"2 * 3": "number=6",
315+
"8 / 2": "number=4",
316+
"2 ** 3": "number=8",
317+
"12 & 5": "number=4",
318+
"12 | 5": "number=13",
319+
"12 ^ 5": "number=9",
320+
"9 >>> 2": "number=2",
321+
"9 >> 2": "number=2",
322+
"9 << 2": "number=36",
323+
"~3": "number=-4",
314324
"1 == 1": "bool=true",
315325
"1 === 1": "bool=true",
316326
"3 != 1": "bool=true",

test/configCases/loaders/remaining-request/webpack.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ module.exports = {
77
"./loader1",
88
{
99
loader: "./loader2",
10+
ident: "loader2",
1011
options: {
11-
ident: "loader2",
1212
f: function() {
1313
return "ok";
1414
}

0 commit comments

Comments
 (0)