nac3/nac3standalone/src/basic_symbol_resolver.rs

89 lines
2.6 KiB
Rust
Raw Permalink Normal View History

2021-10-16 18:08:13 +08:00
use nac3core::{
codegen::CodeGenContext,
symbol_resolver::{SymbolResolver, SymbolValue, ValueEnum},
2021-10-16 18:08:13 +08:00
toplevel::{DefinitionId, TopLevelDef},
typecheck::{
2021-08-19 15:30:52 +08:00
type_inferencer::PrimitiveStore,
typedef::{Type, Unifier},
2021-10-16 18:08:13 +08:00
},
};
use nac3parser::ast::{self, StrRef};
2021-11-20 19:50:25 +08:00
use parking_lot::{Mutex, RwLock};
use std::collections::HashSet;
2024-06-12 14:45:03 +08:00
use std::{collections::HashMap, sync::Arc};
2021-08-19 15:30:52 +08:00
pub struct ResolverInternal {
2021-09-22 17:19:27 +08:00
pub id_to_type: Mutex<HashMap<StrRef, Type>>,
pub id_to_def: Mutex<HashMap<StrRef, DefinitionId>>,
pub module_globals: Mutex<HashMap<StrRef, SymbolValue>>,
2022-02-13 17:21:42 +08:00
pub str_store: Mutex<HashMap<String, i32>>,
2021-08-19 15:30:52 +08:00
}
impl ResolverInternal {
2021-09-22 17:19:27 +08:00
pub fn add_id_def(&self, id: StrRef, def: DefinitionId) {
self.id_to_def.lock().insert(id, def);
}
2021-09-22 17:19:27 +08:00
pub fn add_id_type(&self, id: StrRef, ty: Type) {
self.id_to_type.lock().insert(id, ty);
}
pub fn add_module_global(&self, id: StrRef, val: SymbolValue) {
self.module_globals.lock().insert(id, val);
}
}
pub struct Resolver(pub Arc<ResolverInternal>);
2021-08-19 15:30:52 +08:00
impl SymbolResolver for Resolver {
fn get_default_param_value(&self, expr: &ast::Expr) -> Option<SymbolValue> {
match &expr.node {
2022-02-21 18:27:46 +08:00
ast::ExprKind::Name { id, .. } => self.0.module_globals.lock().get(id).cloned(),
_ => unimplemented!("other type of expr not supported at {}", expr.location),
}
}
2021-10-16 18:08:13 +08:00
fn get_symbol_type(
&self,
_: &mut Unifier,
_: &[Arc<RwLock<TopLevelDef>>],
_: &PrimitiveStore,
str: StrRef,
) -> Result<Type, String> {
self.0.id_to_type.lock().get(&str).copied().ok_or(format!("cannot get type of {str}"))
2021-08-19 15:30:52 +08:00
}
2023-12-06 11:49:02 +08:00
fn get_symbol_value<'ctx>(
2021-10-16 18:08:13 +08:00
&self,
_: StrRef,
2023-12-06 11:49:02 +08:00
_: &mut CodeGenContext<'ctx, '_>,
2021-11-20 19:50:25 +08:00
) -> Option<ValueEnum<'ctx>> {
2021-08-19 15:30:52 +08:00
unimplemented!()
}
fn get_identifier_def(&self, id: StrRef) -> Result<DefinitionId, HashSet<String>> {
2024-06-12 14:45:03 +08:00
self.0
.id_to_def
.lock()
.get(&id)
.copied()
.ok_or_else(|| HashSet::from([format!("Undefined identifier `{id}`")]))
2021-08-19 15:30:52 +08:00
}
2022-02-12 21:21:56 +08:00
2022-02-13 17:21:42 +08:00
fn get_string_id(&self, s: &str) -> i32 {
let mut str_store = self.0.str_store.lock();
if let Some(id) = str_store.get(s) {
*id
} else {
2024-03-11 14:25:37 +08:00
let id = i32::try_from(str_store.len())
.expect("Symbol resolver string store size exceeds max capacity (i32::MAX)");
2022-02-13 17:21:42 +08:00
str_store.insert(s.to_string(), id);
id
}
2022-02-12 21:21:56 +08:00
}
2022-03-05 00:27:51 +08:00
2022-03-17 21:23:38 +08:00
fn get_exception_id(&self, _: usize) -> usize {
2022-03-05 00:27:51 +08:00
unimplemented!()
}
2021-08-19 15:30:52 +08:00
}