#![allow(clippy::print_stderr)]
fn report_skip(reason: &str) {
let thread = std::thread::current();
let test = thread.name().unwrap_or("<unnamed test>");
eprintln!("SKIPPED {test}: {reason}");
}
pub(super) fn language_or_skip(name: &str) -> Option<tree_sitter::Language> {
let registry = crate::LanguageRegistry::new();
match registry.get_language(name) {
Ok(language) => Some(language),
Err(error) => {
report_skip(&format!("grammar '{name}' is not available: {error}"));
None
}
}
}
pub(super) fn parse_or_skip(source: &str, language: &str) -> Option<tree_sitter::Tree> {
let (_, tree) = parse_with_language_or_skip(source, language)?;
Some(tree)
}
pub(super) fn parse_with_language_or_skip(
source: &str,
language: &str,
) -> Option<(tree_sitter::Language, tree_sitter::Tree)> {
let loaded = language_or_skip(language)?;
let mut parser = tree_sitter::Parser::new();
if let Err(error) = parser.set_language(&loaded) {
report_skip(&format!("grammar '{language}' has an incompatible ABI: {error}"));
return None;
}
match parser.parse(source, None) {
Some(tree) => Some((loaded, tree)),
None => {
report_skip(&format!("grammar '{language}' returned no tree"));
None
}
}
}