Use span ID of expressions everywhere in eval_base

This commit is contained in:
Jakub Žádník 2024-06-08 17:08:44 +03:00
parent 26967b14f1
commit 28ae7b80ac

View File

@ -69,36 +69,38 @@ pub trait Eval {
RecordItem::Pair(col, val) => { RecordItem::Pair(col, val) => {
// avoid duplicate cols // avoid duplicate cols
let col_name = Self::eval::<D>(state, mut_state, col)?.coerce_into_string()?; let col_name = Self::eval::<D>(state, mut_state, col)?.coerce_into_string()?;
let col_span = state.get_span(col.span_id);
if let Some(orig_span) = col_names.get(&col_name) { if let Some(orig_span) = col_names.get(&col_name) {
return Err(ShellError::ColumnDefinedTwice { return Err(ShellError::ColumnDefinedTwice {
col_name, col_name,
second_use: col.span, second_use: col_span,
first_use: *orig_span, first_use: *orig_span,
}); });
} else { } else {
col_names.insert(col_name.clone(), col.span); col_names.insert(col_name.clone(), col_span);
record.push(col_name, Self::eval::<D>(state, mut_state, val)?); record.push(col_name, Self::eval::<D>(state, mut_state, val)?);
} }
} }
RecordItem::Spread(_, inner) => { RecordItem::Spread(_, inner) => {
let inner_span = state.get_span(inner.span_id);
match Self::eval::<D>(state, mut_state, inner)? { match Self::eval::<D>(state, mut_state, inner)? {
Value::Record { val: inner_val, .. } => { Value::Record { val: inner_val, .. } => {
for (col_name, val) in inner_val.into_owned() { for (col_name, val) in inner_val.into_owned() {
if let Some(orig_span) = col_names.get(&col_name) { if let Some(orig_span) = col_names.get(&col_name) {
return Err(ShellError::ColumnDefinedTwice { return Err(ShellError::ColumnDefinedTwice {
col_name, col_name,
second_use: inner.span, second_use: inner_span,
first_use: *orig_span, first_use: *orig_span,
}); });
} else { } else {
col_names.insert(col_name.clone(), inner.span); col_names.insert(col_name.clone(), inner_span);
record.push(col_name, val); record.push(col_name, val);
} }
} }
} }
_ => { _ => {
return Err(ShellError::CannotSpreadAsRecord { return Err(ShellError::CannotSpreadAsRecord {
span: inner.span, span: inner_span,
}) })
} }
} }
@ -116,10 +118,11 @@ pub trait Eval {
.iter() .iter()
.position(|existing| existing == &header) .position(|existing| existing == &header)
{ {
let first_use = state.get_span( table.columns[idx].span_id );
return Err(ShellError::ColumnDefinedTwice { return Err(ShellError::ColumnDefinedTwice {
col_name: header, col_name: header,
second_use: expr_span, second_use: expr_span,
first_use: table.columns[idx].span, first_use,
}); });
} else { } else {
output_headers.push(header); output_headers.push(header);
@ -147,7 +150,7 @@ pub trait Eval {
x => Err(ShellError::CantConvert { x => Err(ShellError::CantConvert {
to_type: "unit value".into(), to_type: "unit value".into(),
from_type: x.get_type().to_string(), from_type: x.get_type().to_string(),
span: value.expr.span, span: state.get_span(value.expr.span_id),
help: None, help: None,
}), }),
}, },
@ -193,7 +196,7 @@ pub trait Eval {
} }
} }
Expr::BinaryOp(lhs, op, rhs) => { Expr::BinaryOp(lhs, op, rhs) => {
let op_span = op.span; let op_span = state.get_span(op.span_id);
let op = eval_operator(op)?; let op = eval_operator(op)?;
match op { match op {