diff --git a/src/twopass.rs b/src/twopass.rs index c30989a..24fa922 100644 --- a/src/twopass.rs +++ b/src/twopass.rs @@ -66,6 +66,12 @@ mod scope { scope: HashMap, } + #[derive(Debug, Clone, Default)] + pub struct ScopeInfo { + pub locals: Vec, + pub upvalues: Vec<(ast::Ident, Ident)>, + } + impl Scope { pub fn new_toplevel() -> Self { Self { @@ -77,6 +83,13 @@ mod scope { } } + pub fn finish(self) -> ScopeInfo { + ScopeInfo { + locals: self.locals, + upvalues: self.upvalues, + } + } + pub fn lookup(&self, name: &ast::Ident) -> Option { self.scope.get(name).copied() } @@ -210,11 +223,12 @@ fn build_function(parent: &BuildContext<'_>, code: &ast::Function) -> Function { } } } + let scope = scope.scope.into_inner().finish(); Function { name: code.name.clone(), args: code.args.clone(), - locals: vec![], - upvalues: vec![], + locals: scope.locals, + upvalues: scope.upvalues, body, ret: Box::new(Expression::Constant(ast::Constant::Nil)), }