nac3/nac3standalone/src/basic_symbol_resolver.rs

64 lines
1.6 KiB
Rust
Raw Normal View History

2021-10-16 18:08:13 +08:00
use nac3core::{
codegen::CodeGenContext,
location::Location,
2021-11-20 19:50:25 +08:00
symbol_resolver::{SymbolResolver, 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
},
};
2021-11-03 17:11:00 +08:00
use nac3parser::ast::StrRef;
2021-11-20 19:50:25 +08:00
use parking_lot::{Mutex, RwLock};
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 class_names: Mutex<HashMap<StrRef, Type>>,
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 struct Resolver(pub Arc<ResolverInternal>);
2021-08-19 15:30:52 +08:00
impl SymbolResolver for Resolver {
2021-10-16 18:08:13 +08:00
fn get_symbol_type(
&self,
_: &mut Unifier,
_: &[Arc<RwLock<TopLevelDef>>],
_: &PrimitiveStore,
str: StrRef,
) -> Option<Type> {
2021-09-22 17:19:27 +08:00
let ret = self.0.id_to_type.lock().get(&str).cloned();
if ret.is_none() {
// println!("unknown here resolver {}", str);
}
ret
2021-08-19 15:30:52 +08:00
}
2021-10-16 18:08:13 +08:00
fn get_symbol_value<'ctx, 'a>(
&self,
_: StrRef,
_: &mut CodeGenContext<'ctx, 'a>,
2021-11-20 19:50:25 +08:00
) -> Option<ValueEnum<'ctx>> {
2021-08-19 15:30:52 +08:00
unimplemented!()
}
2021-09-22 17:19:27 +08:00
fn get_symbol_location(&self, _: StrRef) -> Option<Location> {
2021-08-19 15:30:52 +08:00
unimplemented!()
}
2021-09-22 17:19:27 +08:00
fn get_identifier_def(&self, id: StrRef) -> Option<DefinitionId> {
self.0.id_to_def.lock().get(&id).cloned()
2021-08-19 15:30:52 +08:00
}
}