forked from extern/nushell
add dedicated const in pipeline
, const builtin var
errors (#7784)
# Description Currently `let` and `const` share error handling, and this might lead to confusing error messages ![sJan17-51](https://user-images.githubusercontent.com/98623181/212981108-c80b3e55-cece-4ee5-ba8f-cb5dcfdf63e0.png) This PR adds dedicated errors to `const`
This commit is contained in:
parent
2982a2c963
commit
0fe2884397
@ -128,6 +128,16 @@ pub enum ParseError {
|
|||||||
)]
|
)]
|
||||||
LetInPipeline(String, String, #[label("let in pipeline")] Span),
|
LetInPipeline(String, String, #[label("let in pipeline")] Span),
|
||||||
|
|
||||||
|
#[error("Const statement used in pipeline.")]
|
||||||
|
#[diagnostic(
|
||||||
|
code(nu::parser::unexpected_keyword),
|
||||||
|
url(docsrs),
|
||||||
|
help(
|
||||||
|
"Assigning '{0}' to '{1}' does not produce a value to be piped. If the pipeline result is meant to be assigned to '{1}', use 'const {1} = ({0} | ...)'."
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
ConstInPipeline(String, String, #[label("const in pipeline")] Span),
|
||||||
|
|
||||||
#[error("Mut statement used in pipeline.")]
|
#[error("Mut statement used in pipeline.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
code(nu::parser::unexpected_keyword),
|
code(nu::parser::unexpected_keyword),
|
||||||
@ -136,7 +146,7 @@ pub enum ParseError {
|
|||||||
"Assigning '{0}' to '{1}' does not produce a value to be piped. If the pipeline result is meant to be assigned to '{1}', use 'mut {1} = ({0} | ...)'."
|
"Assigning '{0}' to '{1}' does not produce a value to be piped. If the pipeline result is meant to be assigned to '{1}', use 'mut {1} = ({0} | ...)'."
|
||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
MutInPipeline(String, String, #[label("let in pipeline")] Span),
|
MutInPipeline(String, String, #[label("mut in pipeline")] Span),
|
||||||
|
|
||||||
#[error("Let used with builtin variable name.")]
|
#[error("Let used with builtin variable name.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
@ -146,6 +156,14 @@ pub enum ParseError {
|
|||||||
)]
|
)]
|
||||||
LetBuiltinVar(String, #[label("already a builtin variable")] Span),
|
LetBuiltinVar(String, #[label("already a builtin variable")] Span),
|
||||||
|
|
||||||
|
#[error("Const used with builtin variable name.")]
|
||||||
|
#[diagnostic(
|
||||||
|
code(nu::parser::let_builtin_var),
|
||||||
|
url(docsrs),
|
||||||
|
help("'{0}' is the name of a builtin Nushell variable. `const` cannot assign to it.")
|
||||||
|
)]
|
||||||
|
ConstBuiltinVar(String, #[label("already a builtin variable")] Span),
|
||||||
|
|
||||||
#[error("Mut used with builtin variable name.")]
|
#[error("Mut used with builtin variable name.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
code(nu::parser::let_builtin_var),
|
code(nu::parser::let_builtin_var),
|
||||||
@ -420,8 +438,10 @@ impl ParseError {
|
|||||||
ParseError::BuiltinCommandInPipeline(_, s) => *s,
|
ParseError::BuiltinCommandInPipeline(_, s) => *s,
|
||||||
ParseError::LetInPipeline(_, _, s) => *s,
|
ParseError::LetInPipeline(_, _, s) => *s,
|
||||||
ParseError::MutInPipeline(_, _, s) => *s,
|
ParseError::MutInPipeline(_, _, s) => *s,
|
||||||
|
ParseError::ConstInPipeline(_, _, s) => *s,
|
||||||
ParseError::LetBuiltinVar(_, s) => *s,
|
ParseError::LetBuiltinVar(_, s) => *s,
|
||||||
ParseError::MutBuiltinVar(_, s) => *s,
|
ParseError::MutBuiltinVar(_, s) => *s,
|
||||||
|
ParseError::ConstBuiltinVar(_, s) => *s,
|
||||||
ParseError::CaptureOfMutableVar(s) => *s,
|
ParseError::CaptureOfMutableVar(s) => *s,
|
||||||
ParseError::IncorrectValue(_, s, _) => *s,
|
ParseError::IncorrectValue(_, s, _) => *s,
|
||||||
ParseError::MultipleRestParams(s) => *s,
|
ParseError::MultipleRestParams(s) => *s,
|
||||||
|
@ -2842,8 +2842,11 @@ pub fn parse_let_or_const(
|
|||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
if ["in", "nu", "env", "nothing"].contains(&var_name.as_str()) {
|
if ["in", "nu", "env", "nothing"].contains(&var_name.as_str()) {
|
||||||
error =
|
error = if is_const {
|
||||||
error.or(Some(ParseError::LetBuiltinVar(var_name, lvalue.span)));
|
error.or(Some(ParseError::ConstBuiltinVar(var_name, lvalue.span)))
|
||||||
|
} else {
|
||||||
|
error.or(Some(ParseError::LetBuiltinVar(var_name, lvalue.span)))
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let var_id = lvalue.as_var();
|
let var_id = lvalue.as_var();
|
||||||
|
@ -5001,7 +5001,7 @@ pub fn parse_expression(
|
|||||||
.0,
|
.0,
|
||||||
Some(ParseError::BuiltinCommandInPipeline("for".into(), spans[0])),
|
Some(ParseError::BuiltinCommandInPipeline("for".into(), spans[0])),
|
||||||
),
|
),
|
||||||
b"let" | b"const" => (
|
b"let" => (
|
||||||
parse_call(
|
parse_call(
|
||||||
working_set,
|
working_set,
|
||||||
&spans[pos..],
|
&spans[pos..],
|
||||||
@ -5024,6 +5024,29 @@ pub fn parse_expression(
|
|||||||
spans[0],
|
spans[0],
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
|
b"const" => (
|
||||||
|
parse_call(
|
||||||
|
working_set,
|
||||||
|
&spans[pos..],
|
||||||
|
spans[0],
|
||||||
|
expand_aliases_denylist,
|
||||||
|
is_subexpression,
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
Some(ParseError::ConstInPipeline(
|
||||||
|
String::from_utf8_lossy(match spans.len() {
|
||||||
|
1 | 2 | 3 => b"value",
|
||||||
|
_ => working_set.get_span_contents(spans[3]),
|
||||||
|
})
|
||||||
|
.to_string(),
|
||||||
|
String::from_utf8_lossy(match spans.len() {
|
||||||
|
1 => b"variable",
|
||||||
|
_ => working_set.get_span_contents(spans[1]),
|
||||||
|
})
|
||||||
|
.to_string(),
|
||||||
|
spans[0],
|
||||||
|
)),
|
||||||
|
),
|
||||||
b"mut" => (
|
b"mut" => (
|
||||||
parse_call(
|
parse_call(
|
||||||
working_set,
|
working_set,
|
||||||
|
Loading…
Reference in New Issue
Block a user