summaryrefslogtreecommitdiff
path: root/src/errors/merge_error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/errors/merge_error.rs')
-rw-r--r--src/errors/merge_error.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/errors/merge_error.rs b/src/errors/merge_error.rs
new file mode 100644
index 0000000..a694b71
--- /dev/null
+++ b/src/errors/merge_error.rs
@@ -0,0 +1,41 @@
+use crate::*;
+
+use ansi::*;
+use log::error;
+
+
+pub struct MergeError<'a> {
+ pub resolver: &'a Resolver,
+ /// A list of source units involved in a cycle.
+ pub cyclic_unit_ids: Vec<usize>,
+}
+
+impl MergeError<'_> {
+ pub fn report(&self) {
+ error!("A cyclic dependency was found between the following libraries:");
+ for id in &self.cyclic_unit_ids {
+ if let Some(unit) = self.resolver.source_units.get(*id) {
+ let path = &unit.source_unit.path();
+ match unit.source_unit.name() {
+ Some(name) =>
+ eprintln!("{name}{NORMAL}{DIM} ({path}){NORMAL}"),
+ None =>
+ eprintln!("{path}"),
+ };
+ // Print each parent involved in the dependency cycle.
+ for parent_id in &unit.parent_ids {
+ if !self.cyclic_unit_ids.contains(parent_id) { continue; }
+ if let Some(parent_unit) = self.resolver.source_units.get(*parent_id) {
+ let parent_path = &parent_unit.source_unit.path();
+ match parent_unit.source_unit.name() {
+ Some(parent_name) =>
+ eprintln!(" => {parent_name} {DIM}({parent_path}){NORMAL}"),
+ None =>
+ eprintln!(" => {parent_path}"),
+ };
+ }
+ }
+ }
+ }
+ }
+}