mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 09:25:38 +02:00
Fix known externals, fix operator spans (#5140)
This commit is contained in:
@ -150,7 +150,7 @@ pub fn flatten_expression(
|
||||
}
|
||||
for named in call.named_iter() {
|
||||
args.push((named.0.span, FlatShape::Flag));
|
||||
if let Some(expr) = &named.1 {
|
||||
if let Some(expr) = &named.2 {
|
||||
args.extend(flatten_expression(working_set, expr));
|
||||
}
|
||||
}
|
||||
|
@ -51,8 +51,11 @@ impl Command for KnownExternal {
|
||||
let extern_name = working_state.get_span_contents(call.head);
|
||||
let extern_name = String::from_utf8(extern_name.to_vec())
|
||||
.expect("this was already parsed as a command name");
|
||||
|
||||
let extern_name: Vec<_> = extern_name.split(' ').collect();
|
||||
|
||||
let arg_extern_name = Expression {
|
||||
expr: Expr::String(extern_name),
|
||||
expr: Expr::String(extern_name[0].to_string()),
|
||||
span: call.head,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
@ -60,10 +63,38 @@ impl Command for KnownExternal {
|
||||
|
||||
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,
|
||||
});
|
||||
}
|
||||
|
||||
for arg in &call.arguments {
|
||||
match arg {
|
||||
Argument::Positional(positional) => extern_call.add_positional(positional.clone()),
|
||||
Argument::Named(named) => extern_call.add_named(named.clone()),
|
||||
Argument::Named(named) => {
|
||||
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,
|
||||
});
|
||||
} else {
|
||||
extern_call.add_positional(Expression {
|
||||
expr: Expr::String(format!("--{}", named.0.item)),
|
||||
span: named.0.span,
|
||||
ty: Type::String,
|
||||
custom_completion: None,
|
||||
});
|
||||
}
|
||||
if let Some(arg) = &named.2 {
|
||||
extern_call.add_positional(arg.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,6 +105,7 @@ impl Command for KnownExternal {
|
||||
span: call_span,
|
||||
},
|
||||
None,
|
||||
None,
|
||||
))
|
||||
}
|
||||
|
||||
@ -84,6 +116,7 @@ impl Command for KnownExternal {
|
||||
span: call_span,
|
||||
},
|
||||
None,
|
||||
None,
|
||||
))
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,7 @@ pub fn trim_quotes(bytes: &[u8]) -> &[u8] {
|
||||
|
||||
pub fn check_call(command: Span, sig: &Signature, call: &Call) -> Option<ParseError> {
|
||||
// Allow the call to pass if they pass in the help flag
|
||||
if call.named_iter().any(|(n, _)| n.item == "help") {
|
||||
if call.named_iter().any(|(n, _, _)| n.item == "help") {
|
||||
return None;
|
||||
}
|
||||
|
||||
@ -189,7 +189,7 @@ pub fn check_call(command: Span, sig: &Signature, call: &Call) -> Option<ParseEr
|
||||
}
|
||||
} else {
|
||||
for req_flag in sig.named.iter().filter(|x| x.required) {
|
||||
if call.named_iter().all(|(n, _)| n.item != req_flag.long) {
|
||||
if call.named_iter().all(|(n, _, _)| n.item != req_flag.long) {
|
||||
return Some(ParseError::MissingRequiredFlag(
|
||||
req_flag.long.clone(),
|
||||
command,
|
||||
@ -744,7 +744,7 @@ pub fn parse_internal_call(
|
||||
if let Some(long_name) = long_name {
|
||||
// We found a long flag, like --bar
|
||||
error = error.or(err);
|
||||
call.add_named((long_name, arg));
|
||||
call.add_named((long_name, None, arg));
|
||||
spans_idx += 1;
|
||||
continue;
|
||||
}
|
||||
@ -767,13 +767,30 @@ pub fn parse_internal_call(
|
||||
parse_value(working_set, *arg, &arg_shape, expand_aliases_denylist);
|
||||
error = error.or(err);
|
||||
|
||||
call.add_named((
|
||||
Spanned {
|
||||
item: flag.long.clone(),
|
||||
span: spans[spans_idx],
|
||||
},
|
||||
Some(arg),
|
||||
));
|
||||
if flag.long.is_empty() {
|
||||
if let Some(short) = flag.short {
|
||||
call.add_named((
|
||||
Spanned {
|
||||
item: String::new(),
|
||||
span: spans[spans_idx],
|
||||
},
|
||||
Some(Spanned {
|
||||
item: short.to_string(),
|
||||
span: spans[spans_idx],
|
||||
}),
|
||||
Some(arg),
|
||||
));
|
||||
}
|
||||
} else {
|
||||
call.add_named((
|
||||
Spanned {
|
||||
item: flag.long.clone(),
|
||||
span: spans[spans_idx],
|
||||
},
|
||||
None,
|
||||
Some(arg),
|
||||
));
|
||||
}
|
||||
spans_idx += 1;
|
||||
} else {
|
||||
error = error.or_else(|| {
|
||||
@ -783,6 +800,20 @@ pub fn parse_internal_call(
|
||||
))
|
||||
})
|
||||
}
|
||||
} else if flag.long.is_empty() {
|
||||
if let Some(short) = flag.short {
|
||||
call.add_named((
|
||||
Spanned {
|
||||
item: String::new(),
|
||||
span: spans[spans_idx],
|
||||
},
|
||||
Some(Spanned {
|
||||
item: short.to_string(),
|
||||
span: spans[spans_idx],
|
||||
}),
|
||||
None,
|
||||
));
|
||||
}
|
||||
} else {
|
||||
call.add_named((
|
||||
Spanned {
|
||||
@ -790,6 +821,7 @@ pub fn parse_internal_call(
|
||||
span: spans[spans_idx],
|
||||
},
|
||||
None,
|
||||
None,
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -4811,7 +4843,7 @@ pub fn discover_captures_in_expr(
|
||||
}
|
||||
|
||||
for named in call.named_iter() {
|
||||
if let Some(arg) = &named.1 {
|
||||
if let Some(arg) = &named.2 {
|
||||
let result = discover_captures_in_expr(working_set, arg, seen, seen_blocks);
|
||||
output.extend(&result);
|
||||
}
|
||||
|
Reference in New Issue
Block a user