diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-04-01 17:15:31 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-04-01 17:15:31 +1300 |
commit | 1400c0cc3bdd7f685d63fe174286dd106337e735 (patch) | |
tree | 3675738c739648611525df26a4b8566e79c82755 | |
parent | 1cc0269f75b8b2dd979c01ef4a500a09a0cc4354 (diff) | |
download | assembler-1400c0cc3bdd7f685d63fe174286dd106337e735.zip |
Report all symbols involved in a cyclic dependency error
Without this, it's difficult to sort out a cyclic dependency error when
many large source files are involved.
-rw-r--r-- | src/errors/merge_error.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/errors/merge_error.rs b/src/errors/merge_error.rs index d830d96..89f55a2 100644 --- a/src/errors/merge_error.rs +++ b/src/errors/merge_error.rs @@ -3,6 +3,8 @@ use crate::*; use ansi::*; use log::error; +use std::collections::HashSet; + pub struct MergeError<'a> { pub resolver: &'a Resolver, @@ -33,6 +35,18 @@ impl MergeError<'_> { None => eprintln!(" => {parent_path}"), }; + // Report all referenced symbols that are defined by this parent. + let mut reported_definition_ids = HashSet::new(); + for reference in &self.resolver.resolved { + if reference.tracked.source_id == *id { + if reported_definition_ids.insert(reference.definition) { + let definition = &self.resolver.definitions[reference.definition]; + if definition.tracked.source_id == *parent_id { + eprintln!(" {:?}", definition.tracked.symbol); + } + } + } + } } } } |