From 8c0e1a02f5164e37360cbee4b0972150d7896a69 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Wed, 16 Feb 2022 15:39:05 -0800 Subject: [PATCH] Update Span to include line and col information pest::Span and pest::Position both carry a ref to the input text, while we carry an Rc so we don't have to supply the lifetime everywhere we use Spans (which is everywhere). They also calculate line information on-the-fly, while we cache it. Signed-off-by: Alek Ratzloff --- src/syn/parser.rs | 12 ++++++------ src/syn/span.rs | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) 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)]