From e5b358ae8c058d6c9704125f59144cddc8dea993 Mon Sep 17 00:00:00 2001 From: abdul124 Date: Tue, 31 Dec 2024 11:44:38 +0800 Subject: [PATCH] core: add module type --- nac3artiq/src/lib.rs | 3 +++ nac3core/src/codegen/expr.rs | 2 +- nac3core/src/toplevel/composer.rs | 1 + nac3core/src/toplevel/helper.rs | 7 +++++++ nac3core/src/toplevel/mod.rs | 14 ++++++++++++++ nac3core/src/typecheck/type_inferencer/mod.rs | 1 + 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/nac3artiq/src/lib.rs b/nac3artiq/src/lib.rs index 1601d4a4..f7f924e7 100644 --- a/nac3artiq/src/lib.rs +++ b/nac3artiq/src/lib.rs @@ -665,6 +665,9 @@ impl Nac3 { "Unsupported @rpc annotation on global variable", ))) } + TopLevelDef::Module { .. } => { + unreachable!("Type module cannot be decorated with @rpc") + } } } } diff --git a/nac3core/src/codegen/expr.rs b/nac3core/src/codegen/expr.rs index e74e7ad8..731d0fdb 100644 --- a/nac3core/src/codegen/expr.rs +++ b/nac3core/src/codegen/expr.rs @@ -979,7 +979,7 @@ pub fn gen_call<'ctx, G: CodeGenerator>( TopLevelDef::Class { .. } => { return Ok(Some(generator.gen_constructor(ctx, fun.0, &def, params)?)) } - TopLevelDef::Variable { .. } => unreachable!(), + TopLevelDef::Variable { .. } | TopLevelDef::Module { .. } => unreachable!(), } } .or_else(|_: String| { diff --git a/nac3core/src/toplevel/composer.rs b/nac3core/src/toplevel/composer.rs index bd9a9214..343a75a0 100644 --- a/nac3core/src/toplevel/composer.rs +++ b/nac3core/src/toplevel/composer.rs @@ -102,6 +102,7 @@ impl TopLevelComposer { .iter() .map(|def_ast| match *def_ast.0.read() { TopLevelDef::Class { name, .. } => name.to_string(), + TopLevelDef::Module { alias, .. } => alias.to_string(), TopLevelDef::Function { simple_name, .. } | TopLevelDef::Variable { simple_name, .. } => simple_name.to_string(), }) diff --git a/nac3core/src/toplevel/helper.rs b/nac3core/src/toplevel/helper.rs index fa6bcb92..e26e4de4 100644 --- a/nac3core/src/toplevel/helper.rs +++ b/nac3core/src/toplevel/helper.rs @@ -375,6 +375,13 @@ pub fn make_exception_fields(int32: Type, int64: Type, str: Type) -> Vec<(StrRef impl TopLevelDef { pub fn to_string(&self, unifier: &mut Unifier) -> String { match self { + TopLevelDef::Module { name, alias, methods, .. } => { + let method_str = methods.iter().map(|(n, _)| n.to_string()).collect_vec(); + format!( + "Module {{\nname: {:?},\nalias{:?},\nattributes{:?}\n}}", + name, alias, method_str + ) + } TopLevelDef::Class { name, ancestors, fields, methods, attributes, type_vars, .. } => { diff --git a/nac3core/src/toplevel/mod.rs b/nac3core/src/toplevel/mod.rs index cba2f5e7..dcdc1550 100644 --- a/nac3core/src/toplevel/mod.rs +++ b/nac3core/src/toplevel/mod.rs @@ -92,6 +92,20 @@ pub struct FunInstance { #[derive(Debug, Clone)] pub enum TopLevelDef { + Module { + /// Name of the module + name: StrRef, + /// Alias used by the module + alias: StrRef, + /// Module ID used for [`TypeEnum`] + module_id: DefinitionId, + /// Methods + methods: HashMap, + /// Symbol resolver of the module defined the class. + resolver: Option>, + /// Definition location. + loc: Option, + }, Class { /// Name for error messages and symbols. name: StrRef, diff --git a/nac3core/src/typecheck/type_inferencer/mod.rs b/nac3core/src/typecheck/type_inferencer/mod.rs index 742fa197..5f688a0e 100644 --- a/nac3core/src/typecheck/type_inferencer/mod.rs +++ b/nac3core/src/typecheck/type_inferencer/mod.rs @@ -2735,6 +2735,7 @@ impl Inferencer<'_> { .iter() .map(|def| match *def.read() { TopLevelDef::Class { name, .. } => (name, false), + TopLevelDef::Module { alias, .. } => (alias, false), TopLevelDef::Function { simple_name, .. } => (simple_name, false), TopLevelDef::Variable { simple_name, .. } => (simple_name, true), })