From 0bf0b3e2e86cde6f2a90f1f8334aa4f41fe35132 Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Mon, 1 Nov 2021 21:34:45 -0700 Subject: [PATCH] Clean up some symbol table code --- schala-lang/language/src/symbol_table/mod.rs | 2 +- .../language/src/symbol_table/resolver.rs | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/schala-lang/language/src/symbol_table/mod.rs b/schala-lang/language/src/symbol_table/mod.rs index 6818cda..ceb210f 100644 --- a/schala-lang/language/src/symbol_table/mod.rs +++ b/schala-lang/language/src/symbol_table/mod.rs @@ -337,7 +337,7 @@ impl<'a> SymbolTableRunner<'a> { let mut errors = vec![]; for statement in statements { - let Statement { id, kind, location } = statement; //TODO I'm not sure if I need to do anything with this ID + let Statement { id, kind, location } = statement; let location = *location; if let Err(err) = self.add_single_statement(id, kind, location, scope_stack, function_scope) { errors.push(err); diff --git a/schala-lang/language/src/symbol_table/resolver.rs b/schala-lang/language/src/symbol_table/resolver.rs index 0e12c9b..7fea208 100644 --- a/schala-lang/language/src/symbol_table/resolver.rs +++ b/schala-lang/language/src/symbol_table/resolver.rs @@ -43,13 +43,18 @@ impl<'a> ScopeResolver<'a> { /// mappings. fn lookup_name_in_scope(&mut self, name: &QualifiedName) { let QualifiedName { id, components } = name; + + let local_name = components.first().unwrap().clone(); + let name_type = self.lexical_scopes.lookup(&local_name); + let fqsn = Fqsn { scopes: components.iter().map(|name| Scope::Name(name.clone())).collect() }; + let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn); + //println!("\tFound lexical_scope entry: {:?} and {} symbol: {:?}", name_type, fqsn, symbol); + //TODO handle a "partial" qualified name, and also handle it down in the pattern-matching //section //TODO some of these if lets that look into the fqsn_to_symbol table should probaby fail //with an error if components.len() == 1 { - let local_name: Rc = components[0].clone(); - let name_type = self.lexical_scopes.lookup(&local_name); match name_type { Some(NameType::Import(fqsn)) => { let symbol = self.symbol_table.fqsn_to_symbol.get(fqsn); @@ -70,18 +75,12 @@ impl<'a> ScopeResolver<'a> { self.symbol_table.id_to_symbol.insert(*id, symbol); } } - None => { - //TODO see if I can reduce this duplicate code - let fqsn = Fqsn { scopes: vec![Scope::Name(local_name.clone())] }; - let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn); + None => if let Some(symbol) = symbol { self.symbol_table.id_to_symbol.insert(*id, symbol.clone()); - } - } + }, } } else { - let fqsn = Fqsn { scopes: components.iter().map(|name| Scope::Name(name.clone())).collect() }; - let symbol = self.symbol_table.fqsn_to_symbol.get(&fqsn); if let Some(symbol) = symbol { self.symbol_table.id_to_symbol.insert(*id, symbol.clone()); }