diff --git a/src/syn/parser.rs b/src/syn/parser.rs index 5df88b3..d936642 100644 --- a/src/syn/parser.rs +++ b/src/syn/parser.rs @@ -66,8 +66,8 @@ fn parse_atom(source: &Rc, pair: Pair) -> Result { }; let span = Span { source: Rc::clone(source), - start: pair_span.start(), - end: pair_span.end(), + start: pair_span.start_pos().into(), + end: pair_span.end_pos().into(), }; Ok(SpAtom::new(span, atom)) } @@ -85,8 +85,8 @@ fn parse_expr(source: &Rc, pair: Pair) -> Result { }; let span = Span { source: Rc::clone(source), - start: pair_span.start(), - end: pair_span.end(), + start: pair_span.start_pos().into(), + end: pair_span.end_pos().into(), }; Ok(SpExpr::new(span, expr)) } @@ -100,8 +100,8 @@ fn parse_stmt(source: &Rc, pair: Pair) -> Result { }; let span = Span { source: Rc::clone(&source), - start: pair_span.start(), - end: pair_span.end(), + start: pair_span.start_pos().into(), + end: pair_span.end_pos().into(), }; Ok(SpStmt::new(span, stmt)) } diff --git a/src/syn/span.rs b/src/syn/span.rs index c77d94e..11dfd58 100644 --- a/src/syn/span.rs +++ b/src/syn/span.rs @@ -3,12 +3,28 @@ use std::fmt::{self, Debug}; use std::rc::Rc; +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct Pos { + /// The byte index of this position. + pub source: usize, + pub line: usize, + pub col: usize, +} + +impl From> for Pos { + fn from(other: pest::Position) -> Self { + let (line, col) = other.line_col(); + let source = other.pos(); + Pos { source, line, col } + } +} + #[cfg_attr(not(test), derive(PartialEq))] #[derive(Debug, Default, Clone, Eq)] pub struct Span { pub source: Rc, - pub start: usize, - pub end: usize, + pub start: Pos, + pub end: Pos, } #[cfg(test)]