use std::collections::HashMap; use statement::{ConstVar, Enum, Function, StaticVar, Struct}; use crate::{common::loc::LocBox, parser::ast::{expr::Path, statement::Let, typ::Type}}; pub use crate::tokeniser::tokentype::*; pub mod expr; pub mod literal; pub mod statement; pub mod typ; #[derive(Debug, Clone)] pub struct Scope { pub vars: HashMap>, pub static_vars: HashMap, pub const_vars: HashMap, pub inner_scope: Option> } #[derive(Debug, Clone)] pub struct Program { pub ast: expr::Block, pub structs: HashMap>, pub enums: HashMap>, pub types: HashMap>, pub functions: HashMap>, pub member_functions: HashMap>>, pub static_vars: HashMap, pub const_vars: HashMap, pub scope: Option } impl Scope { pub fn get_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(inner) = &self.inner_scope { if let Some((ident, var)) = inner.get_var(name) { return Some((ident, var)); } } if let Some(var) = self.vars.get(name) { return Some((name.clone(), var.clone())); } None } pub fn get_static_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(inner) = &self.inner_scope { if let Some((ident, var)) = inner.get_static_var(name) { return Some((ident, var)); } } if let Some(var) = self.static_vars.get(name) { return Some((name.clone(), LocBox::new(var.typ.loc(), var.clone()))); } None } pub fn get_const_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(inner) = &self.inner_scope { if let Some((ident, var)) = inner.get_const_var(name) { return Some((ident, var)); } } if let Some(var) = self.const_vars.get(name) { return Some((name.clone(), LocBox::new(var.typ.loc(), var.clone()))); } None } } impl Program { pub fn get_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(scope) = &self.scope { scope.get_var(name) } else { None } } pub fn get_static_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(scope) = &self.scope { if let Some((name, var)) = scope.get_static_var(name) { return Some((name, var)); } } if let Some(var) = self.static_vars.get(name) { return Some((name.clone(), LocBox::new(var.typ.loc(), var.clone()))); } None } pub fn get_const_var(&self, name: &Ident) -> Option<(Ident, LocBox)> { if let Some(scope) = &self.scope { if let Some((name, var)) = scope.get_const_var(name) { return Some((name, var)); } } if let Some(var) = self.const_vars.get(name) { return Some((name.clone(), LocBox::new(var.typ.loc(), var.clone()))); } None } } #[derive(Debug, Clone, PartialEq, PartialOrd)] pub enum Ast { Expr(LocBox), Statement(LocBox), }