diff --git a/src/cmd.js b/src/cmd.js index e7ade81..91360e5 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -374,16 +374,11 @@ const get_next_selection_state = (selection_state, frame, is_expand, index) => { } } } else { - // TODO when collapsing, also check that node is evaluatable // collapse if(selection_state.node.children != null){ - next_node = - selection_state.node.children.find(n => - n.index <= index && n.index + n.length > index - ) - ?? - // cursor not inside child but in whitespace - selection_state.node + const leaf = find_leaf(selection_state.node, index) + next_node = ancestry_inc(leaf, selection_state.node) + .findLast(n => !n.not_evaluatable && n != selection_state.node) } else { // no children, cannot collapse next_node = selection_state.node diff --git a/test/test.js b/test/test.js index d3d8116..f514bdd 100644 --- a/test/test.js +++ b/test/test.js @@ -2130,6 +2130,17 @@ const y = x()` } ) }), + + test('eval_selection bug', () => { + const code = `{foo: 1}` + const i = test_initial_state(code) + const index = code.indexOf('1') + const moved = COMMANDS.move_cursor(i, index) + const selection = COMMANDS.eval_selection(moved, index, true).state + const selection2 = COMMANDS.eval_selection(selection, index, true).state + const selection3 = COMMANDS.eval_selection(selection2, index, false).state + assert_equal(selection3.selection_state.node.value, '1') + }), test('find_call', () => { const code = `