From 78da2bdd5d77d1b8572e5e9da119bfa68127a3fa Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 21 Jan 2020 17:09:31 +0100 Subject: =?UTF-8?q?Decoupled=20function=20parser=20=F0=9F=94=97=20[WIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/syntax/span.rs | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'src/syntax/span.rs') diff --git a/src/syntax/span.rs b/src/syntax/span.rs index eb39677e..e049861f 100644 --- a/src/syntax/span.rs +++ b/src/syntax/span.rs @@ -1,7 +1,7 @@ //! Spans map elements to the part of source code they originate from. use std::fmt::{self, Debug, Display, Formatter}; -use std::ops::{Add, AddAssign}; +use std::ops::{Add, Sub}; use serde::Serialize; @@ -21,12 +21,13 @@ impl Spanned { self.v } - pub fn map(self, f: F) -> Spanned where F: FnOnce(T) -> V { + pub fn map(self, f: F) -> Spanned where F: FnOnce(T) -> V { Spanned { v: f(self.v), span: self.span } } - pub fn map_v(&self, new_v: V) -> Spanned { - Spanned { v: new_v, span: self.span } + pub fn map_span(mut self, f: F) -> Spanned where F: FnOnce(Span) -> Span { + self.span = f(self.span); + self } } @@ -74,6 +75,13 @@ impl Span { pub fn expand(&mut self, other: Span) { *self = Span::merge(*self, other) } + + pub fn offset(self, start: Position) -> Span { + Span { + start: start + self.start, + end: start + self.end, + } + } } impl Display for Span { @@ -119,9 +127,21 @@ impl Add for Position { } } -impl AddAssign for Position { - fn add_assign(&mut self, other: Position) { - *self = *self + other; +impl Sub for Position { + type Output = Position; + + fn sub(self, rhs: Position) -> Position { + if self.line == rhs.line { + Position { + line: 0, + column: self.column - rhs.column + } + } else { + Position { + line: self.line - rhs.line, + column: self.column, + } + } } } @@ -136,14 +156,6 @@ debug_display!(Position); /// A vector of spanned things. pub type SpanVec = Vec>; -pub fn offset_spans( - vec: SpanVec, - start: Position, -) -> impl Iterator> { - vec.into_iter() - .map(move |mut spanned| { - spanned.span.start += start; - spanned.span.end += start; - spanned - }) +pub fn offset_spans(vec: SpanVec, start: Position) -> impl Iterator> { + vec.into_iter().map(move |s| s.map_span(|span| span.offset(start))) } -- cgit v1.2.3