use std::cell::RefCell;
use tree_sitter::{Language, Parser, Tree};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum ParserKind {
Rust,
Python,
Javascript,
Typescript,
Tsx,
Go,
Java,
C,
Cpp,
Ruby,
Php,
Scala,
Csharp,
Kotlin,
Swift,
}
macro_rules! ts_parser_thread_locals {
($($name:ident => $lang_expr:expr),* $(,)?) => {
$(
thread_local! {
static $name: RefCell<Parser> = RefCell::new({
let mut p = Parser::new();
let lang: Language = $lang_expr.into();
p.set_language(&lang).expect("tree-sitter grammar load");
p
});
}
)*
};
}
ts_parser_thread_locals! {
PARSER_RUST => tree_sitter_rust::LANGUAGE,
PARSER_PYTHON => tree_sitter_python::LANGUAGE,
PARSER_JAVASCRIPT => tree_sitter_javascript::LANGUAGE,
PARSER_TYPESCRIPT => tree_sitter_typescript::LANGUAGE_TYPESCRIPT,
PARSER_TSX => tree_sitter_typescript::LANGUAGE_TSX,
PARSER_GO => tree_sitter_go::LANGUAGE,
PARSER_JAVA => tree_sitter_java::LANGUAGE,
PARSER_C => tree_sitter_c::LANGUAGE,
PARSER_CPP => tree_sitter_cpp::LANGUAGE,
PARSER_RUBY => tree_sitter_ruby::LANGUAGE,
PARSER_PHP => tree_sitter_php::LANGUAGE_PHP,
PARSER_SCALA => tree_sitter_scala::LANGUAGE,
PARSER_CSHARP => tree_sitter_c_sharp::LANGUAGE,
PARSER_KOTLIN => tree_sitter_kotlin_ng::LANGUAGE,
PARSER_SWIFT => tree_sitter_swift::LANGUAGE,
}
pub(super) fn parse_with_cached(kind: ParserKind, src: &[u8]) -> Option<Tree> {
match kind {
ParserKind::Rust => PARSER_RUST.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Python => PARSER_PYTHON.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Javascript => PARSER_JAVASCRIPT.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Typescript => PARSER_TYPESCRIPT.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Tsx => PARSER_TSX.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Go => PARSER_GO.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Java => PARSER_JAVA.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::C => PARSER_C.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Cpp => PARSER_CPP.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Ruby => PARSER_RUBY.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Php => PARSER_PHP.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Scala => PARSER_SCALA.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Csharp => PARSER_CSHARP.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Kotlin => PARSER_KOTLIN.with(|p| p.borrow_mut().parse(src, None)),
ParserKind::Swift => PARSER_SWIFT.with(|p| p.borrow_mut().parse(src, None)),
}
}