Source code

Revision control

Copy as Markdown

Other Tools

//! Collect information about scopes and bindings, used by the emitter.
//!
//! Scope analysis happens in a separate pass after the AST is built:
//!
//! 1. Parse the script, check for early errors, and build an AST.
//! 2. Traverse the AST and do scope analysis (this crate).
//! 3. Traverse the AST and emit bytecode.
//!
//! The output of this analysis is a `ScopeDataMapAndFunctionMap`
//! describing each scope, binding, and function in the AST.
mod builder;
pub mod data;
pub mod free_name_tracker;
mod pass;
extern crate jsparagus_ast as ast;
extern crate jsparagus_stencil as stencil;
use ast::visit::Pass;
pub use builder::ScopeBuildError;
pub use pass::ScopePassResult;
/// Visit all nodes in the AST, and create a scope data.
///
/// `ast` must already have been checked for early errors. This analysis does
/// not check for errors, even scope-related errors like redeclaration of a
/// `let` variable.
pub fn generate_scope_data<'alloc, 'a>(
ast: &'alloc ast::types::Program<'alloc>,
) -> ScopePassResult {
let mut scope_pass = pass::ScopePass::new();
scope_pass.visit_program(ast);
scope_pass.into()
}