use tree_sitter::Language;
#[macro_export]
macro_rules! configure_parsers {
($parser_list_name: ident,
$($extension: expr => {
language: $language: path,
ast_root: $root: ident
}),*) => {
pub static $parser_list_name: std::sync::LazyLock<std::collections::HashMap<&str, $crate::core::parsers::Parsers>> =
std::sync::LazyLock::new(|| {
let mut map = std::collections::HashMap::new();
$(
let data = $crate::configure::parsers::create_parser($language);
map.insert(
$extension,
$crate::core::parsers::Parsers {
parser: data.0,
language: data.1,
ast_parser: |
db: &dyn ::auto_lsp::salsa::Database,
document: &$crate::core::document::Document | {
let mut builder = $crate::core::ast::Builder::default();
let root = $root::try_from((&document.tree.root_node(), db, &mut builder, 0, None))
.map_err(|e| $crate::core::errors::ParseError::from(e))?;
let mut nodes = builder.take_nodes();
nodes.push(std::sync::Arc::new(root));
Ok(nodes)
}
}
);
),*
map
});
};
}
#[doc(hidden)]
pub fn create_parser(
language: tree_sitter_language::LanguageFn,
) -> (parking_lot::RwLock<tree_sitter::Parser>, Language) {
let mut parser = tree_sitter::Parser::new();
parser.set_language(&language.into()).unwrap();
let language = tree_sitter::Language::new(language);
(parking_lot::RwLock::new(parser), language)
}