Add check for duplicate variable definition (fixes #320)
This commit is contained in:
parent
eba1c032ae
commit
e1d9e5cfff
3 changed files with 25 additions and 2 deletions
|
@ -9,6 +9,7 @@ use simplexpr::SimplExpr;
|
|||
use super::{
|
||||
file_provider::{FilesError, YuckFiles},
|
||||
script_var_definition::ScriptVarDefinition,
|
||||
validate::ValidationError,
|
||||
var_definition::VarDefinition,
|
||||
widget_definition::WidgetDefinition,
|
||||
widget_use::WidgetUse,
|
||||
|
@ -91,11 +92,25 @@ impl Config {
|
|||
fn append_toplevel(&mut self, files: &mut YuckFiles, toplevel: TopLevel) -> AstResult<()> {
|
||||
match toplevel {
|
||||
TopLevel::VarDefinition(x) => {
|
||||
if self.var_definitions.contains_key(&x.name) || self.script_vars.contains_key(&x.name) {
|
||||
return Err(AstError::ValidationError(ValidationError::VariableDefinedTwice {
|
||||
name: x.name.clone(),
|
||||
span: x.span,
|
||||
}));
|
||||
} else {
|
||||
self.var_definitions.insert(x.name.clone(), x);
|
||||
}
|
||||
}
|
||||
TopLevel::ScriptVarDefinition(x) => {
|
||||
if self.var_definitions.contains_key(x.name()) || self.script_vars.contains_key(x.name()) {
|
||||
return Err(AstError::ValidationError(ValidationError::VariableDefinedTwice {
|
||||
name: x.name().clone(),
|
||||
span: x.name_span(),
|
||||
}));
|
||||
} else {
|
||||
self.script_vars.insert(x.name().clone(), x);
|
||||
}
|
||||
}
|
||||
TopLevel::WidgetDefinition(x) => {
|
||||
self.widget_definitions.insert(x.name.clone(), x);
|
||||
}
|
||||
|
|
|
@ -32,12 +32,16 @@ pub enum ValidationError {
|
|||
/// True if the error occurred inside a widget definition, false if it occurred in a window definition
|
||||
in_definition: bool,
|
||||
},
|
||||
|
||||
#[error("Variable named `{name}` defined twice")]
|
||||
VariableDefinedTwice { span: Span, name: VarName },
|
||||
}
|
||||
|
||||
impl Spanned for ValidationError {
|
||||
fn span(&self) -> Span {
|
||||
match self {
|
||||
ValidationError::UnknownWidget(span, _) => *span,
|
||||
ValidationError::VariableDefinedTwice { span, .. } => *span,
|
||||
ValidationError::MissingAttr { use_span, .. } => *use_span,
|
||||
ValidationError::UnknownVariable { span, .. } => *span,
|
||||
ValidationError::AccidentalBuiltinOverride(span, ..) => *span,
|
||||
|
|
|
@ -199,6 +199,10 @@ impl ToDiagnostic for ValidationError {
|
|||
label = span => "Defined here",
|
||||
note = "Hint: Give your widget a different name. You could call it \"John\" for example. That's a cool name."
|
||||
},
|
||||
ValidationError::VariableDefinedTwice { span, name } => gen_diagnostic! {
|
||||
msg = self,
|
||||
label = span => "Defined again here"
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue