summaryrefslogtreecommitdiff
path: root/dhall/src/syntax/core/span.rs
diff options
context:
space:
mode:
authorNadrieril2019-12-17 14:33:06 +0000
committerNadrieril2019-12-19 21:34:07 +0000
commit881248d2c4f0b4556a23d671d355bb7258adf8bb (patch)
tree0b70a90b646406d911348124e232d33e9daf5705 /dhall/src/syntax/core/span.rs
parentf54d49e38b15c30a8b2cef8d85a8f69b1edbf3c5 (diff)
Rename syntax::core to syntax::ast
Diffstat (limited to 'dhall/src/syntax/core/span.rs')
-rw-r--r--dhall/src/syntax/core/span.rs81
1 files changed, 0 insertions, 81 deletions
diff --git a/dhall/src/syntax/core/span.rs b/dhall/src/syntax/core/span.rs
deleted file mode 100644
index f9c7008..0000000
--- a/dhall/src/syntax/core/span.rs
+++ /dev/null
@@ -1,81 +0,0 @@
-use std::rc::Rc;
-
-/// A location in the source text
-#[derive(Debug, Clone)]
-pub struct ParsedSpan {
- input: Rc<str>,
- /// # Safety
- ///
- /// Must be a valid character boundary index into `input`.
- start: usize,
- /// # Safety
- ///
- /// Must be a valid character boundary index into `input`.
- end: usize,
-}
-
-#[derive(Debug, Clone)]
-pub enum Span {
- /// A location in the source text
- Parsed(ParsedSpan),
- /// For expressions obtained from decoding binary
- Decoded,
- /// For expressions constructed during normalization/typecheck
- Artificial,
-}
-
-impl Span {
- pub(crate) fn make(input: Rc<str>, sp: pest::Span) -> Self {
- Span::Parsed(ParsedSpan {
- input,
- start: sp.start(),
- end: sp.end(),
- })
- }
-
- /// Takes the union of the two spans, i.e. the range of input covered by the two spans plus any
- /// input between them. Assumes that the spans come from the same input. Fails if one of the
- /// spans does not point to an input location.
- pub fn union(&self, other: &Span) -> Self {
- use std::cmp::{max, min};
- use Span::*;
- match (self, other) {
- (Parsed(x), Parsed(y)) if Rc::ptr_eq(&x.input, &y.input) => {
- Parsed(ParsedSpan {
- input: x.input.clone(),
- start: min(x.start, y.start),
- end: max(x.end, y.end),
- })
- }
- _ => panic!(
- "Tried to union incompatible spans: {:?} and {:?}",
- self, other
- ),
- }
- }
-
- /// Merges two spans assumed to point to a similar thing. If only one of them points to an
- /// input location, use that one.
- pub fn merge(&self, other: &Span) -> Self {
- use Span::*;
- match (self, other) {
- (Parsed(x), _) | (_, Parsed(x)) => Parsed(x.clone()),
- (Artificial, _) | (_, Artificial) => Artificial,
- (Decoded, Decoded) => Decoded,
- }
- }
-
- pub fn error(&self, message: impl Into<String>) -> String {
- use pest::error::{Error, ErrorVariant};
- use pest::Span;
- let message: String = message.into();
- let span = match self {
- self::Span::Parsed(span) => span,
- _ => return format!("[unknown location] {}", message),
- };
- let span = Span::new(&*span.input, span.start, span.end).unwrap();
- let err: ErrorVariant<!> = ErrorVariant::CustomError { message };
- let err = Error::new_from_span(err, span);
- format!("{}", err)
- }
-}