From 6f4484ec12acc37fde05d022b51927009fea1f99 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Wed, 16 Feb 2022 15:55:05 -0800 Subject: [PATCH] Better error messages Error messages with locations were good, and then they sucked, and now they're good again. Signed-off-by: Alek Ratzloff --- src/syn/span.rs | 26 +++++++++++++++++++++++++- src/vm/error.rs | 2 +- 2 files changed, 26 insertions(+), 2 deletions(-) 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), }