From 2409f0c64ef3d0ba23977e6d28bd0c358600cf35 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 23 Jan 2019 21:21:13 -0600 Subject: [PATCH] FEATURE: Better attribution of errors to their file. --- src/error.rs | 24 ++++++++++++++++-------- src/iter.rs | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/error.rs b/src/error.rs index 840e5c1..9aac3e0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -17,9 +17,8 @@ use std::error; use std::fmt; use std::fmt::Debug; -use abortable_parser::Positioned; - use crate::ast::*; +use crate::iter::FilePositioned; /// ErrorType defines the various types of errors that can result from compiling UCG into an /// output format. @@ -76,10 +75,14 @@ impl BuildError { } fn render(&self, w: &mut fmt::Formatter) -> fmt::Result { + let file = match self.pos.file { + Some(ref pb) => pb.to_string_lossy().to_string(), + None => "".to_string(), + }; write!( w, - "{} at line: {} column: {}\nCaused By:\n\t{} ", - self.err_type, self.pos.line, self.pos.column, self.msg + "{} at {} line: {} column: {}\nCaused By:\n\t{} ", + self.err_type, file, self.pos.line, self.pos.column, self.msg )?; Ok(()) } @@ -104,11 +107,11 @@ impl error::Error for BuildError { } #[derive(Debug)] -pub struct StackPrinter { +pub struct StackPrinter { pub err: abortable_parser::Error, } -impl StackPrinter { +impl StackPrinter { pub fn render(&self, w: &mut fmt::Formatter) -> fmt::Result { let mut curr_err = Some(&self.err); let mut tabstop = ""; @@ -118,11 +121,16 @@ impl StackPrinter { None => break, Some(err) => { let context = err.get_context(); + let file = match context.file() { + Some(ref pb) => pb.to_string_lossy().to_string(), + None => "".to_string(), + }; write!( w, - "{}{}: line: {}, column: {}\n", + "{}{}: at {} line: {}, column: {}\n", tabstop, err.get_msg(), + file, context.line(), context.column(), )?; @@ -138,7 +146,7 @@ impl StackPrinter { } } -impl fmt::Display for StackPrinter { +impl fmt::Display for StackPrinter { fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result { self.render(w) } diff --git a/src/iter.rs b/src/iter.rs index 9936735..478dae7 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -121,3 +121,22 @@ impl<'a> From<&'a OffsetStrIter<'a>> for Position { } } } + +pub trait FilePositioned: Positioned { + fn file(&self) -> Option<&PathBuf>; +} + +impl<'a> FilePositioned for OffsetStrIter<'a> { + fn file(&self) -> Option<&PathBuf> { + self.source_file.as_ref() + } +} + +impl<'a> FilePositioned for SliceIter<'a, Token> { + fn file(&self) -> Option<&PathBuf> { + match self.peek_next() { + Some(t) => t.pos.file.as_ref(), + None => None, + } + } +}