@@ -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