From 30541c1eeb82b97823067c592e1fa7e0052146cc Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 25 Jun 2017 20:00:09 +0200 Subject: [PATCH] fix(parser): Give correct location information for unindentation errors --- parser/src/layout.rs | 14 +++++++------- parser/src/lib.rs | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/parser/src/layout.rs b/parser/src/layout.rs index 50aa24a64d..b1af11b6fe 100644 --- a/parser/src/layout.rs +++ b/parser/src/layout.rs @@ -71,13 +71,13 @@ impl Contexts { self.stack.pop() } - fn push(&mut self, offside: Offside) -> Result<(), Error> { + fn push(&mut self, offside: Offside) -> Result<(), Spanned> { self.check_unindentation_limit(offside)?; self.stack.push(offside); Ok(()) } - fn check_unindentation_limit(&mut self, offside: Offside) -> Result<(), Error> { + fn check_unindentation_limit(&mut self, offside: Offside) -> Result<(), Spanned> { let mut skip_block = false; for other_offside in self.stack.iter().rev() { match other_offside.context { @@ -96,7 +96,7 @@ impl Contexts { _ => continue, } debug!("Unindentation error: {:?} < {:?}", offside, other_offside); - return Err(Error::UnindentedTooFar); + return Err(pos::spanned2(offside.location.absolute, offside.location.absolute, Error::UnindentedTooFar)); } Ok(()) } @@ -146,7 +146,7 @@ impl<'input, Tokens> Layout<'input, Tokens> pos::spanned(span, layout_token) } - fn scan_for_next_block(&mut self, context: Context) -> Result<(), Error> { + fn scan_for_next_block(&mut self, context: Context) -> Result<(), Spanned> { let next = self.next_token(); let span = next.span; self.unprocessed_tokens.push(next); @@ -158,7 +158,7 @@ impl<'input, Tokens> Layout<'input, Tokens> .push(Offside::new(span.start, context)) } - fn layout_next_token(&mut self) -> Result, Error> { + fn layout_next_token(&mut self) -> Result, Spanned> { use std::cmp::Ordering; let mut token = self.next_token(); @@ -436,9 +436,9 @@ fn token_closes_context(token: &Token, context: Context) -> bool { impl<'input, Tokens> Iterator for Layout<'input, Tokens> where Tokens: Iterator> { - type Item = Result, Error>; + type Item = Result, Spanned>; - fn next(&mut self) -> Option, Error>> { + fn next(&mut self) -> Option { match self.layout_next_token() { Ok(Spanned { value: Token::EOF, .. }) => None, token => Some(token), diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 471caff929..afc7f00f93 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -279,7 +279,7 @@ macro_rules! layout { err.span.end.absolute, err.value.into()) })?; - let token = token.map_err(|err| pos::spanned2(0.into(), 0.into(), err.into()))?; + let token = token.map_err(|err| pos::spanned(err.span, err.value.into()))?; debug!("Lex {:?}", token.value); let Span { start, end, .. } = token.span; Ok((start.absolute, token.value, end.absolute))