diff --git a/src/compiler.rs b/src/compiler.rs index b7c6020..198041d 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -70,10 +70,10 @@ impl MultiSpan { .collect() } - fn primary_line(&self, source_map: &SourceMap) -> usize { + fn primary_line(&self, source_map: &SourceMap) -> Option { let labels = self.internal_labels(source_map); - let label = labels.iter().find(|l| l.primary).unwrap(); - pos_of_span(label.span.span(), source_map).0 + let label = labels.iter().find(|l| l.primary)?; + Some(pos_of_span(label.span.span(), source_map).0) } } @@ -1501,7 +1501,7 @@ impl TypeCheckingResult { #[derive(Debug, Clone)] pub struct TypeError { pub message: String, - pub line: usize, + pub line: Option, pub fix: Option, } diff --git a/src/translation.rs b/src/translation.rs index 4c63ac5..5deb7d8 100644 --- a/src/translation.rs +++ b/src/translation.rs @@ -176,13 +176,15 @@ impl<'a> FixContext<'a> { if let Some(res) = &self.result { let prefix_lines = self.prefix_lines(); for error in &res.errors { - assert!( - error.line == 1 || error.line > prefix_lines, - "{}\n\n{}\n\n{}", - self.prefix, - self.code, - error.message - ); + if let Some(line) = error.line { + assert!( + line == 1 || line > prefix_lines, + "{}\n\n{}\n\n{}", + self.prefix, + self.code, + error.message + ); + } } } } @@ -480,7 +482,10 @@ impl<'ast> Translator<'ast> { wo_errors += 1; wo_error_names.push(*name); let callees = &transitive[name]; - if callees.iter().all(|c| translated[c].no_error()) { + if callees.iter().all(|c| { + let t = some_or!(translated.get(c), return true); + t.no_error() + }) { no_trans_errors += 1; no_trans_error_names.push(*name); }