Fix completion crash (#521)

This commit is contained in:
JT 2021-12-19 07:10:40 +11:00 committed by GitHub
parent ebf57c70e0
commit b54e9b6bfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 13 deletions

View File

@ -204,8 +204,7 @@ pub fn parse_alias(
} }
if let Some(decl_id) = working_set.find_decl(b"alias") { if let Some(decl_id) = working_set.find_decl(b"alias") {
let (call, call_span, _) = let (call, _) = parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
if spans.len() >= 4 { if spans.len() >= 4 {
let alias_name = working_set.get_span_contents(spans[1]); let alias_name = working_set.get_span_contents(spans[1]);
@ -228,7 +227,7 @@ pub fn parse_alias(
return ( return (
Statement::Pipeline(Pipeline::from_vec(vec![Expression { Statement::Pipeline(Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: span(spans),
ty: Type::Unknown, ty: Type::Unknown,
custom_completion: None, custom_completion: None,
}])), }])),
@ -1008,7 +1007,7 @@ pub fn parse_let(
} }
} }
} }
let (call, _, err) = parse_internal_call(working_set, spans[0], &spans[1..], decl_id); let (call, err) = parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
return ( return (
Statement::Pipeline(Pipeline { Statement::Pipeline(Pipeline {
@ -1043,8 +1042,7 @@ pub fn parse_source(
if let Some(decl_id) = working_set.find_decl(b"source") { if let Some(decl_id) = working_set.find_decl(b"source") {
// Is this the right call to be using here? // Is this the right call to be using here?
// Some of the others (`parse_let`) use it, some of them (`parse_hide`) don't. // Some of the others (`parse_let`) use it, some of them (`parse_hide`) don't.
let (call, call_span, err) = let (call, err) = parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
error = error.or(err); error = error.or(err);
// Command and one file name // Command and one file name
@ -1092,7 +1090,7 @@ pub fn parse_source(
return ( return (
Statement::Pipeline(Pipeline::from_vec(vec![Expression { Statement::Pipeline(Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call_with_block), expr: Expr::Call(call_with_block),
span: call_span, span: span(spans),
ty: Type::Unknown, ty: Type::Unknown,
custom_completion: None, custom_completion: None,
}])), }])),
@ -1113,7 +1111,7 @@ pub fn parse_source(
return ( return (
Statement::Pipeline(Pipeline::from_vec(vec![Expression { Statement::Pipeline(Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: span(spans),
ty: Type::Unknown, ty: Type::Unknown,
custom_completion: None, custom_completion: None,
}])), }])),
@ -1165,10 +1163,11 @@ pub fn parse_register(
) )
} }
Some(decl_id) => { Some(decl_id) => {
let (call, call_span, mut err) = let (call, mut err) = parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
parse_internal_call(working_set, spans[0], &spans[1..], decl_id);
let decl = working_set.get_decl(decl_id); let decl = working_set.get_decl(decl_id);
let call_span = span(spans);
err = check_call(call_span, &decl.signature(), &call).or(err); err = check_call(call_span, &decl.signature(), &call).or(err);
if err.is_some() || call.has_flag("help") { if err.is_some() || call.has_flag("help") {
return ( return (

View File

@ -487,7 +487,7 @@ pub fn parse_internal_call(
command_span: Span, command_span: Span,
spans: &[Span], spans: &[Span],
decl_id: usize, decl_id: usize,
) -> (Box<Call>, Span, Option<ParseError>) { ) -> (Box<Call>, Option<ParseError>) {
let mut error = None; let mut error = None;
let mut call = Call::new(); let mut call = Call::new();
@ -618,7 +618,7 @@ pub fn parse_internal_call(
} }
// FIXME: output type unknown // FIXME: output type unknown
(Box::new(call), span(spans), error) (Box::new(call), error)
} }
pub fn parse_call( pub fn parse_call(
@ -725,7 +725,7 @@ pub fn parse_call(
} }
// parse internal command // parse internal command
let (call, _, err) = parse_internal_call( let (call, err) = parse_internal_call(
working_set, working_set,
span(&spans[cmd_start..pos]), span(&spans[cmd_start..pos]),
&spans[pos..], &spans[pos..],