Implement custom, Copy span

This commit is contained in:
Joscha 2022-11-18 11:24:59 +01:00
parent 2ad7be8bc6
commit b24f218e0b
2 changed files with 67 additions and 0 deletions

View file

@ -7,6 +7,7 @@ use clap::Parser;
mod ast; mod ast;
mod builtin; mod builtin;
mod parser; mod parser;
mod span;
mod table; mod table;
mod value; mod value;

66
src/span.rs Normal file
View file

@ -0,0 +1,66 @@
use std::fmt;
use std::ops::Range;
#[derive(Clone, Copy)]
pub struct Span {
start: usize,
end: usize,
}
impl Span {
pub fn new(start: usize, end: usize) -> Self {
assert!(start <= end, "start must be less than or equal to end");
Self { start, end }
}
pub fn range(self) -> Range<usize> {
self.start..self.end
}
pub fn join(self, other: Self) -> Self {
let start = self.start.min(other.start);
let end = self.end.max(other.end);
Self::new(start, end)
}
}
impl fmt::Debug for Span {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.range().fmt(f)
}
}
impl From<Span> for Range<usize> {
fn from(span: Span) -> Self {
span.range()
}
}
pub trait HasSpan {
fn span(&self) -> Span;
}
impl<T> HasSpan for (T, Span) {
fn span(&self) -> Span {
self.1
}
}
impl chumsky::Span for Span {
type Context = ();
type Offset = usize;
fn new(_: Self::Context, range: Range<Self::Offset>) -> Self {
Self::new(range.start, range.end)
}
fn context(&self) -> Self::Context {}
fn start(&self) -> Self::Offset {
self.start
}
fn end(&self) -> Self::Offset {
self.end
}
}