This commit is contained in:
Dmitry Vasilev
2024-01-25 20:00:11 +08:00
parent c048111db1
commit f4e531d24c
2 changed files with 22 additions and 6 deletions

View File

@@ -1027,12 +1027,18 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => {
]
})
)
// Currently assignment_count is always zero or one, because we do not allow
// destructuring assignment of let vars like `({foo, bar} = something)`
const assignment_count = name_nodes.filter(n => {
const value = next_eval_cxt.scope[symbol_for_identifier(n, frame_cxt)]
return value instanceof LetMultiversion
}).length
const next_version_number = is_assignment
? next_eval_cxt.version_number + assignment_count
: next_eval_cxt.version_number
// TODO fine-grained destructuring error, only for identifiers that failed
// destructuring
const name_node_with_result = map_tree(
@@ -1048,12 +1054,12 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => {
} else {
let value = next_scope[symbol_for_identifier(node, frame_cxt)]
if(value instanceof LetMultiversion) {
value = value.get_version(next_eval_cxt.version_number)
value = value.get_version(next_version_number)
}
result = {
ok,
value,
version_number: next_eval_cxt.version_number,
version_number: next_version_number,
}
}
return {...node, result}
@@ -1088,9 +1094,7 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => {
eval_cxt: {
...next_eval_cxt,
scope: {...next_eval_cxt.scope, ...next_scope},
version_number: is_assignment
? next_eval_cxt.version_number + assignment_count
: next_eval_cxt.version_number,
version_number: next_version_number,
}
}
}

View File

@@ -4320,6 +4320,18 @@ const y = x()`
)
}),
test('let_versions assign to let variable', () => {
const code = `
let result = 0
function unused() {
result = 2
}
result = 1
`
const i = test_initial_state(code, code.indexOf('result = 1'))
assert_value_explorer(i, 1)
}),
test('let_versions', () => {
const code = `
let x