From 1cc0269f75b8b2dd979c01ef4a500a09a0cc4354 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Tue, 1 Apr 2025 17:10:51 +1300 Subject: Fix resolver error To check if a particular definition was defining a particular symbol, the names of the definition and reference were being compared, when the namespace-aware Symbol::defines method should have been used instead. This was causing an issue where a namespaced definition would be marked as resolving a with the same name in a different namespace. This was resulting in a very complicated and incorrect cyclic dependency error. --- src/processors/resolver.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/processors/resolver.rs b/src/processors/resolver.rs index 969b817..b4bcc80 100644 --- a/src/processors/resolver.rs +++ b/src/processors/resolver.rs @@ -187,7 +187,7 @@ impl Resolver { for symbol in symbols { if let SymbolRole::Definition(_) = symbol.role { for unresolved in &self.unresolved { - if unresolved.symbol.name == symbol.name { + if symbol.defines(&unresolved.symbol) { return Some(unresolved.source_id); } } @@ -206,7 +206,7 @@ impl Resolver { } // Populate the .parent_ids field of every source unit. for reference in &self.resolved { - let predicate = |d: &&TrackedDefinition| d.tracked.symbol.name == reference.tracked.symbol.name; + let predicate = |d: &&TrackedDefinition| d.tracked.symbol.defines(&reference.tracked.symbol); if let Some(definition) = self.definitions.iter().find(predicate) { // A unit cannot be its own parent. let is_self = reference.tracked.source_id == definition.tracked.source_id; -- cgit v1.2.3-70-g09d2