diff --git a/crates/oxc_ecmascript/src/constant_evaluation/mod.rs b/crates/oxc_ecmascript/src/constant_evaluation/mod.rs index 92cb7de23ed86..a368262908466 100644 --- a/crates/oxc_ecmascript/src/constant_evaluation/mod.rs +++ b/crates/oxc_ecmascript/src/constant_evaluation/mod.rs @@ -318,6 +318,19 @@ pub trait ConstantEvaluation<'a> { }) } BinaryOperator::BitwiseAnd | BinaryOperator::BitwiseOR | BinaryOperator::BitwiseXOR => { + if left.is_big_int_literal() && right.is_big_int_literal() { + let left_bigint = self.get_side_free_bigint_value(left); + let right_bigint = self.get_side_free_bigint_value(right); + if let (Some(left_val), Some(right_val)) = (left_bigint, right_bigint) { + let result_val: BigInt = match operator { + BinaryOperator::BitwiseAnd => left_val & right_val, + BinaryOperator::BitwiseOR => left_val | right_val, + BinaryOperator::BitwiseXOR => left_val ^ right_val, + _ => unreachable!(), + }; + return Some(ConstantValue::BigInt(result_val)); + } + } let left_num = self.get_side_free_number_value(left); let right_num = self.get_side_free_number_value(right); if let (Some(left_val), Some(right_val)) = (left_num, right_num) { @@ -332,17 +345,6 @@ pub trait ConstantEvaluation<'a> { }; return Some(ConstantValue::Number(result_val)); } - let left_bitint = self.get_side_free_bigint_value(left); - let right_bitint = self.get_side_free_bigint_value(right); - if let (Some(left_val), Some(right_val)) = (left_bitint, right_bitint) { - let result_val: BigInt = match operator { - BinaryOperator::BitwiseAnd => left_val & right_val, - BinaryOperator::BitwiseOR => left_val | right_val, - BinaryOperator::BitwiseXOR => left_val ^ right_val, - _ => unreachable!(), - }; - return Some(ConstantValue::BigInt(result_val)); - } None } _ => None, diff --git a/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs b/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs index 4adce50a44db2..9918be606dc18 100644 --- a/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs +++ b/crates/oxc_minifier/src/ast_passes/peephole_fold_constants.rs @@ -1264,6 +1264,11 @@ mod test { test("x = 3n ^ y ^ 1n", "x = y ^ 2n"); test("x = y ^ 3n ^ 3n", "x = y ^ 0n"); test("x = 3n ^ y ^ 3n", "x = y ^ 0n"); + + // TypeError: Cannot mix BigInt and other types + test_same("1n & 1"); + test_same("1n | 1"); + test_same("1n ^ 1"); } #[test]