summaryrefslogtreecommitdiff
path: root/src/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolver.rs')
-rw-r--r--src/resolver.rs39
1 files changed, 23 insertions, 16 deletions
diff --git a/src/resolver.rs b/src/resolver.rs
index 2b49055..8d3a16d 100644
--- a/src/resolver.rs
+++ b/src/resolver.rs
@@ -43,12 +43,20 @@ impl Resolver {
let source_id = self.source_units.len();
use std::mem::take;
- info!("Including source file at {:?}", source_unit.main.path);
- self.include_symbols(take(&mut source_unit.main.symbols), source_id, SourceRole::Main);
+ info!("Including source unit at {:?}", source_unit.main.path);
+ if let Some(symbols) = &mut source_unit.main.symbols {
+ self.include_symbols(take(symbols), source_id, SourceRole::Main);
+ }
if let Some(head) = &mut source_unit.head {
- self.include_symbols(take(&mut head.symbols), source_id, SourceRole::Head); }
+ if let Some(symbols) = &mut head.symbols {
+ self.include_symbols(take(symbols), source_id, SourceRole::Head);
+ }
+ }
if let Some(tail) = &mut source_unit.tail {
- self.include_symbols(take(&mut tail.symbols), source_id, SourceRole::Tail); }
+ if let Some(symbols) = &mut tail.symbols {
+ self.include_symbols(take(symbols), source_id, SourceRole::Tail);
+ }
+ }
match parent_id {
Some(parent_id) => match self.source_units.get_mut(parent_id) {
@@ -153,19 +161,18 @@ impl Resolver {
/// Return the ID of a source unit that contains an unresolved reference
/// to a symbol defined by this unit.
fn unit_resolved_by_unit(&self, source_unit: &SourceUnit) -> Option<usize> {
- if let Some(id) = self.unit_resolved_by_symbol(&source_unit.main.symbols) {
- return Some(id);
- }
- if let Some(head) = &source_unit.head {
- if let Some(id) = self.unit_resolved_by_symbol(&head.symbols) {
- return Some(id);
- }
- }
- if let Some(tail) = &source_unit.tail {
- if let Some(id) = self.unit_resolved_by_symbol(&tail.symbols) {
- return Some(id);
- }
+ macro_rules! return_resolved_unit {
+ ($file:expr) => {
+ if let Some(symbols) = &$file.symbols {
+ if let Some(id) = self.unit_resolved_by_symbol(&symbols) {
+ return Some(id);
+ }
+ }
+ };
}
+ return_resolved_unit!(&source_unit.main);
+ if let Some(head) = &source_unit.head { return_resolved_unit!(&head) }
+ if let Some(tail) = &source_unit.tail { return_resolved_unit!(&tail) }
return None;
}