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}