Allow variable to overwrite constant when shadowing.
This commit is contained in:
parent
78b5c9fd4e
commit
67a6638818
@ -2663,13 +2663,10 @@ fn parse_let(
|
|||||||
AST_OPTION_NONE
|
AST_OPTION_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
let existing = state.stack.get_index(&name).and_then(|(n, a)| {
|
let existing = state.stack.get_index(&name).and_then(|(n, ..)| {
|
||||||
if n < state.block_stack_len {
|
if n < state.block_stack_len {
|
||||||
// Defined in parent block
|
// Defined in parent block
|
||||||
None
|
None
|
||||||
} else if a == AccessMode::ReadOnly && access != AccessMode::ReadOnly {
|
|
||||||
// Overwrite constant
|
|
||||||
None
|
|
||||||
} else {
|
} else {
|
||||||
Some(n)
|
Some(n)
|
||||||
}
|
}
|
||||||
|
@ -32,14 +32,27 @@ fn test_var_scope() -> Result<(), Box<EvalAltResult>> {
|
|||||||
assert_eq!(scope.get_value::<INT>("x").unwrap(), 123);
|
assert_eq!(scope.get_value::<INT>("x").unwrap(), 123);
|
||||||
assert_eq!(scope.get_value::<INT>("y").unwrap(), 999);
|
assert_eq!(scope.get_value::<INT>("y").unwrap(), 999);
|
||||||
|
|
||||||
|
scope.clear();
|
||||||
|
engine.run_with_scope(
|
||||||
|
&mut scope,
|
||||||
|
"const x = 3; let y = 0; let x = 42; let y = 999;",
|
||||||
|
)?;
|
||||||
|
assert_eq!(scope.len(), 2);
|
||||||
|
assert_eq!(scope.get_value::<INT>("x").unwrap(), 42);
|
||||||
|
assert_eq!(scope.get_value::<INT>("y").unwrap(), 999);
|
||||||
|
assert!(!scope.is_constant("x").unwrap());
|
||||||
|
assert!(!scope.is_constant("y").unwrap());
|
||||||
|
|
||||||
scope.clear();
|
scope.clear();
|
||||||
engine.run_with_scope(
|
engine.run_with_scope(
|
||||||
&mut scope,
|
&mut scope,
|
||||||
"const x = 3; let y = 0; let x = 42; let y = 999; const x = 123;",
|
"const x = 3; let y = 0; let x = 42; let y = 999; const x = 123;",
|
||||||
)?;
|
)?;
|
||||||
assert_eq!(scope.len(), 3);
|
assert_eq!(scope.len(), 2);
|
||||||
assert_eq!(scope.get_value::<INT>("x").unwrap(), 123);
|
assert_eq!(scope.get_value::<INT>("x").unwrap(), 123);
|
||||||
assert_eq!(scope.get_value::<INT>("y").unwrap(), 999);
|
assert_eq!(scope.get_value::<INT>("y").unwrap(), 999);
|
||||||
|
assert!(scope.is_constant("x").unwrap());
|
||||||
|
assert!(!scope.is_constant("y").unwrap());
|
||||||
|
|
||||||
scope.clear();
|
scope.clear();
|
||||||
engine.run_with_scope(
|
engine.run_with_scope(
|
||||||
|
Loading…
Reference in New Issue
Block a user