Skip to content

Commit 4db8132

Browse files
committed
fix(semantic): disallow decleration of variables in for updater
1 parent a521967 commit 4db8132

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

src/semantic/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,11 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
308308
analyze(rhs, state)
309309
}
310310
Tree::Block(statements, _) => {
311+
let old_namespace = state.namespace.clone();
311312
for statement in statements {
312313
analyze(Box::new(statement.clone()), state)?;
313314
}
315+
state.namespace = old_namespace;
314316
Ok(())
315317
}
316318
Tree::LValueIdentifier(name) => analyze(name, state),
@@ -445,11 +447,11 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
445447
Ok(())
446448
}
447449
Tree::For(initializer, condition, updater, expression, _) => {
450+
let old_namespace = state.namespace.clone();
448451
let returning_state = state.return_state.clone();
449452
if let Some(initializer_expression) = initializer {
450453
analyze(initializer_expression, state)?;
451454
}
452-
let old_namespace = state.namespace.clone();
453455
analyze(condition.clone(), state)?;
454456
if get_variable_type(condition, state)
455457
.ok_or("Variable undefined!")?
@@ -458,7 +460,12 @@ pub fn analyze(tree: Box<Tree>, state: &mut AnalysisState) -> Result<(), String>
458460
return Err("Condition must be a boolean".to_string());
459461
}
460462
if let Some(updater_expression) = updater {
463+
let names = state.namespace.iter().map(|v| v.0).len();
461464
analyze(updater_expression, state)?;
465+
let additional_names = state.namespace.iter().map(|v| v.0).len();
466+
if names != additional_names {
467+
return Err("Updater Expression cannot define variables".to_string());
468+
}
462469
}
463470
state.enter_loop();
464471
analyze(expression, state)?;

0 commit comments

Comments
 (0)