use std::path::Path;
use anyhow::Result;
use tree_sitter::{Node, Tree};
use crate::editor::{Edit, EditIterator, Editor};
pub trait LanguageEditor: Send + Sync {
fn collect_errors(&self, tree: &Tree, _content: &str) -> Vec<usize> {
collect_errors(tree)
.into_iter()
.map(|node| node.start_position().row)
.collect()
}
fn format_code(&self, source: &str, file_path: &Path) -> Result<String> {
let _ = file_path;
Ok(source.to_string())
}
fn build_edits<'language, 'editor>(
&self,
editor: &'editor Editor<'language>,
) -> Result<Vec<Edit<'editor, 'language>>, String> {
EditIterator::new(editor).find_edits()
}
}
fn collect_errors<'tree>(tree: &'tree Tree) -> Vec<Node<'tree>> {
let mut errors = vec![];
collect_errors_recursive(tree.root_node(), &mut errors);
errors
}
fn collect_errors_recursive<'tree>(node: Node<'tree>, errors: &mut Vec<Node<'tree>>) {
if node.is_error() || node.is_missing() {
errors.push(node);
}
for child in node.children(&mut node.walk()) {
collect_errors_recursive(child, errors);
}
}