@@ -16,7 +16,7 @@ pub use is_literal_value::IsLiteralValue;
16
16
pub use value:: ConstantValue ;
17
17
pub use value_type:: { DetermineValueType , ValueType } ;
18
18
19
- pub trait ConstantEvaluation < ' a > : MayHaveSideEffects + DetermineValueType {
19
+ pub trait ConstantEvaluation < ' a > : DetermineValueType {
20
20
fn ast ( & self ) -> AstBuilder < ' a > ;
21
21
22
22
fn resolve_binding ( & self , ident : & IdentifierReference < ' a > ) -> Option < ConstantValue < ' a > > {
@@ -36,7 +36,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
36
36
// and there are only a very few cases where we can compute a number value, but there could
37
37
// also be side effects. e.g. `void doSomething()` has value NaN, regardless of the behavior
38
38
// of `doSomething()`
39
- if value. is_some ( ) && self . expression_may_have_side_effects ( expr ) {
39
+ if value. is_some ( ) && expr . may_have_side_effects ( self ) {
40
40
None
41
41
} else {
42
42
value
@@ -45,23 +45,23 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
45
45
46
46
fn get_side_free_string_value ( & self , expr : & Expression < ' a > ) -> Option < Cow < ' a , str > > {
47
47
let value = expr. to_js_string ( ) ;
48
- if value. is_some ( ) && !self . expression_may_have_side_effects ( expr ) {
48
+ if value. is_some ( ) && !expr . may_have_side_effects ( self ) {
49
49
return value;
50
50
}
51
51
None
52
52
}
53
53
54
54
fn get_side_free_boolean_value ( & self , expr : & Expression < ' a > ) -> Option < bool > {
55
55
let value = self . get_boolean_value ( expr) ;
56
- if value. is_some ( ) && !self . expression_may_have_side_effects ( expr ) {
56
+ if value. is_some ( ) && !expr . may_have_side_effects ( self ) {
57
57
return value;
58
58
}
59
59
None
60
60
}
61
61
62
62
fn get_side_free_bigint_value ( & self , expr : & Expression < ' a > ) -> Option < BigInt > {
63
63
let value = expr. to_big_int ( ) ;
64
- if value. is_some ( ) && self . expression_may_have_side_effects ( expr ) {
64
+ if value. is_some ( ) && expr . may_have_side_effects ( self ) {
65
65
None
66
66
} else {
67
67
value
@@ -241,9 +241,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
241
241
) -> Option < ConstantValue < ' a > > {
242
242
match operator {
243
243
BinaryOperator :: Addition => {
244
- if self . expression_may_have_side_effects ( left)
245
- || self . expression_may_have_side_effects ( right)
246
- {
244
+ if left. may_have_side_effects ( self ) || right. may_have_side_effects ( self ) {
247
245
return None ;
248
246
}
249
247
let left_type = self . expression_value_type ( left) ;
@@ -361,7 +359,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
361
359
None
362
360
}
363
361
BinaryOperator :: Instanceof => {
364
- if self . expression_may_have_side_effects ( left ) {
362
+ if left . may_have_side_effects ( self ) {
365
363
return None ;
366
364
}
367
365
if let Expression :: Identifier ( right_ident) = right {
@@ -384,9 +382,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
384
382
| BinaryOperator :: StrictInequality
385
383
| BinaryOperator :: Equality
386
384
| BinaryOperator :: Inequality => {
387
- if self . expression_may_have_side_effects ( left)
388
- || self . expression_may_have_side_effects ( right)
389
- {
385
+ if left. may_have_side_effects ( self ) || right. may_have_side_effects ( self ) {
390
386
return None ;
391
387
}
392
388
let value = match operator {
@@ -424,7 +420,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
424
420
fn eval_unary_expression ( & self , expr : & UnaryExpression < ' a > ) -> Option < ConstantValue < ' a > > {
425
421
match expr. operator {
426
422
UnaryOperator :: Typeof => {
427
- if self . expression_may_have_side_effects ( & expr. argument ) {
423
+ if expr. argument . may_have_side_effects ( self ) {
428
424
return None ;
429
425
}
430
426
let arg_ty = self . expression_value_type ( & expr. argument ) ;
@@ -447,8 +443,9 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
447
443
} ;
448
444
Some ( ConstantValue :: String ( Cow :: Borrowed ( s) ) )
449
445
}
450
- UnaryOperator :: Void => ( !self . expression_may_have_side_effects ( & expr. argument ) )
451
- . then_some ( ConstantValue :: Undefined ) ,
446
+ UnaryOperator :: Void => {
447
+ ( !expr. argument . may_have_side_effects ( self ) ) . then_some ( ConstantValue :: Undefined )
448
+ }
452
449
UnaryOperator :: LogicalNot => self
453
450
. get_side_free_boolean_value ( & expr. argument )
454
451
. map ( |b| !b)
@@ -493,7 +490,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
493
490
if let Some ( ConstantValue :: String ( s) ) = self . eval_expression ( & expr. object ) {
494
491
Some ( ConstantValue :: Number ( s. encode_utf16 ( ) . count ( ) . to_f64 ( ) . unwrap ( ) ) )
495
492
} else {
496
- if self . expression_may_have_side_effects ( & expr. object ) {
493
+ if expr. object . may_have_side_effects ( self ) {
497
494
return None ;
498
495
}
499
496
if let Expression :: ArrayExpression ( arr) = & expr. object {
@@ -516,7 +513,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
516
513
if let Some ( ConstantValue :: String ( s) ) = self . eval_expression ( & expr. object ) {
517
514
Some ( ConstantValue :: Number ( s. encode_utf16 ( ) . count ( ) . to_f64 ( ) . unwrap ( ) ) )
518
515
} else {
519
- if self . expression_may_have_side_effects ( & expr. object ) {
516
+ if expr. object . may_have_side_effects ( self ) {
520
517
return None ;
521
518
}
522
519
if let Expression :: ArrayExpression ( arr) = & expr. object {
@@ -532,7 +529,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
532
529
533
530
/// <https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan>
534
531
fn is_less_than ( & self , x : & Expression < ' a > , y : & Expression < ' a > ) -> Option < ConstantValue < ' a > > {
535
- if self . expression_may_have_side_effects ( x ) || self . expression_may_have_side_effects ( y ) {
532
+ if x . may_have_side_effects ( self ) || y . may_have_side_effects ( self ) {
536
533
return None ;
537
534
}
538
535
0 commit comments