@@ -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 => {
0 commit comments