mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 16:35:29 +02:00
Span ID Refactor - Step 1 (#12960)
# Description First part of SpanID refactoring series. This PR adds a `SpanId` type and a corresponding `span_id` field to `Expression`. Parser creating expressions will now add them to an array in `StateWorkingSet`, generates a corresponding ID and saves the ID to the Expression. The IDs are not used anywhere yet. For the rough overall plan, see https://github.com/nushell/nushell/issues/12963. # User-Facing Changes Hopefully none. This is only a refactor of Nushell's internals that shouldn't have visible side effects. # Tests + Formatting # After Submitting
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
use nu_engine::command_prelude::*;
|
||||
use nu_protocol::{
|
||||
ast::{Argument, Expr, Expression},
|
||||
engine::CommandType,
|
||||
engine::{CommandType, UNKNOWN_SPAN_ID},
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -56,43 +56,49 @@ impl Command for KnownExternal {
|
||||
};
|
||||
|
||||
let extern_name: Vec<_> = extern_name.split(' ').collect();
|
||||
let call_head_id = engine_state
|
||||
.find_span_id(call.head)
|
||||
.unwrap_or(UNKNOWN_SPAN_ID);
|
||||
|
||||
let arg_extern_name = Expression {
|
||||
expr: Expr::String(extern_name[0].to_string()),
|
||||
span: call.head,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
};
|
||||
let arg_extern_name = Expression::new_existing(
|
||||
Expr::String(extern_name[0].to_string()),
|
||||
call.head,
|
||||
call_head_id,
|
||||
Type::String,
|
||||
);
|
||||
|
||||
extern_call.add_positional(arg_extern_name);
|
||||
|
||||
for subcommand in extern_name.into_iter().skip(1) {
|
||||
extern_call.add_positional(Expression {
|
||||
expr: Expr::String(subcommand.to_string()),
|
||||
span: call.head,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
extern_call.add_positional(Expression::new_existing(
|
||||
Expr::String(subcommand.to_string()),
|
||||
call.head,
|
||||
call_head_id,
|
||||
Type::String,
|
||||
));
|
||||
}
|
||||
|
||||
for arg in &call.arguments {
|
||||
match arg {
|
||||
Argument::Positional(positional) => extern_call.add_positional(positional.clone()),
|
||||
Argument::Named(named) => {
|
||||
let named_span_id = engine_state
|
||||
.find_span_id(named.0.span)
|
||||
.unwrap_or(UNKNOWN_SPAN_ID);
|
||||
if let Some(short) = &named.1 {
|
||||
extern_call.add_positional(Expression {
|
||||
expr: Expr::String(format!("-{}", short.item)),
|
||||
span: named.0.span,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
extern_call.add_positional(Expression::new_existing(
|
||||
Expr::String(format!("-{}", short.item)),
|
||||
named.0.span,
|
||||
named_span_id,
|
||||
Type::String,
|
||||
));
|
||||
} else {
|
||||
extern_call.add_positional(Expression {
|
||||
expr: Expr::String(format!("--{}", named.0.item)),
|
||||
span: named.0.span,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
extern_call.add_positional(Expression::new_existing(
|
||||
Expr::String(format!("--{}", named.0.item)),
|
||||
named.0.span,
|
||||
named_span_id,
|
||||
Type::String,
|
||||
));
|
||||
}
|
||||
if let Some(arg) = &named.2 {
|
||||
extern_call.add_positional(arg.clone());
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -68,7 +68,7 @@ pub fn type_compatible(lhs: &Type, rhs: &Type) -> bool {
|
||||
}
|
||||
|
||||
pub fn math_result_type(
|
||||
_working_set: &StateWorkingSet,
|
||||
working_set: &mut StateWorkingSet,
|
||||
lhs: &mut Expression,
|
||||
op: &mut Expression,
|
||||
rhs: &mut Expression,
|
||||
@ -104,7 +104,7 @@ pub fn math_result_type(
|
||||
| Type::Filesize,
|
||||
_,
|
||||
) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -118,7 +118,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -130,7 +130,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
},
|
||||
Operator::Math(Math::Append) => check_append(lhs, rhs, op),
|
||||
Operator::Math(Math::Append) => check_append(working_set, lhs, rhs, op),
|
||||
Operator::Math(Math::Minus) => match (&lhs.ty, &rhs.ty) {
|
||||
(Type::Int, Type::Int) => (Type::Int, None),
|
||||
(Type::Float, Type::Int) => (Type::Float, None),
|
||||
@ -152,7 +152,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Any, None),
|
||||
(_, Type::Any) => (Type::Any, None),
|
||||
(Type::Int | Type::Float | Type::Date | Type::Duration | Type::Filesize, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -166,7 +166,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -209,7 +209,7 @@ pub fn math_result_type(
|
||||
| (Type::Duration, _)
|
||||
| (Type::Filesize, _)
|
||||
| (Type::List(_), _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -223,7 +223,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -252,7 +252,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Any, None),
|
||||
(_, Type::Any) => (Type::Any, None),
|
||||
(Type::Int | Type::Float, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -266,7 +266,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -302,7 +302,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Any, None),
|
||||
(_, Type::Any) => (Type::Any, None),
|
||||
(Type::Int | Type::Float | Type::Filesize | Type::Duration, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -316,7 +316,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -348,7 +348,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Any, None),
|
||||
(_, Type::Any) => (Type::Any, None),
|
||||
(Type::Int | Type::Float | Type::Filesize | Type::Duration, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -362,7 +362,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -390,7 +390,7 @@ pub fn math_result_type(
|
||||
// definitions. As soon as that syntax is added this should be removed
|
||||
(a, b) if a == b => (Type::Bool, None),
|
||||
(Type::Bool, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -404,7 +404,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -441,7 +441,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Bool, None),
|
||||
(_, Type::Any) => (Type::Bool, None),
|
||||
(Type::Int | Type::Float | Type::Duration | Type::Filesize, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -455,7 +455,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -491,7 +491,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Bool, None),
|
||||
(_, Type::Any) => (Type::Bool, None),
|
||||
(Type::Int | Type::Float | Type::Duration | Type::Filesize, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -505,7 +505,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -541,7 +541,7 @@ pub fn math_result_type(
|
||||
(Type::Nothing, _) => (Type::Nothing, None),
|
||||
(_, Type::Nothing) => (Type::Nothing, None),
|
||||
(Type::Int | Type::Float | Type::Duration | Type::Filesize, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -555,7 +555,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -591,7 +591,7 @@ pub fn math_result_type(
|
||||
(Type::Nothing, _) => (Type::Nothing, None),
|
||||
(_, Type::Nothing) => (Type::Nothing, None),
|
||||
(Type::Int | Type::Float | Type::Duration | Type::Filesize, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -605,7 +605,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -638,7 +638,7 @@ pub fn math_result_type(
|
||||
(Type::Custom(a), _) => (Type::Custom(a.clone()), None),
|
||||
|
||||
(Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -652,7 +652,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -673,7 +673,7 @@ pub fn math_result_type(
|
||||
(Type::Custom(a), _) => (Type::Custom(a.clone()), None),
|
||||
|
||||
(Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -687,7 +687,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -708,7 +708,7 @@ pub fn math_result_type(
|
||||
(Type::Custom(a), _) => (Type::Custom(a.clone()), None),
|
||||
|
||||
(Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -722,7 +722,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -743,7 +743,7 @@ pub fn math_result_type(
|
||||
(Type::Custom(a), _) => (Type::Custom(a.clone()), None),
|
||||
|
||||
(Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -757,7 +757,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -781,7 +781,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Bool, None),
|
||||
(_, Type::Any) => (Type::Bool, None),
|
||||
(Type::Int | Type::Float | Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -795,7 +795,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -819,7 +819,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Bool, None),
|
||||
(_, Type::Any) => (Type::Bool, None),
|
||||
(Type::Int | Type::Float | Type::String, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -833,7 +833,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -855,7 +855,7 @@ pub fn math_result_type(
|
||||
(Type::Any, _) => (Type::Any, None),
|
||||
(_, Type::Any) => (Type::Any, None),
|
||||
(Type::Int, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -869,7 +869,7 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
@ -881,7 +881,9 @@ pub fn math_result_type(
|
||||
)
|
||||
}
|
||||
},
|
||||
Operator::Assignment(Assignment::AppendAssign) => check_append(lhs, rhs, op),
|
||||
Operator::Assignment(Assignment::AppendAssign) => {
|
||||
check_append(working_set, lhs, rhs, op)
|
||||
}
|
||||
Operator::Assignment(_) => match (&lhs.ty, &rhs.ty) {
|
||||
(x, y) if x == y => (Type::Nothing, None),
|
||||
(Type::Any, _) => (Type::Nothing, None),
|
||||
@ -894,7 +896,7 @@ pub fn math_result_type(
|
||||
},
|
||||
},
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
|
||||
(
|
||||
Type::Any,
|
||||
@ -1026,6 +1028,7 @@ pub fn check_block_input_output(working_set: &StateWorkingSet, block: &Block) ->
|
||||
}
|
||||
|
||||
fn check_append(
|
||||
working_set: &mut StateWorkingSet,
|
||||
lhs: &Expression,
|
||||
rhs: &Expression,
|
||||
op: &mut Expression,
|
||||
@ -1050,7 +1053,7 @@ fn check_append(
|
||||
(Type::Binary, Type::Binary) => (Type::Binary, None),
|
||||
(Type::Any, _) | (_, Type::Any) => (Type::Any, None),
|
||||
(Type::Table(_) | Type::String | Type::Binary, _) => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationRHS(
|
||||
@ -1064,7 +1067,7 @@ fn check_append(
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
*op = Expression::garbage(op.span);
|
||||
*op = Expression::garbage(working_set, op.span);
|
||||
(
|
||||
Type::Any,
|
||||
Some(ParseError::UnsupportedOperationLHS(
|
||||
|
Reference in New Issue
Block a user