diff --git a/src/syn/span.rs b/src/syn/span.rs index 11dfd58..4b0c2a2 100644 --- a/src/syn/span.rs +++ b/src/syn/span.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use std::fmt::{self, Debug}; +use std::fmt::{self, Debug, Display}; use std::rc::Rc; #[derive(Debug, Default, Clone, PartialEq, Eq)] @@ -34,6 +34,30 @@ impl PartialEq for Span { } } +impl Display for Span { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + if self.start == self.end { + write!( + fmt, + "line {} col {} in {}", + self.end.line, self.end.col, self.source + ) + } else if self.end.source > self.start.source && self.end.line == self.start.line { + write!( + fmt, + "line {} cols {}-{} in {}", + self.end.line, self.start.col, self.end.col, self.source + ) + } else { + write!( + fmt, + "lines {}-{} in {}", + self.start.line, self.end.line, self.source + ) + } + } +} + #[derive(Clone, PartialEq, Eq)] pub struct Spanned { span: Span, diff --git a/src/vm/error.rs b/src/vm/error.rs index b256dcc..264c8ab 100644 --- a/src/vm/error.rs +++ b/src/vm/error.rs @@ -18,7 +18,7 @@ pub enum RuntimeError { #[error("expected {0}")] WrongValue(String), - #[error("at XXX")] + #[error("at {0}")] Span(Span, Box), }