Skip to content

Commit bc2d50e

Browse files
committed
refactor(ecmascript): pass IsGlobalReference to MayHaveSideEffects instead of extending it
1 parent 7dc8b02 commit bc2d50e

12 files changed

+140
-134
lines changed

crates/oxc_ecmascript/src/constant_evaluation/mod.rs

+15-18
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub use is_literal_value::IsLiteralValue;
1616
pub use value::ConstantValue;
1717
pub use value_type::{DetermineValueType, ValueType};
1818

19-
pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
19+
pub trait ConstantEvaluation<'a>: DetermineValueType {
2020
fn ast(&self) -> AstBuilder<'a>;
2121

2222
fn resolve_binding(&self, ident: &IdentifierReference<'a>) -> Option<ConstantValue<'a>> {
@@ -36,7 +36,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
3636
// and there are only a very few cases where we can compute a number value, but there could
3737
// also be side effects. e.g. `void doSomething()` has value NaN, regardless of the behavior
3838
// 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) {
4040
None
4141
} else {
4242
value
@@ -45,23 +45,23 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
4545

4646
fn get_side_free_string_value(&self, expr: &Expression<'a>) -> Option<Cow<'a, str>> {
4747
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) {
4949
return value;
5050
}
5151
None
5252
}
5353

5454
fn get_side_free_boolean_value(&self, expr: &Expression<'a>) -> Option<bool> {
5555
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) {
5757
return value;
5858
}
5959
None
6060
}
6161

6262
fn get_side_free_bigint_value(&self, expr: &Expression<'a>) -> Option<BigInt> {
6363
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) {
6565
None
6666
} else {
6767
value
@@ -241,9 +241,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
241241
) -> Option<ConstantValue<'a>> {
242242
match operator {
243243
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) {
247245
return None;
248246
}
249247
let left_type = self.expression_value_type(left);
@@ -361,7 +359,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
361359
None
362360
}
363361
BinaryOperator::Instanceof => {
364-
if self.expression_may_have_side_effects(left) {
362+
if left.may_have_side_effects(self) {
365363
return None;
366364
}
367365
if let Expression::Identifier(right_ident) = right {
@@ -384,9 +382,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
384382
| BinaryOperator::StrictInequality
385383
| BinaryOperator::Equality
386384
| 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) {
390386
return None;
391387
}
392388
let value = match operator {
@@ -424,7 +420,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
424420
fn eval_unary_expression(&self, expr: &UnaryExpression<'a>) -> Option<ConstantValue<'a>> {
425421
match expr.operator {
426422
UnaryOperator::Typeof => {
427-
if self.expression_may_have_side_effects(&expr.argument) {
423+
if expr.argument.may_have_side_effects(self) {
428424
return None;
429425
}
430426
let arg_ty = self.expression_value_type(&expr.argument);
@@ -447,8 +443,9 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
447443
};
448444
Some(ConstantValue::String(Cow::Borrowed(s)))
449445
}
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+
}
452449
UnaryOperator::LogicalNot => self
453450
.get_side_free_boolean_value(&expr.argument)
454451
.map(|b| !b)
@@ -493,7 +490,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
493490
if let Some(ConstantValue::String(s)) = self.eval_expression(&expr.object) {
494491
Some(ConstantValue::Number(s.encode_utf16().count().to_f64().unwrap()))
495492
} else {
496-
if self.expression_may_have_side_effects(&expr.object) {
493+
if expr.object.may_have_side_effects(self) {
497494
return None;
498495
}
499496
if let Expression::ArrayExpression(arr) = &expr.object {
@@ -516,7 +513,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
516513
if let Some(ConstantValue::String(s)) = self.eval_expression(&expr.object) {
517514
Some(ConstantValue::Number(s.encode_utf16().count().to_f64().unwrap()))
518515
} else {
519-
if self.expression_may_have_side_effects(&expr.object) {
516+
if expr.object.may_have_side_effects(self) {
520517
return None;
521518
}
522519
if let Expression::ArrayExpression(arr) = &expr.object {
@@ -532,7 +529,7 @@ pub trait ConstantEvaluation<'a>: MayHaveSideEffects + DetermineValueType {
532529

533530
/// <https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan>
534531
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) {
536533
return None;
537534
}
538535

crates/oxc_ecmascript/src/constant_evaluation/value_type.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl ValueType {
6060
///
6161
/// Evaluate the expression and attempt to determine which ValueType it could resolve to.
6262
/// This function ignores the cases that throws an error, e.g. `foo * 0` can throw an error when `foo` is a bigint.
63-
/// To detect those cases, use [`crate::side_effects::MayHaveSideEffects::expression_may_have_side_effects`].
63+
/// To detect those cases, use [`crate::side_effects::MayHaveSideEffects`].
6464
pub trait DetermineValueType: IsGlobalReference {
6565
fn expression_value_type(&self, expr: &Expression<'_>) -> ValueType {
6666
match expr {

crates/oxc_ecmascript/src/is_global_reference.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use oxc_ast::ast::IdentifierReference;
22

3-
pub trait IsGlobalReference {
3+
pub trait IsGlobalReference: Sized {
44
/// Whether the reference is a global reference.
55
///
66
/// - None means it is unknown.

0 commit comments

Comments
 (0)