use tree_sitter::{Language, Parser};
pub fn get_language(lang: &str) -> Option<Language> {
tree_sitter_language_pack::get_language(lang).ok()
}
pub fn get_parser(lang: &str) -> Option<Parser> {
let language = get_language(lang)?;
let mut parser = Parser::new();
parser.set_language(&language).ok()?;
Some(parser)
}
#[allow(dead_code)]
fn leak_str(s: &str) -> &'static str {
Box::leak(s.to_string().into_boxed_str())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_language_rust() {
let lang = get_language("rust");
assert!(lang.is_some());
}
#[test]
fn get_language_unknown() {
let lang = get_language("unknown_language");
assert!(lang.is_none());
}
#[test]
fn get_parser_rust() {
let parser = get_parser("rust");
assert!(parser.is_some());
}
#[test]
fn parser_can_parse() {
let mut parser = get_parser("rust").expect("rust parser");
let source = "fn main() {}";
let tree = parser.parse(source, None);
assert!(tree.is_some());
}
#[test]
fn parser_caching() {
let p1 = get_parser("python");
let p2 = get_parser("python");
assert!(p1.is_some());
assert!(p2.is_some());
}
}