diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2025-02-08 21:18:14 +1300 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2025-02-08 21:18:14 +1300 |
commit | 0ddd9bca2a3f8444cdfdd0a8afb292479396c4f2 (patch) | |
tree | 361ab8d05b48af4d53062ec63286afe073cc9ce1 /src/resolver.rs | |
parent | 2e773f9ba994f8f4e30bb994bb600696264def16 (diff) | |
download | assembler-0ddd9bca2a3f8444cdfdd0a8afb292479396c4f2.zip |
Support namespaces when resolving symbols
A definition can resolve a reference in the same or a deeper namespace,
allowing for proper scoping and shadowing. Multiple definitions in the
same namespace cannot share a name.
Diffstat (limited to 'src/resolver.rs')
-rw-r--r-- | src/resolver.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/resolver.rs b/src/resolver.rs index 23dc73a..37d0911 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -71,15 +71,15 @@ impl Resolver { match symbol.role { SymbolRole::Definition(_) => { // Check if the symbol has already been defined. - let equal = |d: &TrackedSymbol| { &d.symbol.name == &symbol.name }; + let equal = |d: &TrackedSymbol| { &d.symbol == &symbol }; if let Some(original) = self.definitions.iter().position(equal) { let definition = TrackedSymbol { symbol, source_id, source_role }; let redefinition = (definition, original); self.redefinitions.push(redefinition); } else { // Resolve all unresolved references that match this symbol. - let equal = |s: &mut TrackedSymbol| s.symbol.name == symbol.name; - for symbol in self.unresolved.extract_if(equal) { + let defines = |r: &mut TrackedSymbol| symbol.defines(&r.symbol); + for symbol in self.unresolved.extract_if(defines) { self.resolved.push(symbol); } let definition = TrackedSymbol { symbol, source_id, source_role }; @@ -88,7 +88,7 @@ impl Resolver { } SymbolRole::Reference => { let reference = TrackedSymbol { symbol, source_id, source_role }; - match self.definitions.contains(&reference) { + match self.definitions.iter().any(|d| d.symbol.defines(&reference.symbol)) { true => self.resolved.push(reference), false => self.unresolved.push(reference), } |