Skip to content

Commit 96a1a4f

Browse files
committed
feat(minifier): remove optional chaining calls when the function is undefined or null (#12956)
Compress `undefined?.()` / `null?.()` into `undefined`.
1 parent 47a565f commit 96a1a4f

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

crates/oxc_minifier/src/peephole/fold_constants.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,23 @@ impl<'a> PeepholeOptimizations {
103103
chain_expr: &ChainExpression<'a>,
104104
ctx: &mut Ctx<'a, '_>,
105105
) -> Option<Expression<'a>> {
106-
let member_expr = chain_expr.expression.as_member_expression()?;
107-
if !member_expr.optional() {
108-
return None;
109-
}
110-
let object = member_expr.object();
111-
let ty = object.value_type(ctx);
106+
let left_expr = match &chain_expr.expression {
107+
match_member_expression!(ChainElement) => {
108+
let member_expr = chain_expr.expression.to_member_expression();
109+
if !member_expr.optional() {
110+
return None;
111+
}
112+
member_expr.object()
113+
}
114+
ChainElement::CallExpression(call_expr) => {
115+
if !call_expr.optional {
116+
return None;
117+
}
118+
&call_expr.callee
119+
}
120+
ChainElement::TSNonNullExpression(_) => return None,
121+
};
122+
let ty = left_expr.value_type(ctx);
112123
(ty.is_null() || ty.is_undefined())
113124
.then(|| ctx.value_to_expr(chain_expr.span, ConstantValue::Undefined))
114125
}
@@ -1478,6 +1489,8 @@ mod test {
14781489
fold("x = null?.y", "x = void 0");
14791490
fold("x = undefined?.[foo]", "x = void 0");
14801491
fold("x = null?.[foo]", "x = void 0");
1492+
fold("x = undefined?.()", "x = void 0");
1493+
fold("x = null?.()", "x = void 0");
14811494
}
14821495

14831496
#[test]

0 commit comments

Comments
 (0)