From b0e201fccbee985389bab5cb5b2d2064c4241146 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 19 Apr 2025 12:15:15 +0300 Subject: [PATCH] private! --- src/twopass.rs | 88 +++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/twopass.rs b/src/twopass.rs index 621fb6e..074b919 100644 --- a/src/twopass.rs +++ b/src/twopass.rs @@ -1,4 +1,4 @@ -use std::{cell::RefCell, collections::HashMap}; +use std::cell::RefCell; use crate::ast; @@ -53,49 +53,57 @@ struct Call { args: Vec, } -#[derive(Debug, Clone, Default)] -struct Scope { - locals: Vec, - upvalues: Vec<(ast::Ident, Ident)>, - scope: HashMap, -} +mod scope { + use std::collections::HashMap; -impl Scope { - fn new_toplevel() -> Self { - Self { - locals: vec!["_ENV".to_string()], - upvalues: vec![], - scope: [("_ENV".to_string(), Ident::Local(0))] - .into_iter() - .collect(), + use super::Ident; + use crate::ast; + + #[derive(Debug, Clone, Default)] + pub struct Scope { + locals: Vec, + upvalues: Vec<(ast::Ident, Ident)>, + scope: HashMap, + } + + impl Scope { + pub fn new_toplevel() -> Self { + Self { + locals: vec!["_ENV".to_string()], + upvalues: vec![], + scope: [("_ENV".to_string(), Ident::Local(0))] + .into_iter() + .collect(), + } + } + + pub fn lookup(&self, name: &ast::Ident) -> Option { + self.scope.get(name).copied() + } + + fn add(&mut self, name: &ast::Ident, ident: Ident) -> Ident { + self.scope.insert(name.clone(), ident); + ident + } + + pub fn add_arg(&mut self, name: &ast::Ident, index: usize) { + self.scope.insert(name.clone(), Ident::Argument(index)); + } + + pub fn add_local(&mut self, name: &ast::Ident) -> Ident { + let index = self.locals.len(); + self.locals.push(name.clone()); + self.add(name, Ident::Local(index)) + } + + pub fn add_upvalue(&mut self, name: &ast::Ident, up_ident: Ident) -> Ident { + let index = self.upvalues.len(); + self.upvalues.push((name.clone(), up_ident)); + self.add(name, Ident::Upvalue(index)) } } - - fn lookup(&self, name: &ast::Ident) -> Option { - self.scope.get(name).copied() - } - - fn add(&mut self, name: &ast::Ident, ident: Ident) -> Ident { - self.scope.insert(name.clone(), ident); - ident - } - - fn add_arg(&mut self, name: &ast::Ident, index: usize) { - self.scope.insert(name.clone(), Ident::Argument(index)); - } - - fn add_local(&mut self, name: &ast::Ident) -> Ident { - let index = self.locals.len(); - self.locals.push(name.clone()); - self.add(name, Ident::Local(index)) - } - - fn add_upvalue(&mut self, name: &ast::Ident, up_ident: Ident) -> Ident { - let index = self.upvalues.len(); - self.upvalues.push((name.clone(), up_ident)); - self.add(name, Ident::Upvalue(index)) - } } +use scope::Scope; #[derive(Debug)] struct BuildContext<'a> {