diff --git a/semantic/src/hir.rs b/semantic/src/hir.rs index aa242cf..3e678e8 100644 --- a/semantic/src/hir.rs +++ b/semantic/src/hir.rs @@ -97,33 +97,37 @@ impl TopLevelHirScope { tlss: &TopLevelSymbolScope, symbol: &StructSymbol, ) -> Arc { - let name = self.get_name(symbol.export); + if let Some(rf) = self.variables.get(&symbol.name) { + rf.var_type.clone() + } else { + let name = self.get_name(symbol.export); - let rf = Arc::new(TypeRef::Struct(StructRef { - export: symbol.export, - name: name.clone(), - fields: symbol - .fields - .iter() - .map(|(name, v)| (name.clone(), self.var_ref(tlss, v))) - .collect(), - })); - - self.variables.insert( - symbol.name.clone(), - Arc::new(VarRef { + let rf = Arc::new(TypeRef::Struct(StructRef { + export: symbol.export, name: name.clone(), - var_type: rf.clone(), - }), - ); + fields: symbol + .fields + .iter() + .map(|(name, v)| (name.clone(), self.var_ref(tlss, v))) + .collect(), + })); - rf + self.variables.insert( + symbol.name.clone(), + Arc::new(VarRef { + name: name.clone(), + var_type: rf.clone(), + }), + ); + + rf + } } pub fn var_ref(&mut self, tlss: &TopLevelSymbolScope, symbol: &VarSymbol) -> Arc { Arc::new(VarRef { var_type: self.type_ref(tlss, &symbol.var_type), - name: symbol.name.clone(), + name: self.get_name(true), }) } @@ -132,15 +136,7 @@ impl TopLevelHirScope { var_ref.var_type.clone() } else { if let Some(tlss_rf) = tlss.structs.get(&symbol.0) { - let struct_ref = self.struct_ref(tlss, tlss_rf); - - let var_ref = Arc::new(VarRef { - name: symbol.0.clone(), - var_type: struct_ref, - }); - self.variables.insert(symbol.0.clone(), var_ref.clone()); - - var_ref.var_type.clone() + self.struct_ref(tlss, tlss_rf) } else { match symbol.0.as_str() { "int" => { diff --git a/semantic/src/lib.rs b/semantic/src/lib.rs index 3405a2e..0d300f7 100644 --- a/semantic/src/lib.rs +++ b/semantic/src/lib.rs @@ -11,7 +11,11 @@ pub fn walk_ast(top_scope: Arc, tl: &mut Vec) { match tl { parser::ast::TopLevel::Import(_) => unimplemented!(), - parser::ast::TopLevel::FunctionDecl { params, body, .. } => { + parser::ast::TopLevel::FunctionDecl { + params, body, name, .. + } => { + *name = top_scope.get_reference(name).unwrap().name.clone(); + let scope = LocalScope::new(top_scope.clone()); scope.with_params(params); @@ -19,7 +23,9 @@ pub fn walk_ast(top_scope: Arc, tl: &mut Vec) { scope.with_block(body); } - parser::ast::TopLevel::StructDecl { .. } => {} + parser::ast::TopLevel::StructDecl { name, .. } => { + *name = top_scope.get_reference(name).unwrap().name.clone(); + } } } } diff --git a/test/src/main.ms b/test/src/main.ms index cf9b82a..fe84848 100644 --- a/test/src/main.ms +++ b/test/src/main.ms @@ -1,8 +1,8 @@ -struct MyType { +export struct MyType { x: int, } -function test(): MyType { } +export function test(): MyType { } function add() { let output = test().x;