Improve describe to be more accurate (#5116)

This commit is contained in:
JT 2022-04-07 16:34:09 +12:00 committed by GitHub
parent ef1934a7ee
commit 4409185e1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 168 additions and 148 deletions

View File

@ -166,7 +166,7 @@ pub fn parse_for(
Expression { Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
err, err,
@ -201,7 +201,7 @@ pub fn parse_for(
Expression { Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
error, error,
@ -335,7 +335,7 @@ pub fn parse_def(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
err, err,
@ -393,7 +393,7 @@ pub fn parse_def(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -501,7 +501,7 @@ pub fn parse_extern(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -561,7 +561,7 @@ pub fn parse_alias(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
err, err,
@ -989,7 +989,7 @@ pub fn parse_export(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
exportable, exportable,
@ -1194,7 +1194,7 @@ pub fn parse_module(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1244,7 +1244,7 @@ pub fn parse_use(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
err, err,
@ -1311,7 +1311,7 @@ pub fn parse_use(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
Some(ParseError::ModuleNotFound(spans[1])), Some(ParseError::ModuleNotFound(spans[1])),
@ -1350,7 +1350,7 @@ pub fn parse_use(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
Some(ParseError::ModuleNotFound(spans[1])), Some(ParseError::ModuleNotFound(spans[1])),
@ -1432,7 +1432,7 @@ pub fn parse_use(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1473,7 +1473,7 @@ pub fn parse_hide(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
err, err,
@ -1640,7 +1640,7 @@ pub fn parse_hide(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1725,7 +1725,7 @@ pub fn parse_let(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: nu_protocol::span(spans), span: nu_protocol::span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1746,7 +1746,7 @@ pub fn parse_let(
expressions: vec![Expression { expressions: vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: nu_protocol::span(spans), span: nu_protocol::span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}], }],
}, },
@ -1790,7 +1790,7 @@ pub fn parse_source(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1820,7 +1820,7 @@ pub fn parse_source(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(&spans[1..]), span: span(&spans[1..]),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
// Return the file parse error // Return the file parse error
@ -1837,7 +1837,7 @@ pub fn parse_source(
call_with_block.positional.push(Expression { call_with_block.positional.push(Expression {
expr: Expr::Int(block_id as i64), expr: Expr::Int(block_id as i64),
span: spans[1], span: spans[1],
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}); });
@ -1845,7 +1845,7 @@ pub fn parse_source(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call_with_block), expr: Expr::Call(call_with_block),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
None, None,
@ -1863,7 +1863,7 @@ pub fn parse_source(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
error, error,
@ -1932,7 +1932,7 @@ pub fn parse_register(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
err, err,
@ -2034,7 +2034,7 @@ pub fn parse_register(
Pipeline::from_vec(vec![Expression { Pipeline::from_vec(vec![Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: call_span, span: call_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}]), }]),
Some(err), Some(err),

View File

@ -292,7 +292,7 @@ pub fn parse_external_call(
Expression { Expression {
expr: Expr::ExternalCall(head, args), expr: Expr::ExternalCall(head, args),
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
error, error,
@ -663,7 +663,7 @@ pub fn parse_multispan_value(
Box::new(Expression::garbage(arg_span)), Box::new(Expression::garbage(arg_span)),
), ),
span: arg_span, span: arg_span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
error, error,
@ -1008,7 +1008,7 @@ pub fn parse_call(
Expression { Expression {
expr: Expr::Call(call), expr: Expr::Call(call),
span: span(spans), span: span(spans),
ty: Type::Unknown, // FIXME: calls should have known output types ty: Type::Any, // FIXME: calls should have known output types
custom_completion: None, custom_completion: None,
}, },
err, err,
@ -1615,7 +1615,7 @@ pub fn parse_variable_expr(
Expression { Expression {
expr: Expr::Var(nu_protocol::NU_VARIABLE_ID), expr: Expr::Var(nu_protocol::NU_VARIABLE_ID),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -1625,7 +1625,7 @@ pub fn parse_variable_expr(
Expression { Expression {
expr: Expr::Var(nu_protocol::IN_VARIABLE_ID), expr: Expr::Var(nu_protocol::IN_VARIABLE_ID),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -1635,7 +1635,7 @@ pub fn parse_variable_expr(
Expression { Expression {
expr: Expr::Var(nu_protocol::CONFIG_VARIABLE_ID), expr: Expr::Var(nu_protocol::CONFIG_VARIABLE_ID),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -1645,7 +1645,7 @@ pub fn parse_variable_expr(
Expression { Expression {
expr: Expr::Var(nu_protocol::ENV_VARIABLE_ID), expr: Expr::Var(nu_protocol::ENV_VARIABLE_ID),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -1782,7 +1782,7 @@ pub fn parse_full_cell_path(
Expression { Expression {
expr: Expr::Subexpression(block_id), expr: Expr::Subexpression(block_id),
span: head_span, span: head_span,
ty: Type::Unknown, // FIXME ty: Type::Any, // FIXME
custom_completion: None, custom_completion: None,
}, },
true, true,
@ -1819,7 +1819,7 @@ pub fn parse_full_cell_path(
Expression { Expression {
expr: Expr::Var(var_id), expr: Expr::Var(var_id),
span: Span::new(0, 0), span: Span::new(0, 0),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
false, false,
@ -1842,7 +1842,7 @@ pub fn parse_full_cell_path(
( (
Expression { Expression {
expr: Expr::FullCellPath(Box::new(FullCellPath { head, tail })), expr: Expr::FullCellPath(Box::new(FullCellPath { head, tail })),
ty: Type::Unknown, ty: Type::Any,
span: full_cell_span, span: full_cell_span,
custom_completion: None, custom_completion: None,
}, },
@ -2565,11 +2565,11 @@ pub fn parse_type(_working_set: &StateWorkingSet, bytes: &[u8]) -> Type {
b"date" => Type::Date, b"date" => Type::Date,
b"filesize" => Type::Filesize, b"filesize" => Type::Filesize,
b"number" => Type::Number, b"number" => Type::Number,
b"table" => Type::Table, b"table" => Type::Table(vec![]), //FIXME
b"error" => Type::Error, b"error" => Type::Error,
b"binary" => Type::Binary, b"binary" => Type::Binary,
_ => Type::Unknown, _ => Type::Any,
} }
} }
@ -2746,13 +2746,13 @@ pub fn parse_var_with_opt_type(
let id = working_set.add_variable( let id = working_set.add_variable(
bytes[0..(bytes.len() - 1)].to_vec(), bytes[0..(bytes.len() - 1)].to_vec(),
spans[*spans_idx], spans[*spans_idx],
Type::Unknown, Type::Any,
); );
( (
Expression { Expression {
expr: Expr::VarDecl(id), expr: Expr::VarDecl(id),
span: spans[*spans_idx], span: spans[*spans_idx],
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
Some(ParseError::MissingType(spans[*spans_idx])), Some(ParseError::MissingType(spans[*spans_idx])),
@ -2763,23 +2763,20 @@ pub fn parse_var_with_opt_type(
Expression { Expression {
expr: Expr::Var(CONFIG_VARIABLE_ID), expr: Expr::Var(CONFIG_VARIABLE_ID),
span: spans[*spans_idx], span: spans[*spans_idx],
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
) )
} else { } else {
let id = working_set.add_variable( let id =
bytes, working_set.add_variable(bytes, span(&spans[*spans_idx..*spans_idx + 1]), Type::Any);
span(&spans[*spans_idx..*spans_idx + 1]),
Type::Unknown,
);
( (
Expression { Expression {
expr: Expr::VarDecl(id), expr: Expr::VarDecl(id),
span: span(&spans[*spans_idx..*spans_idx + 1]), span: span(&spans[*spans_idx..*spans_idx + 1]),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -2812,7 +2809,7 @@ pub fn parse_row_condition(
spans: &[Span], spans: &[Span],
expand_aliases_denylist: &[usize], expand_aliases_denylist: &[usize],
) -> (Expression, Option<ParseError>) { ) -> (Expression, Option<ParseError>) {
let var_id = working_set.add_variable(b"$it".to_vec(), span(spans), Type::Unknown); let var_id = working_set.add_variable(b"$it".to_vec(), span(spans), Type::Any);
let (expression, err) = let (expression, err) =
parse_math_expression(working_set, spans, Some(var_id), expand_aliases_denylist); parse_math_expression(working_set, spans, Some(var_id), expand_aliases_denylist);
let span = span(spans); let span = span(spans);
@ -2973,7 +2970,7 @@ pub fn parse_signature_helper(
let long = String::from_utf8_lossy(&flags[0][2..]).to_string(); let long = String::from_utf8_lossy(&flags[0][2..]).to_string();
let variable_name = flags[0][2..].to_vec(); let variable_name = flags[0][2..].to_vec();
let var_id = let var_id =
working_set.add_variable(variable_name, span, Type::Unknown); working_set.add_variable(variable_name, span, Type::Any);
if flags.len() == 1 { if flags.len() == 1 {
args.push(Arg::Flag(Flag { args.push(Arg::Flag(Flag {
@ -3003,11 +3000,8 @@ pub fn parse_signature_helper(
let chars: Vec<char> = short_flag.chars().collect(); let chars: Vec<char> = short_flag.chars().collect();
let long = String::from_utf8_lossy(&flags[0][2..]).to_string(); let long = String::from_utf8_lossy(&flags[0][2..]).to_string();
let variable_name = flags[0][2..].to_vec(); let variable_name = flags[0][2..].to_vec();
let var_id = working_set.add_variable( let var_id =
variable_name, working_set.add_variable(variable_name, span, Type::Any);
span,
Type::Unknown,
);
if chars.len() == 1 { if chars.len() == 1 {
args.push(Arg::Flag(Flag { args.push(Arg::Flag(Flag {
@ -3042,7 +3036,7 @@ pub fn parse_signature_helper(
let len = chars[0].encode_utf8(&mut encoded_var_name).len(); let len = chars[0].encode_utf8(&mut encoded_var_name).len();
let variable_name = encoded_var_name[0..len].to_vec(); let variable_name = encoded_var_name[0..len].to_vec();
let var_id = let var_id =
working_set.add_variable(variable_name, span, Type::Unknown); working_set.add_variable(variable_name, span, Type::Any);
args.push(Arg::Flag(Flag { args.push(Arg::Flag(Flag {
arg: None, arg: None,
@ -3100,8 +3094,7 @@ pub fn parse_signature_helper(
let contents: Vec<_> = contents[..(contents.len() - 1)].into(); let contents: Vec<_> = contents[..(contents.len() - 1)].into();
let name = String::from_utf8_lossy(&contents).to_string(); let name = String::from_utf8_lossy(&contents).to_string();
let var_id = let var_id = working_set.add_variable(contents, span, Type::Any);
working_set.add_variable(contents, span, Type::Unknown);
// Positional arg, optional // Positional arg, optional
args.push(Arg::Positional( args.push(Arg::Positional(
@ -3119,7 +3112,7 @@ pub fn parse_signature_helper(
let contents_vec: Vec<u8> = contents.to_vec(); let contents_vec: Vec<u8> = contents.to_vec();
let var_id = let var_id =
working_set.add_variable(contents_vec, span, Type::Unknown); working_set.add_variable(contents_vec, span, Type::Any);
args.push(Arg::RestPositional(PositionalArg { args.push(Arg::RestPositional(PositionalArg {
desc: String::new(), desc: String::new(),
@ -3133,7 +3126,7 @@ pub fn parse_signature_helper(
let contents_vec = contents.to_vec(); let contents_vec = contents.to_vec();
let var_id = let var_id =
working_set.add_variable(contents_vec, span, Type::Unknown); working_set.add_variable(contents_vec, span, Type::Any);
// Positional arg, required // Positional arg, required
args.push(Arg::Positional( args.push(Arg::Positional(
@ -3200,7 +3193,7 @@ pub fn parse_signature_helper(
let var_id = var_id.expect("internal error: all custom parameters must have var_ids"); let var_id = var_id.expect("internal error: all custom parameters must have var_ids");
let var_type = &working_set.get_variable(var_id).ty; let var_type = &working_set.get_variable(var_id).ty;
match var_type { match var_type {
Type::Unknown => { Type::Any => {
working_set.set_variable_type( working_set.set_variable_type(
var_id, var_id,
expression.ty.clone(), expression.ty.clone(),
@ -3248,7 +3241,7 @@ pub fn parse_signature_helper(
// Flags with a boolean type are just present/not-present switches // Flags with a boolean type are just present/not-present switches
if var_type != &Type::Bool { if var_type != &Type::Bool {
match var_type { match var_type {
Type::Unknown => { Type::Any => {
*arg = Some(expression_ty.to_shape()); *arg = Some(expression_ty.to_shape());
working_set working_set
.set_variable_type(var_id, expression_ty); .set_variable_type(var_id, expression_ty);
@ -3403,7 +3396,7 @@ pub fn parse_list_expression(
if let Some(ref ctype) = contained_type { if let Some(ref ctype) = contained_type {
if *ctype != arg.ty { if *ctype != arg.ty {
contained_type = Some(Type::Unknown); contained_type = Some(Type::Any);
} }
} else { } else {
contained_type = Some(arg.ty.clone()); contained_type = Some(arg.ty.clone());
@ -3423,7 +3416,7 @@ pub fn parse_list_expression(
ty: Type::List(Box::new(if let Some(ty) = contained_type { ty: Type::List(Box::new(if let Some(ty) = contained_type {
ty ty
} else { } else {
Type::Unknown Type::Any
})), })),
custom_completion: None, custom_completion: None,
}, },
@ -3466,7 +3459,7 @@ pub fn parse_table_expression(
Expression { Expression {
expr: Expr::List(vec![]), expr: Expr::List(vec![]),
span: original_span, span: original_span,
ty: Type::List(Box::new(Type::Unknown)), ty: Type::List(Box::new(Type::Any)),
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -3538,7 +3531,7 @@ pub fn parse_table_expression(
Expression { Expression {
expr: Expr::Table(table_headers, rows), expr: Expr::Table(table_headers, rows),
span: original_span, span: original_span,
ty: Type::Table, ty: Type::Table(vec![]), //FIXME
custom_completion: None, custom_completion: None,
}, },
error, error,
@ -3995,7 +3988,7 @@ pub fn parse_operator(
Expression { Expression {
expr: Expr::Operator(operator), expr: Expr::Operator(operator),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
None, None,
@ -4403,7 +4396,7 @@ pub fn parse_expression(
Expression { Expression {
expr: Expr::List(env_vars), expr: Expr::List(env_vars),
span: span(&spans[..pos]), span: span(&spans[..pos]),
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}, },
Expression { Expression {
@ -4428,7 +4421,7 @@ pub fn parse_expression(
expr, expr,
custom_completion: None, custom_completion: None,
span: span(spans), span: span(spans),
ty: Type::Unknown, ty: Type::Any,
}, },
err, err,
) )
@ -4575,7 +4568,7 @@ pub fn parse_record(
Expression { Expression {
expr: Expr::Record(output), expr: Expr::Record(output),
span, span,
ty: Type::Unknown, //FIXME: but we don't know the contents of the fields, do we? ty: Type::Any, //FIXME: but we don't know the contents of the fields, do we?
custom_completion: None, custom_completion: None,
}, },
error, error,
@ -4989,7 +4982,7 @@ fn wrap_expr_with_collect(working_set: &mut StateWorkingSet, expr: &Expression)
output.push(Expression { output.push(Expression {
expr: Expr::Block(block_id), expr: Expr::Block(block_id),
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
}); });

View File

@ -10,8 +10,8 @@ pub fn type_compatible(lhs: &Type, rhs: &Type) -> bool {
(Type::List(c), Type::List(d)) => type_compatible(c, d), (Type::List(c), Type::List(d)) => type_compatible(c, d),
(Type::Number, Type::Int) => true, (Type::Number, Type::Int) => true,
(Type::Number, Type::Float) => true, (Type::Number, Type::Float) => true,
(Type::Unknown, _) => true, (Type::Any, _) => true,
(_, Type::Unknown) => true, (_, Type::Any) => true,
(lhs, rhs) => lhs == rhs, (lhs, rhs) => lhs == rhs,
} }
} }
@ -35,13 +35,13 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Duration, None), (Type::Duration, Type::Duration) => (Type::Duration, None),
(Type::Filesize, Type::Filesize) => (Type::Filesize, None), (Type::Filesize, Type::Filesize) => (Type::Filesize, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
(Type::Int, _) => { (Type::Int, _) => {
let ty = rhs.ty.clone(); let ty = rhs.ty.clone();
*rhs = Expression::garbage(rhs.span); *rhs = Expression::garbage(rhs.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -54,7 +54,7 @@ pub fn math_result_type(
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -74,12 +74,12 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Duration, None), (Type::Duration, Type::Duration) => (Type::Duration, None),
(Type::Filesize, Type::Filesize) => (Type::Filesize, None), (Type::Filesize, Type::Filesize) => (Type::Filesize, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -101,12 +101,12 @@ pub fn math_result_type(
(Type::Duration, Type::Int) => (Type::Filesize, None), (Type::Duration, Type::Int) => (Type::Filesize, None),
(Type::Int, Type::Duration) => (Type::Filesize, None), (Type::Int, Type::Duration) => (Type::Filesize, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -123,12 +123,12 @@ pub fn math_result_type(
(Type::Int, Type::Float) => (Type::Float, None), (Type::Int, Type::Float) => (Type::Float, None),
(Type::Float, Type::Float) => (Type::Float, None), (Type::Float, Type::Float) => (Type::Float, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -150,12 +150,12 @@ pub fn math_result_type(
(Type::Filesize, Type::Int) => (Type::Filesize, None), (Type::Filesize, Type::Int) => (Type::Filesize, None),
(Type::Duration, Type::Int) => (Type::Duration, None), (Type::Duration, Type::Int) => (Type::Duration, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -169,12 +169,12 @@ pub fn math_result_type(
Operator::And | Operator::Or => match (&lhs.ty, &rhs.ty) { Operator::And | Operator::Or => match (&lhs.ty, &rhs.ty) {
(Type::Bool, Type::Bool) => (Type::Bool, None), (Type::Bool, Type::Bool) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Unknown, None), (Type::Any, _) => (Type::Any, None),
(_, Type::Unknown) => (Type::Unknown, None), (_, Type::Any) => (Type::Any, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -193,12 +193,12 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Bool, None), (Type::Duration, Type::Duration) => (Type::Bool, None),
(Type::Filesize, Type::Filesize) => (Type::Bool, None), (Type::Filesize, Type::Filesize) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -217,12 +217,12 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Bool, None), (Type::Duration, Type::Duration) => (Type::Bool, None),
(Type::Filesize, Type::Filesize) => (Type::Bool, None), (Type::Filesize, Type::Filesize) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -241,12 +241,12 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Bool, None), (Type::Duration, Type::Duration) => (Type::Bool, None),
(Type::Filesize, Type::Filesize) => (Type::Bool, None), (Type::Filesize, Type::Filesize) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -265,12 +265,12 @@ pub fn math_result_type(
(Type::Duration, Type::Duration) => (Type::Bool, None), (Type::Duration, Type::Duration) => (Type::Bool, None),
(Type::Filesize, Type::Filesize) => (Type::Bool, None), (Type::Filesize, Type::Filesize) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -285,12 +285,12 @@ pub fn math_result_type(
Operator::NotEqual => (Type::Bool, None), Operator::NotEqual => (Type::Bool, None),
Operator::Contains => match (&lhs.ty, &rhs.ty) { Operator::Contains => match (&lhs.ty, &rhs.ty) {
(Type::String, Type::String) => (Type::Bool, None), (Type::String, Type::String) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -303,12 +303,12 @@ pub fn math_result_type(
}, },
Operator::NotContains => match (&lhs.ty, &rhs.ty) { Operator::NotContains => match (&lhs.ty, &rhs.ty) {
(Type::String, Type::String) => (Type::Bool, None), (Type::String, Type::String) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -321,12 +321,12 @@ pub fn math_result_type(
}, },
Operator::StartsWith => match (&lhs.ty, &rhs.ty) { Operator::StartsWith => match (&lhs.ty, &rhs.ty) {
(Type::String, Type::String) => (Type::Bool, None), (Type::String, Type::String) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -343,12 +343,12 @@ pub fn math_result_type(
(Type::String, Type::String) => (Type::Bool, None), (Type::String, Type::String) => (Type::Bool, None),
(Type::String, Type::Record(_)) => (Type::Bool, None), (Type::String, Type::Record(_)) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -365,12 +365,12 @@ pub fn math_result_type(
(Type::String, Type::String) => (Type::Bool, None), (Type::String, Type::String) => (Type::Bool, None),
(Type::String, Type::Record(_)) => (Type::Bool, None), (Type::String, Type::Record(_)) => (Type::Bool, None),
(Type::Unknown, _) => (Type::Bool, None), (Type::Any, _) => (Type::Bool, None),
(_, Type::Unknown) => (Type::Bool, None), (_, Type::Any) => (Type::Bool, None),
_ => { _ => {
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::UnsupportedOperation( Some(ParseError::UnsupportedOperation(
op.span, op.span,
lhs.span, lhs.span,
@ -386,7 +386,7 @@ pub fn math_result_type(
*op = Expression::garbage(op.span); *op = Expression::garbage(op.span);
( (
Type::Unknown, Type::Any,
Some(ParseError::IncompleteMathExpression(op.span)), Some(ParseError::IncompleteMathExpression(op.span)),
) )
} }

View File

@ -18,7 +18,7 @@ impl Expression {
Expression { Expression {
expr: Expr::Garbage, expr: Expr::Garbage,
span, span,
ty: Type::Unknown, ty: Type::Any,
custom_completion: None, custom_completion: None,
} }
} }

View File

@ -192,11 +192,11 @@ impl EngineState {
files: im::vector![], files: im::vector![],
file_contents: im::vector![], file_contents: im::vector![],
vars: im::vector![ vars: im::vector![
Variable::new(Span::new(0, 0), Type::Unknown), Variable::new(Span::new(0, 0), Type::Any),
Variable::new(Span::new(0, 0), Type::Unknown), Variable::new(Span::new(0, 0), Type::Any),
Variable::new(Span::new(0, 0), Type::Unknown), Variable::new(Span::new(0, 0), Type::Any),
Variable::new(Span::new(0, 0), Type::Unknown), Variable::new(Span::new(0, 0), Type::Any),
Variable::new(Span::new(0, 0), Type::Unknown) Variable::new(Span::new(0, 0), Type::Any)
], ],
decls: im::vector![], decls: im::vector![],
aliases: im::vector![], aliases: im::vector![],

View File

@ -96,37 +96,37 @@ pub enum SyntaxShape {
impl SyntaxShape { impl SyntaxShape {
pub fn to_type(&self) -> Type { pub fn to_type(&self) -> Type {
match self { match self {
SyntaxShape::Any => Type::Unknown, SyntaxShape::Any => Type::Any,
SyntaxShape::Block(_) => Type::Block, SyntaxShape::Block(_) => Type::Block,
SyntaxShape::Binary => Type::Binary, SyntaxShape::Binary => Type::Binary,
SyntaxShape::CellPath => Type::Unknown, SyntaxShape::CellPath => Type::Any,
SyntaxShape::Custom(custom, _) => custom.to_type(), SyntaxShape::Custom(custom, _) => custom.to_type(),
SyntaxShape::DateTime => Type::Date, SyntaxShape::DateTime => Type::Date,
SyntaxShape::Duration => Type::Duration, SyntaxShape::Duration => Type::Duration,
SyntaxShape::Expression => Type::Unknown, SyntaxShape::Expression => Type::Any,
SyntaxShape::Filepath => Type::String, SyntaxShape::Filepath => Type::String,
SyntaxShape::Filesize => Type::Filesize, SyntaxShape::Filesize => Type::Filesize,
SyntaxShape::FullCellPath => Type::Unknown, SyntaxShape::FullCellPath => Type::Any,
SyntaxShape::GlobPattern => Type::String, SyntaxShape::GlobPattern => Type::String,
SyntaxShape::ImportPattern => Type::Unknown, SyntaxShape::ImportPattern => Type::Any,
SyntaxShape::Int => Type::Int, SyntaxShape::Int => Type::Int,
SyntaxShape::List(x) => { SyntaxShape::List(x) => {
let contents = x.to_type(); let contents = x.to_type();
Type::List(Box::new(contents)) Type::List(Box::new(contents))
} }
SyntaxShape::Keyword(_, expr) => expr.to_type(), SyntaxShape::Keyword(_, expr) => expr.to_type(),
SyntaxShape::MathExpression => Type::Unknown, SyntaxShape::MathExpression => Type::Any,
SyntaxShape::Number => Type::Number, SyntaxShape::Number => Type::Number,
SyntaxShape::Operator => Type::Unknown, SyntaxShape::Operator => Type::Any,
SyntaxShape::Range => Type::Unknown, SyntaxShape::Range => Type::Any,
SyntaxShape::Record => Type::Record(vec![]), // FIXME: Add actual record type SyntaxShape::Record => Type::Record(vec![]), // FIXME: Add actual record type
SyntaxShape::RowCondition => Type::Bool, SyntaxShape::RowCondition => Type::Bool,
SyntaxShape::Boolean => Type::Bool, SyntaxShape::Boolean => Type::Bool,
SyntaxShape::Signature => Type::Signature, SyntaxShape::Signature => Type::Signature,
SyntaxShape::String => Type::String, SyntaxShape::String => Type::String,
SyntaxShape::Table => Type::List(Box::new(Type::Unknown)), // FIXME: Tables should have better types SyntaxShape::Table => Type::List(Box::new(Type::Any)), // FIXME: Tables should have better types
SyntaxShape::VarWithOptType => Type::Unknown, SyntaxShape::VarWithOptType => Type::Any,
SyntaxShape::Variable => Type::Unknown, SyntaxShape::Variable => Type::Any,
} }
} }
} }

View File

@ -20,9 +20,9 @@ pub enum Type {
Number, Number,
Nothing, Nothing,
Record(Vec<(String, Type)>), Record(Vec<(String, Type)>),
Table, Table(Vec<(String, Type)>),
ListStream, ListStream,
Unknown, Any,
Error, Error,
Binary, Binary,
Custom, Custom,
@ -46,9 +46,9 @@ impl Type {
Type::Number => SyntaxShape::Number, Type::Number => SyntaxShape::Number,
Type::Nothing => SyntaxShape::Any, Type::Nothing => SyntaxShape::Any,
Type::Record(_) => SyntaxShape::Record, Type::Record(_) => SyntaxShape::Record,
Type::Table => SyntaxShape::Table, Type::Table(_) => SyntaxShape::Table,
Type::ListStream => SyntaxShape::List(Box::new(SyntaxShape::Any)), Type::ListStream => SyntaxShape::List(Box::new(SyntaxShape::Any)),
Type::Unknown => SyntaxShape::Any, Type::Any => SyntaxShape::Any,
Type::Error => SyntaxShape::Any, Type::Error => SyntaxShape::Any,
Type::Binary => SyntaxShape::Binary, Type::Binary => SyntaxShape::Binary,
Type::Custom => SyntaxShape::Any, Type::Custom => SyntaxShape::Any,
@ -78,13 +78,21 @@ impl Display for Type {
.collect::<Vec<String>>() .collect::<Vec<String>>()
.join(", "), .join(", "),
), ),
Type::Table => write!(f, "table"), Type::Table(columns) => write!(
f,
"table<{}>",
columns
.iter()
.map(|(x, y)| format!("{}: {}", x, y))
.collect::<Vec<String>>()
.join(", ")
),
Type::List(l) => write!(f, "list<{}>", l), Type::List(l) => write!(f, "list<{}>", l),
Type::Nothing => write!(f, "nothing"), Type::Nothing => write!(f, "nothing"),
Type::Number => write!(f, "number"), Type::Number => write!(f, "number"),
Type::String => write!(f, "string"), Type::String => write!(f, "string"),
Type::ListStream => write!(f, "list stream"), Type::ListStream => write!(f, "list stream"),
Type::Unknown => write!(f, "unknown"), Type::Any => write!(f, "any"),
Type::Error => write!(f, "error"), Type::Error => write!(f, "error"),
Type::Binary => write!(f, "binary"), Type::Binary => write!(f, "binary"),
Type::Custom => write!(f, "custom"), Type::Custom => write!(f, "custom"),

View File

@ -378,7 +378,26 @@ impl Value {
.map(|(x, y)| (x.clone(), y.get_type())) .map(|(x, y)| (x.clone(), y.get_type()))
.collect(), .collect(),
), ),
Value::List { .. } => Type::List(Box::new(Type::Unknown)), // FIXME Value::List { vals, .. } => {
let mut ty = None;
for val in vals {
let val_ty = val.get_type();
match &ty {
Some(x) => {
if &val_ty != x {
ty = Some(Type::Any)
}
}
None => ty = Some(val_ty),
}
}
match ty {
Some(Type::Record(columns)) => Type::Table(columns),
Some(ty) => Type::List(Box::new(ty)),
None => Type::List(Box::new(ty.unwrap_or(Type::Any))),
}
}
Value::Nothing { .. } => Type::Nothing, Value::Nothing { .. } => Type::Nothing,
Value::Block { .. } => Type::Block, Value::Block { .. } => Type::Block,
Value::Error { .. } => Type::Error, Value::Error { .. } => Type::Error,
@ -1735,8 +1754,8 @@ impl Value {
} }
if !type_compatible(self.get_type(), rhs.get_type()) if !type_compatible(self.get_type(), rhs.get_type())
&& (self.get_type() != Type::Unknown) && (self.get_type() != Type::Any)
&& (rhs.get_type() != Type::Unknown) && (rhs.get_type() != Type::Any)
{ {
return Err(ShellError::TypeMismatch("compatible type".to_string(), op)); return Err(ShellError::TypeMismatch("compatible type".to_string(), op));
} }
@ -1763,8 +1782,8 @@ impl Value {
} }
if !type_compatible(self.get_type(), rhs.get_type()) if !type_compatible(self.get_type(), rhs.get_type())
&& (self.get_type() != Type::Unknown) && (self.get_type() != Type::Any)
&& (rhs.get_type() != Type::Unknown) && (rhs.get_type() != Type::Any)
{ {
return Err(ShellError::TypeMismatch("compatible type".to_string(), op)); return Err(ShellError::TypeMismatch("compatible type".to_string(), op));
} }
@ -1791,8 +1810,8 @@ impl Value {
} }
if !type_compatible(self.get_type(), rhs.get_type()) if !type_compatible(self.get_type(), rhs.get_type())
&& (self.get_type() != Type::Unknown) && (self.get_type() != Type::Any)
&& (rhs.get_type() != Type::Unknown) && (rhs.get_type() != Type::Any)
{ {
return Err(ShellError::TypeMismatch("compatible type".to_string(), op)); return Err(ShellError::TypeMismatch("compatible type".to_string(), op));
} }
@ -1819,8 +1838,8 @@ impl Value {
} }
if !type_compatible(self.get_type(), rhs.get_type()) if !type_compatible(self.get_type(), rhs.get_type())
&& (self.get_type() != Type::Unknown) && (self.get_type() != Type::Any)
&& (rhs.get_type() != Type::Unknown) && (rhs.get_type() != Type::Any)
{ {
return Err(ShellError::TypeMismatch("compatible type".to_string(), op)); return Err(ShellError::TypeMismatch("compatible type".to_string(), op));
} }