swc_bundler/debug/
mod.rs

1#![allow(dead_code)]
2
3use std::io::{stderr, Write};
4
5use swc_common::{sync::Lrc, SourceMap, SyntaxContext};
6use swc_ecma_ast::{Ident, Module};
7use swc_ecma_codegen::{text_writer::JsWriter, Emitter};
8use swc_ecma_visit::{noop_fold_type, Fold, FoldWith};
9
10#[cfg(not(debug_assertions))]
11pub(crate) fn print_hygiene(_: &str, _: &Lrc<SourceMap>, _: &Module) {}
12
13#[cfg(debug_assertions)]
14pub(crate) fn print_hygiene(event: &str, cm: &Lrc<SourceMap>, t: &Module) {
15    let module = t.clone().fold_with(&mut HygieneVisualizer);
16
17    let stdout = stderr();
18    let mut w = stdout.lock();
19
20    writeln!(w, "==================== @ {event} ====================").unwrap();
21    Emitter {
22        cfg: swc_ecma_codegen::Config::default(),
23        cm: cm.clone(),
24        comments: None,
25        wr: Box::new(JsWriter::new(cm.clone(), "\n", &mut w, None)),
26    }
27    .emit_module(&module)
28    .unwrap();
29    writeln!(w, "==================== @ ====================").unwrap();
30}
31
32struct HygieneVisualizer;
33
34impl Fold for HygieneVisualizer {
35    noop_fold_type!();
36
37    fn fold_ident(&mut self, node: Ident) -> Ident {
38        if node.ctxt == SyntaxContext::empty() {
39            return node;
40        }
41        Ident {
42            sym: format!("{}{:?}", node.sym, node.ctxt).into(),
43            ..node
44        }
45    }
46}