Improve range parsing and handling (#2506)

* Improve range parsing and handling

* linting
This commit is contained in:
Jonathan Turner
2020-09-07 14:43:58 +12:00
committed by GitHub
parent 986b427038
commit c9ffd6afc0
7 changed files with 172 additions and 44 deletions

View File

@ -86,8 +86,13 @@ struct RangeIterator {
impl RangeIterator {
pub fn new(range: Range, tag: Tag) -> RangeIterator {
let start = match range.from.0.item {
Primitive::Nothing => Primitive::Int(0.into()),
x => x,
};
RangeIterator {
curr: range.from.0.item,
curr: start,
end: range.to.0.item,
tag,
is_end_inclusive: matches!(range.to.1, RangeInclusion::Inclusive),

View File

@ -60,8 +60,12 @@ impl<'s> Flatten<'s> {
}
Expression::Range(range) => {
let mut result = Vec::new();
result.append(&mut self.expression(&range.left));
result.append(&mut self.expression(&range.right));
if let Some(left) = &range.left {
result.append(&mut self.expression(left));
}
if let Some(right) = &range.right {
result.append(&mut self.expression(right));
}
result
}

View File

@ -61,11 +61,18 @@ pub(crate) async fn evaluate_baseline_expr(
}
}
Expression::Range(range) => {
let left = &range.left;
let right = &range.right;
let left = if let Some(left) = &range.left {
evaluate_baseline_expr(&left, registry, it, vars, env).await?
} else {
Value::nothing()
};
let right = if let Some(right) = &range.right {
evaluate_baseline_expr(&right, registry, it, vars, env).await?
} else {
Value::nothing()
};
let left = evaluate_baseline_expr(&left, registry, it, vars, env).await?;
let right = evaluate_baseline_expr(&right, registry, it, vars, env).await?;
let left_span = left.tag.span;
let right_span = right.tag.span;