in src/output/dump.rs [64:158]
fn dump_tree_helper(
code: &[u8],
node: &Node,
prefix: &str,
last: bool,
stdout: &mut StandardStreamLock,
depth: i32,
line_start: &Option<usize>,
line_end: &Option<usize>,
) -> std::io::Result<()> {
if depth == 0 {
return Ok(());
}
let (pref_child, pref) = if node.parent().is_none() {
("", "")
} else if last {
(" ", "╰─ ")
} else {
("│ ", "├─ ")
};
let node_row = node.start_row() + 1;
let mut display = true;
if let Some(line_start) = line_start {
display = node_row >= *line_start
}
if let Some(line_end) = line_end {
display = display && node_row <= *line_end
}
if display {
color(stdout, Color::Blue)?;
write!(stdout, "{prefix}{pref}")?;
intense_color(stdout, Color::Yellow)?;
write!(stdout, "{{{}:{}}} ", node.kind(), node.kind_id())?;
color(stdout, Color::White)?;
write!(stdout, "from ")?;
color(stdout, Color::Green)?;
let (pos_row, pos_column) = node.start_position();
write!(stdout, "({}, {}) ", pos_row + 1, pos_column + 1)?;
color(stdout, Color::White)?;
write!(stdout, "to ")?;
color(stdout, Color::Green)?;
let (pos_row, pos_column) = node.end_position();
write!(stdout, "({}, {}) ", pos_row + 1, pos_column + 1)?;
if node.start_row() == node.end_row() {
color(stdout, Color::White)?;
write!(stdout, ": ")?;
intense_color(stdout, Color::Red)?;
let code = &code[node.start_byte()..node.end_byte()];
if let Ok(code) = String::from_utf8(code.to_vec()) {
write!(stdout, "{code} ")?;
} else {
stdout.write_all(code).unwrap();
}
}
writeln!(stdout)?;
}
let count = node.child_count();
if count != 0 {
let prefix = format!("{prefix}{pref_child}");
let mut i = count;
let mut cursor = node.cursor();
cursor.goto_first_child();
loop {
i -= 1;
dump_tree_helper(
code,
&cursor.node(),
&prefix,
i == 0,
stdout,
depth - 1,
line_start,
line_end,
)?;
if !cursor.goto_next_sibling() {
break;
}
}
}
Ok(())
}