use crate::ast::{Expression, SimpleSelector, Span, Term};
impl Expression {
pub(super) fn end_span(&self) -> Span {
match self {
Self::Term(term) => term.end_span(),
Self::With { body: expr, .. }
| Self::Let { body: expr, .. }
| Self::Assert { body: expr, .. }
| Self::If {
else_branch: expr, ..
}
| Self::Lambda { body: expr, .. }
| Self::Apply { arg: expr, .. }
| Self::Operation { rhs: expr, .. }
| Self::Negation { expr, .. }
| Self::Not { expr, .. } => expr.end_span(),
Self::HasAttr {
path: selectors, ..
} => selectors
.last()
.map_or(Span::point(0), |last| last.selector.end_span()),
}
}
}
impl Term {
fn end_span(&self) -> Span {
match self {
Self::Token(leaf) => leaf.span,
Self::SimpleString(s) | Self::IndentedString(s) => s.span,
Self::Path(p) => p.span,
Self::List { close, .. }
| Self::Set { close, .. }
| Self::Parenthesized { close, .. } => close.span,
Self::Selection {
selectors, default, ..
} => {
default.as_ref().map_or_else(
|| selectors.last().expect("≥1 selector").selector.end_span(),
|d| d.value.end_span(),
)
}
}
}
}
impl SimpleSelector {
const fn end_span(&self) -> Span {
match self {
Self::ID(leaf) => leaf.span,
Self::Interpol(ann) => ann.span,
Self::String(s) => s.span,
}
}
}