turbopack_ecmascript/analyzer/graph/
mod.rs1use 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 pub free_var_ids: FxHashMap<Atom, Id>,
32
33 pub effects: Vec<Effect<'a>>,
34 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}