diff options
-rw-r--r-- | src/resolver.rs | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/resolver.rs b/src/resolver.rs index d02d80f..1f6e0a2 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -2,6 +2,8 @@ use crate::*; use log::{info, error}; +use std::collections::HashSet; + type PushFn = fn(&mut String, &SourceFile); @@ -60,16 +62,16 @@ impl Resolver { match parent_id { Some(parent_id) => match self.source_units.get_mut(parent_id) { - Some(parent) => parent.child_ids.push(source_id), - None => error!("Could not find parent (#{parent_id}) of source unit #{source_id}"), + Some(parent) => { parent.child_ids.insert(source_id); } + None => { error!("Could not find parent (#{parent_id}) of source unit #{source_id}"); } } None => self.root_unit_ids.push(source_id), } self.source_units.push( HeirarchicalSourceUnit { source_unit, - child_ids: Vec::new(), - parent_ids: Vec::new(), + child_ids: HashSet::new(), + parent_ids: HashSet::new(), } ); } @@ -213,9 +215,9 @@ impl Resolver { // A unit cannot be its own parent. let is_self = reference.tracked.source_id == definition.tracked.source_id; let must_precede = SymbolRole::Definition(DefinitionType::MustPrecedeReference); - if is_self || definition.tracked.symbol.role != must_precede { continue; } + if is_self || definition.tracked.symbol.role != must_precede { continue; } let referencing_unit = &mut self.source_units[reference.tracked.source_id]; - referencing_unit.parent_ids.push(definition.tracked.source_id); + referencing_unit.parent_ids.insert(definition.tracked.source_id); }; } } @@ -285,9 +287,9 @@ impl Resolver { pub struct HeirarchicalSourceUnit { pub source_unit: SourceUnit, /// Pointers to source units that resolve references this unit. - pub child_ids: Vec<usize>, + pub child_ids: HashSet<usize>, /// Pointers to source units that must be included before this unit. - pub parent_ids: Vec<usize>, + pub parent_ids: HashSet<usize>, } pub struct TrackedDefinition { |