Support negative start and end in ranges (#4249)

Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
Nick Cameron
2024-10-22 14:28:48 +13:00
committed by GitHub
parent 26042790b6
commit 4bd7e02271
3 changed files with 6 additions and 7 deletions

View File

@ -551,13 +551,13 @@ impl ArrayRangeExpression {
.execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression) .execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression)
.await? .await?
.get_json_value()?; .get_json_value()?;
let start = parse_json_number_as_u64(&start, (&*self.start_element).into())?; let start = parse_json_number_as_i64(&start, (&*self.start_element).into())?;
let metadata = Metadata::from(&*self.end_element); let metadata = Metadata::from(&*self.end_element);
let end = ctx let end = ctx
.execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression) .execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression)
.await? .await?
.get_json_value()?; .get_json_value()?;
let end = parse_json_number_as_u64(&end, (&*self.end_element).into())?; let end = parse_json_number_as_i64(&end, (&*self.end_element).into())?;
if end < start { if end < start {
return Err(KclError::Semantic(KclErrorDetails { return Err(KclError::Semantic(KclErrorDetails {
@ -603,9 +603,9 @@ impl ObjectExpression {
} }
} }
pub fn parse_json_number_as_u64(j: &serde_json::Value, source_range: SourceRange) -> Result<u64, KclError> { fn parse_json_number_as_i64(j: &serde_json::Value, source_range: SourceRange) -> Result<i64, KclError> {
if let serde_json::Value::Number(n) = &j { if let serde_json::Value::Number(n) = &j {
n.as_u64().ok_or_else(|| { n.as_i64().ok_or_else(|| {
KclError::Syntax(KclErrorDetails { KclError::Syntax(KclErrorDetails {
source_ranges: vec![source_range], source_ranges: vec![source_range],
message: format!("Invalid integer: {}", j), message: format!("Invalid integer: {}", j),

View File

@ -1,3 +1,2 @@
xs = [-5..5] xs = [int(-5)..5]
assertEqual(xs[0], -5, 0.001, "first element is -5") assertEqual(xs[0], -5, 0.001, "first element is -5")
assert(false)

View File

@ -101,7 +101,7 @@ gen_test!(property_of_object);
gen_test!(index_of_array); gen_test!(index_of_array);
gen_test!(comparisons); gen_test!(comparisons);
gen_test!(array_range_expr); gen_test!(array_range_expr);
gen_test_fail!(array_range_negative_expr, "syntax: Invalid integer: -5.0"); gen_test!(array_range_negative_expr);
gen_test_fail!( gen_test_fail!(
invalid_index_str, invalid_index_str,
"semantic: Only integers >= 0 can be used as the index of an array, but you're using a string" "semantic: Only integers >= 0 can be used as the index of an array, but you're using a string"