Skip to main content

turbopack_ecmascript/analyzer/graph/
mod.rs

1use rustc_hash::FxHashMap;
2use swc_core::{
3    atoms::Atom,
4    ecma::{ast::*, visit::VisitWithAstPath},
5};
6
7pub use crate::analyzer::graph::{
8    effects::{
9        AssignmentScope, AssignmentScopes, ConditionalKind, Effect, EffectArg, EffectsBlock,
10    },
11    eval_context::EvalContext,
12};
13use crate::{
14    AnalyzeMode,
15    analyzer::{Bump, JsValue, graph::visitor::Analyzer},
16    code_gen::CodeGen,
17};
18
19mod effects;
20mod eval_context;
21mod visitor;
22
23#[derive(Debug)]
24pub struct VarGraph<'a> {
25    pub values: FxHashMap<Id, JsValue<'a>>,
26
27    /// Map [`JsValue::FreeVar`] names to their [`Id`] to facilitate lookups into [`Self::values`].
28    ///
29    /// Doesn't necessarily contain every [`FreeVar`][JsValue::FreeVar], just those who have
30    /// non-trivial values.
31    pub free_var_ids: FxHashMap<Atom, Id>,
32
33    pub effects: Vec<Effect<'a>>,
34    // Some unconditional codegens, usually for ESM items.
35    pub code_gens: Vec<CodeGen>,
36}
37
38impl<'a> VarGraph<'a> {
39    pub fn normalize(&mut self, arena: &'a Bump) {
40        for value in self.values.values_mut() {
41            value.normalize(arena);
42        }
43        for effect in self.effects.iter_mut() {
44            effect.normalize(arena);
45        }
46    }
47}
48
49pub fn create_graph<'a>(
50    arena: &'a Bump,
51    m: &Program,
52    eval_context: &EvalContext,
53    analyze_mode: AnalyzeMode,
54    supports_block_scoping: bool,
55) -> VarGraph<'a> {
56    let mut analyzer = Analyzer {
57        arena,
58        analyze_mode,
59        data: VarGraph {
60            values: Default::default(),
61            free_var_ids: Default::default(),
62            effects: Default::default(),
63            code_gens: Default::default(),
64        },
65        eval_context,
66        state: Default::default(),
67        effects: Default::default(),
68        hoisted_effects: Default::default(),
69        code_gens: Default::default(),
70        supports_block_scoping,
71    };
72
73    m.visit_with_ast_path(&mut analyzer, &mut Default::default());
74
75    let mut graph = analyzer.data;
76    graph.normalize(arena);
77
78    graph
79}