1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use parse_js::ast::Node;
use parse_js::visit::VisitorMut;
use symbol::Scope;
use symbol::ScopeType;
use symbol::SymbolGenerator;
use visitor::DeclVisitor;

pub mod symbol;
pub mod visitor;

#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum TopLevelMode {
  Global,
  Module,
}

pub fn compute_symbols(top_level_node: &mut Node, top_level_mode: TopLevelMode) -> Scope {
  let top_level_scope = Scope::new(SymbolGenerator::new(), None, match top_level_mode {
    TopLevelMode::Global => ScopeType::Global,
    TopLevelMode::Module => ScopeType::Module,
  });
  let mut visitor = DeclVisitor::new(top_level_scope.clone());
  visitor.visit(top_level_node);
  top_level_scope
}