make compile errors for assignment more like the shell errors
This commit is contained in:
parent
fab24f8e75
commit
21f132be9f
|
@ -113,7 +113,7 @@ pub(crate) fn compile_assignment(
|
||||||
Expr::Var(var_id) => {
|
Expr::Var(var_id) => {
|
||||||
// Double check that the variable is supposed to be mutable
|
// Double check that the variable is supposed to be mutable
|
||||||
if !working_set.get_variable(var_id).mutable {
|
if !working_set.get_variable(var_id).mutable {
|
||||||
return Err(CompileError::ModifyImmutableVariable { span: lhs.span });
|
return Err(CompileError::AssignmentRequiresMutableVar { span: lhs.span });
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.push(
|
builder.push(
|
||||||
|
@ -135,7 +135,7 @@ pub(crate) fn compile_assignment(
|
||||||
) if *var_id == ENV_VARIABLE_ID => {
|
) if *var_id == ENV_VARIABLE_ID => {
|
||||||
// This will be an assignment to an environment variable.
|
// This will be an assignment to an environment variable.
|
||||||
let Some(PathMember::String { val: key, .. }) = path.tail.first() else {
|
let Some(PathMember::String { val: key, .. }) = path.tail.first() else {
|
||||||
return Err(CompileError::InvalidLhsForAssignment { span: lhs.span });
|
return Err(CompileError::CannotReplaceEnv { span: lhs.span });
|
||||||
};
|
};
|
||||||
|
|
||||||
let key_data = builder.data(key)?;
|
let key_data = builder.data(key)?;
|
||||||
|
@ -225,7 +225,7 @@ pub(crate) fn compile_assignment(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Expr::Garbage => Err(CompileError::Garbage { span: lhs.span }),
|
Expr::Garbage => Err(CompileError::Garbage { span: lhs.span }),
|
||||||
_ => Err(CompileError::InvalidLhsForAssignment { span: lhs.span }),
|
_ => Err(CompileError::AssignmentRequiresVar { span: lhs.span }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,23 +107,33 @@ pub enum CompileError {
|
||||||
span: Span,
|
span: Span,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[error("Invalid left-hand side for assignment.")]
|
#[error("Assignment operations require a variable.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
code(nu::compile::invalid_lhs_for_assignment),
|
code(nu::compile::assignment_requires_variable),
|
||||||
help("try assigning to a variable, environment variable, or sub-path of either")
|
help("try assigning to a variable or a cell path of a variable")
|
||||||
)]
|
)]
|
||||||
InvalidLhsForAssignment {
|
AssignmentRequiresVar {
|
||||||
#[label("this is not an assignable expression")]
|
#[label("needs to be a variable")]
|
||||||
span: Span,
|
span: Span,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[error("Attempted to modify immutable variable.")]
|
#[error("Attempted to modify immutable variable.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
code(nu::compile::modify_immutable_variable),
|
code(nu::compile::assignment_requires_mutable_variable),
|
||||||
help("declare the variable with `mut`, or shadow it again with `let`")
|
help("declare the variable with `mut`, or shadow it again with `let`")
|
||||||
)]
|
)]
|
||||||
ModifyImmutableVariable {
|
AssignmentRequiresMutableVar {
|
||||||
#[label("this variable was not declared as mutable")]
|
#[label("needs to be a mutable variable")]
|
||||||
|
span: Span,
|
||||||
|
},
|
||||||
|
|
||||||
|
#[error("Cannot replace environment.")]
|
||||||
|
#[diagnostic(
|
||||||
|
code(nu::compile::cannot_replace_env),
|
||||||
|
help("Assigning a value to '$env' is not allowed.")
|
||||||
|
)]
|
||||||
|
CannotReplaceEnv {
|
||||||
|
#[label("setting '$env' not allowed")]
|
||||||
span: Span,
|
span: Span,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user