use std::collections::{hash_map::Keys, HashMap};
use regex::Regex;
use tree_sitter::{Language, Parser, Query, Tree};
#[macro_use]
extern crate log;
pub mod builder;
mod capture;
mod util;
#[cfg(feature = "python")]
pub mod python;
pub mod query;
pub mod result;
extern "C" {
fn tree_sitter_c() -> Language;
fn tree_sitter_cpp() -> Language;
}
pub fn parse(source: &str, cpp: bool) -> Tree {
let language = if !cpp {
unsafe { tree_sitter_c() }
} else {
unsafe { tree_sitter_cpp() }
};
let mut parser = Parser::new();
if let Err(e) = parser.set_language(language) {
eprintln!("{}", e);
panic!();
}
parser.parse(source, None).unwrap()
}
fn ts_query(sexpr: &str, cpp: bool) -> tree_sitter::Query {
let language = if !cpp {
unsafe { tree_sitter_c() }
} else {
unsafe { tree_sitter_cpp() }
};
match Query::new(language, sexpr) {
Ok(q) => q,
Err(e) => {
eprintln!(
"Tree sitter query generation failed: {:?}\n {}",
e.kind, e.message
);
eprintln!("sexpr: {}", sexpr);
eprintln!("This is a bug! Can't recover :/");
std::process::exit(1);
}
}
}
#[derive(Clone)]
pub struct RegexMap(HashMap<String, (bool, Regex)>);
impl RegexMap {
pub fn new(m: HashMap<String, (bool, Regex)>) -> RegexMap {
RegexMap(m)
}
pub fn variables(&self) -> Keys<String, (bool, Regex)> {
self.0.keys()
}
pub fn get(&self, variable: &str) -> Option<(bool, Regex)> {
if let Some((b, r)) = self.0.get(variable) {
Some((*b, r.to_owned()))
} else {
None
}
}
}