diff --git a/src/main.rs b/src/main.rs index 4b91d9c28..f7b3dc508 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,8 @@ use crate::lines::{ }; use crate::parse::{find_lang, parse, parse_lines, read_or_die, ConfigDir}; use crate::style::apply_colors; -use crate::tree_diff::{change_positions, mark_nodes}; +use crate::tree_diff::{change_positions, mark_nodes, set_next}; +use crate::ucs::{toplevel_list, mark_node}; fn term_width() -> Option { term_size::dimensions().map(|(w, _)| w) @@ -83,10 +84,13 @@ fn main() { None => (parse_lines(&arena, &lhs_src), parse_lines(&arena, &rhs_src)), }; - mark_nodes(&lhs, &rhs); + let (lhs, rhs) = toplevel_list(&arena, lhs, rhs); + set_next(lhs); + set_next(rhs); + mark_node(lhs, rhs); - let lhs_positions = change_positions(&lhs_src, &rhs_src, &lhs); - let rhs_positions = change_positions(&rhs_src, &lhs_src, &rhs); + let lhs_positions = change_positions(&lhs_src, &rhs_src, &[lhs]); + let rhs_positions = change_positions(&rhs_src, &lhs_src, &[rhs]); let mut groups = visible_groups(&lhs_positions, &rhs_positions); for group in &mut groups { diff --git a/src/ucs.rs b/src/ucs.rs index 134440971..571dd5a4e 100644 --- a/src/ucs.rs +++ b/src/ucs.rs @@ -6,6 +6,7 @@ use std::collections::{BinaryHeap, HashMap}; use std::hash::{Hash, Hasher}; use crate::tree_diff::{ChangeKind, Node}; +use typed_arena::Arena; use Edge::*; #[derive(Debug, Clone)] @@ -299,7 +300,17 @@ fn neighbours<'a>(v: &Vertex<'a>) -> Vec<(Edge, Vertex<'a>)> { res } -pub fn mark_nodes<'a>(lhs: &'a Node<'a>, rhs: &'a Node<'a>) { +pub fn toplevel_list<'a>( + arena: &'a Arena>, + lhs_children: Vec<&'a Node<'a>>, + rhs_children: Vec<&'a Node<'a>>, +) -> (&'a Node<'a>, &'a Node<'a>) { + let lhs = Node::new_list(arena, "".into(), vec![], lhs_children, "".into(), vec![]); + let rhs = Node::new_list(arena, "".into(), vec![], rhs_children, "".into(), vec![]); + (lhs, rhs) +} + +pub fn mark_node<'a>(lhs: &'a Node<'a>, rhs: &'a Node<'a>) { let start = Vertex::new(lhs, rhs); let route = find_route(start); mark_route(&route);