diff --git a/src/dijkstra.rs b/src/dijkstra.rs index 3abb0cd17..302e05f7e 100644 --- a/src/dijkstra.rs +++ b/src/dijkstra.rs @@ -177,11 +177,21 @@ fn neighbours<'a>(v: &Vertex<'a>) -> Vec<(Edge, Vertex<'a>)> { if lhs_open_delimiter == rhs_open_delimiter && lhs_close_delimiter == rhs_close_delimiter { + let lhs_next = if lhs_children.is_empty() { + lhs_node.get_next() + } else { + Some(lhs_children[0]) + }; + let rhs_next = if rhs_children.is_empty() { + rhs_node.get_next() + } else { + Some(rhs_children[0]) + }; res.push(( UnchangedDelimiter, Vertex { - lhs_node: lhs_children.first().map(|n| *n), - rhs_node: rhs_children.first().map(|n| *n), + lhs_node: lhs_next, + rhs_node: rhs_next, }, )); } @@ -429,4 +439,58 @@ mod tests { vec![StartNode, UnchangedDelimiter, NovelAtomRHS, NovelAtomRHS] ); } + + #[test] + fn atom_after_empty_list() { + let arena = Arena::new(); + + let lhs = Node::new_list( + &arena, + "[".into(), + pos_helper(0), + vec![ + Node::new_list( + &arena, + "(".into(), + pos_helper(1), + vec![], + ")".into(), + pos_helper(2), + ), + Node::new_atom(&arena, pos_helper(3), "foo", AtomKind::Other), + ], + "]".into(), + pos_helper(4), + ); + set_next(lhs); + + let rhs = Node::new_list( + &arena, + "{".into(), + pos_helper(0), + vec![ + Node::new_list( + &arena, + "(".into(), + pos_helper(1), + vec![], + ")".into(), + pos_helper(2), + ), + Node::new_atom(&arena, pos_helper(3), "foo", AtomKind::Other), + ], + "}".into(), + pos_helper(4), + ); + set_next(rhs); + + let start = Vertex::new(lhs, rhs); + let route = shortest_path(start); + + let actions = route.iter().map(|(action, _)| *action).collect_vec(); + assert_eq!( + actions, + vec![StartNode, NovelDelimiterLHS, NovelDelimiterRHS, UnchangedNode, UnchangedNode], + ); + } }