Add some improvements to errors

This commit is contained in:
JT
2021-09-21 16:03:06 +12:00
parent e5aa8b9d3f
commit 4841d62d76
6 changed files with 65 additions and 26 deletions

View File

@ -78,9 +78,9 @@ pub enum ParseError {
#[diagnostic(code(nu::parser::non_utf8), url(docsrs))]
NonUtf8(#[label = "non-UTF8 code"] Span),
#[error("Unknown flag.")]
#[error("The `{0}` command doesn't have flag `{1}`.")]
#[diagnostic(code(nu::parser::unknown_flag), url(docsrs))]
UnknownFlag(#[label = "unknown flag"] Span),
UnknownFlag(String, String, #[label = "unknown flag"] Span),
#[error("Unknown type.")]
#[diagnostic(code(nu::parser::unknown_type), url(docsrs))]

View File

@ -160,9 +160,13 @@ fn parse_long_flag(
}
} else {
(
Some(long_name),
Some(long_name.clone()),
None,
Some(ParseError::UnknownFlag(arg_span)),
Some(ParseError::UnknownFlag(
sig.name.clone(),
long_name.clone(),
arg_span,
)),
)
}
} else {
@ -214,17 +218,45 @@ fn parse_short_flags(
if String::from_utf8_lossy(arg_contents).parse::<f64>().is_ok() {
return (None, None);
} else if let Some(first) = unmatched_short_flags.first() {
error = error.or(Some(ParseError::UnknownFlag(*first)));
let contents = working_set.get_span_contents(*first);
error = error.or_else(|| {
Some(ParseError::UnknownFlag(
sig.name.clone(),
format!("-{}", String::from_utf8_lossy(contents).to_string()),
*first,
))
});
}
} else if let Some(first) = unmatched_short_flags.first() {
error = error.or(Some(ParseError::UnknownFlag(*first)));
let contents = working_set.get_span_contents(*first);
error = error.or_else(|| {
Some(ParseError::UnknownFlag(
sig.name.clone(),
format!("-{}", String::from_utf8_lossy(contents).to_string()),
*first,
))
});
}
} else if let Some(first) = unmatched_short_flags.first() {
error = error.or(Some(ParseError::UnknownFlag(*first)));
let contents = working_set.get_span_contents(*first);
error = error.or_else(|| {
Some(ParseError::UnknownFlag(
sig.name.clone(),
format!("-{}", String::from_utf8_lossy(contents).to_string()),
*first,
))
});
}
} else if !unmatched_short_flags.is_empty() {
if let Some(first) = unmatched_short_flags.first() {
error = error.or(Some(ParseError::UnknownFlag(*first)));
let contents = working_set.get_span_contents(*first);
error = error.or_else(|| {
Some(ParseError::UnknownFlag(
sig.name.clone(),
format!("-{}", String::from_utf8_lossy(contents).to_string()),
*first,
))
});
}
}

View File

@ -32,6 +32,7 @@ pub fn math_result_type(
(Type::Unknown, _) => (Type::Unknown, None),
(_, Type::Unknown) => (Type::Unknown, None),
(Type::Int, _) => {
let ty = rhs.ty.clone();
*rhs = Expression::garbage(rhs.span);
(
Type::Unknown,
@ -40,7 +41,7 @@ pub fn math_result_type(
lhs.span,
lhs.ty.clone(),
rhs.span,
rhs.ty.clone(),
ty,
)),
)
}

View File

@ -574,14 +574,25 @@ impl<'a> miette::SourceCode for &StateWorkingSet<'a> {
let content_span = span_contents.span();
// Back to "global" indexing
let retranslated = (content_span.offset() + start, content_span.len()).into();
return Ok(Box::new(miette::MietteSpanContents::new_named(
filename.clone(),
span_contents.data(),
retranslated,
span_contents.line(),
span_contents.column(),
span_contents.line_count(),
)));
if filename == "<cli>" {
return Ok(Box::new(miette::MietteSpanContents::new(
span_contents.data(),
retranslated,
span_contents.line(),
span_contents.column(),
span_contents.line_count(),
)));
} else {
return Ok(Box::new(miette::MietteSpanContents::new_named(
filename.clone(),
span_contents.data(),
retranslated,
span_contents.line(),
span_contents.column(),
span_contents.line_count(),
)));
}
}
}
Err(miette::MietteError::OutOfBounds)