swc_ecma_minifier/compress/pure/
drop_console.rs

1use swc_common::DUMMY_SP;
2use swc_ecma_ast::*;
3
4use super::Pure;
5
6impl Pure<'_> {
7    pub(super) fn drop_console(&mut self, e: &mut Expr) -> bool {
8        if !self.options.drop_console {
9            return false;
10        }
11
12        let Some(callee) = (match e {
13            Expr::Call(call) => call.callee.as_expr(),
14            Expr::OptChain(opt_chain) => opt_chain.base.as_call().map(|call| &call.callee),
15            _ => None,
16        }) else {
17            return false;
18        };
19
20        let Some(mut loop_co) = (match callee.as_ref() {
21            Expr::Member(member) => Some(&member.obj),
22            Expr::OptChain(opt_chain) => opt_chain.base.as_member().map(|member| &member.obj),
23            _ => None,
24        }) else {
25            return false;
26        };
27
28        loop {
29            match loop_co.as_ref() {
30                Expr::Ident(obj) => {
31                    if obj.sym != *"console" {
32                        return false;
33                    }
34                    break;
35                }
36                Expr::Member(MemberExpr {
37                    obj: loop_co_obj,
38                    prop: MemberProp::Ident(_),
39                    ..
40                }) => {
41                    loop_co = loop_co_obj;
42                }
43                Expr::OptChain(opt_chain) => match opt_chain.base.as_member() {
44                    Some(member) => loop_co = &member.obj,
45                    None => return false,
46                },
47                _ => return false,
48            }
49        }
50
51        report_change!("drop_console: Removing console call");
52        self.changed = true;
53        *e = *Expr::undefined(DUMMY_SP);
54        true
55    }
56}