37 lines
873 B
Rust
37 lines
873 B
Rust
use crate::semantic_analysis::symbol::SymbolId;
|
|
use std::collections::HashMap;
|
|
use std::rc::Rc;
|
|
|
|
pub type ScopeId = usize;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct Scope {
|
|
parent_id: Option<ScopeId>,
|
|
symbols: HashMap<Rc<str>, SymbolId>,
|
|
}
|
|
|
|
impl Scope {
|
|
pub fn new(parent_id: Option<ScopeId>) -> Self {
|
|
Self {
|
|
parent_id,
|
|
symbols: HashMap::new(),
|
|
}
|
|
}
|
|
|
|
pub fn parent_id(&self) -> Option<ScopeId> {
|
|
self.parent_id
|
|
}
|
|
|
|
pub fn has_symbol(&self, declared_name: &str) -> bool {
|
|
self.symbols.contains_key(declared_name)
|
|
}
|
|
|
|
pub fn insert_symbol(&mut self, declared_name: Rc<str>, symbol_id: SymbolId) {
|
|
self.symbols.insert(declared_name, symbol_id);
|
|
}
|
|
|
|
pub fn get_symbol_id(&self, declared_name: &str) -> Option<SymbolId> {
|
|
self.symbols.get(declared_name).cloned()
|
|
}
|
|
}
|